天天看点

Linux中进程内存RSS与cgroup内存的RSS统计 - 差异

转载一篇关于进程内存计算和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>

继续阅读