linux内存分配与回收及swap使用观察

1) 系统刚刚启动的时候free会比较大

linux内存分配与回收及swap使用观察

2) 运行一段时间之后,free会减小到很少,cache会增加到尽量大。

这会因为系统为了加速文件读写速度,减少磁盘使用次数尽量多的使用内存cache硬盘上的数据。虽然free比较少了,但是有新的内存请求的时候可以立即从cache里面回收物理内存,所以系统显示的可用内存变化不大(461M-465M)。
linux内存分配与回收及swap使用观察

3)下面这个例子我用dd程序写一个1G的文件到硬盘,运行过程中需要申请大量内存。

当有程序运行过程中需要内存大于free的时候,根据swappiness的设置按照一定比例,回收cache页面和anon页面来满足新的内存分配需求。cache会减小,swap used会增加,used 会增加。
当程序运行结束的时候会重新释放内存,可以看到free增加列很多,cache暂时变化不大,因为没有新的磁盘读写。Swap used会减小,但还是大于系统刚启动的时候,这是因为有一部分数据暂时不被应用程序使用到,也没有释放,就继续留在swap中。随着系统运行时间的增长swap中这种数据可能会慢慢积累到一个比较大的数字。比如我们看到的gdm和mysqld程序长时间运行会在swap中占用很大空间。
linux内存分配与回收及swap使用观察

4) 这个例子我接着刚才的状态,

用vim程序打开1g的文件,运行过程中会有数据从硬盘读进来,放在cache中,可以看到cache在增长,free在减小。Swap used变化不大。这个现象类似我们分析过的mysql server运行很长时间后,cache和swap used 都很大的情况下。它们两个是分别由于不同的事件引起的。
linux内存分配与回收及swap使用观察

5) mysql内存利用率分析,为何swap和cache都高

5.1)top 里面打开swap field可以看到每个进程的swap使用情况

grep VmSwap /proc/*/status | sort -k 2 -nr | head 也可以
swap分区(6757MB used)主要被这几个进程使用:
31037/status:VmSwap: 2586484 kB-----> gnome-shell 2586MB
38697/status:VmSwap: 2062276 kB------>mysqld 2062MB
46132/status:VmSwap: 1037228 kB------>mysqld 1037MB
56692/status:VmSwap: 370964 kB------>java 370MB

swap 使用情况分析方法

swap used 增加是由于匿名页面回收导致的。
匿名页面:包括进程的heap,stack,全局数据以及mmap private匿名页面,可以从top里面看到每个进程使用的swap
共享内存:tempfs里面的内容回收时也会占用swap,df -Th可以看到每个tempfs used的大小, 当ipc和mmap shared比较少,tempfs used减去free中的shared中的部分,余下的会占用swap。

5.2)

free -m中的cache 28G主要由以下几个部分组成:
cat /proc/meminfo里面找到以下信息
Active(file): 10832768 kB —>10G
Inactive(file): 10801516 kB —>10G
Shmem: 3513784 kB —>3.5G
SReclaimable: 4699044 kB —>4.6G

所有进程占用的file cache都不算高,所以cache主要是kernel自己占用的。
grep RssFile /proc/*/status | sort -k 2 -nr | head 用这个命令找到进程占用cache最大的几个
31037/status:RssFile: 15880 kB
38697/status:RssFile: 8880 kB
46132/status:RssFile: 9836 kB

cache中的内存包括分析方法

file based:进程的file based(可执行文件,库文件)和 kernel分配的pagecache
shmem:tempfs 驻留内存的部分,进程中mmap shared页面(grep RssShmem /proc/*/status),ipc(ipcs查看)
SReclaimable: kernel中slab占用的内存,用于ino,dentry等(slabtop 查看)

tempfs中的used(df -Th查看)包括

swap used中一部分, free命令的shared中一部分

6) swapoff的条件满足一下之一

1)free大于swap used
2)free + active file + inactive file 足够大
3)free 命令中 free + cached - shared -SReclaimable 足够大

7) 细节参考 http://linuxperf.com/?p=142 /proc/meminfo之谜