转载一篇关于进程内存计算和cgroup内存计算差异的文章
<a href="http://hustcat.github.io/memory-usage-in-process-and-cgroup/">http://hustcat.github.io/memory-usage-in-process-and-cgroup/</a>
在linux内核,对于进程的内存使用与cgroup的内存使用统计有一些相同和不同的地方。
进程的内存统计
一般来说,业务进程使用的内存主要有以下几种情况:
(1)用户空间的匿名映射页(anonymous pages in user mode address spaces),比如调用malloc分配的内存,以及使用map_anonymous的mmap;当系统内存不够时,内核可以将这部分内存交换出去;
(2)用户空间的文件映射页(mapped pages in user mode address spaces),包含map file和map tmpfs;前者比如指定文件的mmap,后者比如ipc共享内存;当系统内存不够时,内核可以回收这些页,但回收之前可能需要与文件同步数据;
(3)文件缓存(page in page cache of disk file);发生在程序通过普通的read/write读写文件时,当系统内存不够时,内核可以回收这些页,但回收之前可能需要与文件同步数据;
(4)buffer pages,属于page cache;比如读取块设备文件。
其中(1)和(2)是算作进程的rss,(3)和(4)属于page cache。
与进程内存统计相关的几个文件:
rss的计算:
对应top的rss列,do_task_stat源码
即rss=file_rss + anon_rss
statm的介绍
statm统计信息相关源码见函数proc_pid_statm
top的shr=file_rss。
实际上,进程使用的共享内存,也是算到file_rss的,因为共享内存基于tmpfs。
anon_rss与file_rss的计算源码
相关代码
数据结构
rss and cache
可以看到,cache包含共享内存和file cache
mapped_file
mapped_file - # of bytes of mapped file (includes tmpfs/shmem)
从这里可以看到,共享内存会增加到inactive_anon。
inactive_file
inactive_file - # of bytes of file-backed memory on inactive lru list.文件使用的page cache(不包含共享内存)
示例程序
执行程序前后,cgroup memory.stat的值:
执行前:*
执行后:*
可以看到cgroup中,共享内存计算在cache、mapped_file、inactive_anon中。
(1)进程rss与cgroup rss的区别
进程的rss为进程使用的所有物理内存(file_rss+anon_rss),即anonymous pages+mapped apges(包含共享内存)。
cgroup rss为(anonymous and swap cache memory),不包含共享内存。
两者都不包含file cache。
(2)cgroup cache包含file cache和共享内存。
<a href="http://man7.org/linux/man-pages/man5/proc.5.html">http://man7.org/linux/man-pages/man5/proc.5.html</a>
<a href="https://www.kernel.org/doc/documentation/cgroups/memory.txt">https://www.kernel.org/doc/documentation/cgroups/memory.txt</a>