使用cgroup限制驻留内存

时间:2018-06-05 23:50:04

标签: memory linux-kernel cgroups htop pmap

我有一个将一些大文件映射到内存的应用程序。作为我的应用程序基准测试的一部分,我想限制我的应用程序可用的总内存量。我的目标是了解我的应用程序在给定不同内存量的情况下的行为。

我的应用程序在堆上分配大约1.5 GB的数据,并且我有大约9.5 GB的只读内存映射数据。我试图设置一个实验来了解我的应用程序如果在只有2 GB可用内存的计算机上运行时的行为。

这是我的设置:

as root:
$ cgcreate -a user:user -t user:user -g memory:testgroup

as user:
$ echo 2G > /sys/fs/cgroup/memory/testgroup/memory.limit_in_bytes
$ echo 2G > /sys/fs/cgroup/memory/testgroup/memory.memsw.limit_in_bytes
$ cgexec -g memory:testgroup myApp

请注意,我已通过将两个限制设置为2 GB来禁用交换。当我的应用程序正在运行时,我会监视我的小组cgget -g memory:testgroup使用的内存:

memory.usage_in_bytes: 2,147,426,304
memory.memsw.limit_in_bytes: 2,147,483,648
memory.memsw.usage_in_bytes: 2,147,426,304
memory.stat: 
    cache 498,991,104
    rss 1,648,099,328
    rss_huge 1,241,513,984
    mapped_file 462,503,936
    dirty 8192
    writeback 0
    swap 0
    pgpgin 46,596,889
    pgpgout 46653193
    pgfault 8618497
    pgmajfault 666573
    inactive_anon 610,377,728
    active_anon 1,037,721,600
    inactive_file 249,147,392
    active_file 249,720,832

查看htop,它会将我的进程的内存使用量报告为

PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND    
28511 user     20   0 11.371g 3.998g 2.491g S 340.9 12.8 160:35.89 myApp

使用pmap -x pid我看到了:

00007fb6938fc000   587,872   400,700       0 rw-s- file1
00007fb6b7714000 1,469,676 1,008,848       0 rw-s- file2
00007fb71124f000 1,469,676 1,007,972       0 rw-s- file3
... more large files
total kB         16,850,732 4,184,296 1,578,372

问题:

  1. htop报告的常驻记忆与rss报告的cgget之间的差异是什么? htoppmap就常驻记忆的大小达成一致,但cgget报告了不同的内容。根据我的理解,rss + cache报告的cgget应该等于htop报告的居民记忆,但似乎并非如此。 htop报告4 GB的驻留内存,远远高于我的组2 GB的限制。
  2. 为什么htoppmap会报告不同的虚拟尺寸? (11.2 G vs 16 G)
  3. 查看pmap的输出,我只包含3个文件,最多可添加3.5 GB的虚拟内存和2.5 GB的驻留内存。 cgget报告cache 498,991,104mapped_file 462,503,936。我期望mapped_file是在进程中映射的文件的总大小(~9.5 GB)。我的误解在哪里?
  4. rss报告的cgget是当前驻留在内存中的内存映射文件的部分是否正确?

0 个答案:

没有答案