我有一个将一些大文件映射到内存的应用程序。作为我的应用程序基准测试的一部分,我想限制我的应用程序可用的总内存量。我的目标是了解我的应用程序在给定不同内存量的情况下的行为。
我的应用程序在堆上分配大约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
问题:
htop
报告的常驻记忆与rss
报告的cgget
之间的差异是什么? htop
和pmap
就常驻记忆的大小达成一致,但cgget
报告了不同的内容。根据我的理解,rss + cache
报告的cgget
应该等于htop
报告的居民记忆,但似乎并非如此。 htop
报告4 GB的驻留内存,远远高于我的组2 GB的限制。htop
和pmap
会报告不同的虚拟尺寸? (11.2 G vs 16 G)pmap
的输出,我只包含3个文件,最多可添加3.5 GB的虚拟内存和2.5 GB的驻留内存。 cgget
报告cache 498,991,104
和mapped_file 462,503,936
。我期望mapped_file
是在进程中映射的文件的总大小(~9.5 GB)。我的误解在哪里?rss
报告的cgget
是当前驻留在内存中的内存映射文件的部分是否正确?