![使用的物理内存如何超过进程报告的“常驻”内存的总和?](https://linux22.com/image/622353/%E4%BD%BF%E7%94%A8%E7%9A%84%E7%89%A9%E7%90%86%E5%86%85%E5%AD%98%E5%A6%82%E4%BD%95%E8%B6%85%E8%BF%87%E8%BF%9B%E7%A8%8B%E6%8A%A5%E5%91%8A%E7%9A%84%E2%80%9C%E5%B8%B8%E9%A9%BB%E2%80%9D%E5%86%85%E5%AD%98%E7%9A%84%E6%80%BB%E5%92%8C%EF%BC%9F.png)
给出如下所示的输出top
(显示全部当前活动的进程):为什么这个虚拟服务器报告已使用 ~500M 物理内存(已使用 - 缓存,已验证free
),而“RES”的总和却远低于这个数字?总和难道不应该RES
总是超过已使用的物理内存吗?内存可能用于什么用途?由什么使用?
top - 08:43:23 up 75 days, 5:00, 1 user, load average: 0.08, 0.08, 0.04
Tasks: 29 total, 1 running, 28 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.2%us, 0.1%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 2400000k total, 713792k used, 1686208k free, 0k buffers
Swap: 0k total, 0k used, 0k free, 200764k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 19232 544 384 S 0.0 0.0 0:00.08 init
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd/201208
3 root 20 0 0 0 0 S 0.0 0.0 0:00.00 khelper/2012080
323 pdns-rec 20 0 169m 2980 1152 S 0.0 0.1 1:58.98 pdns_recursor
560 root 20 0 6160 200 196 S 0.0 0.0 0:00.00 portreserve
578 dbus 20 0 21536 324 284 S 0.0 0.0 0:00.00 dbus-daemon
598 nobody 20 0 17040 2108 880 S 0.0 0.1 4:48.33 openvpn
607 nobody 20 0 16124 1112 724 S 0.0 0.0 0:41.54 openvpn
1347 root 20 0 78732 592 508 S 0.0 0.0 0:12.35 master
1355 postfix 20 0 78984 612 516 S 0.0 0.0 0:02.63 qmgr
1515 root 20 0 9232 564 396 S 0.0 0.0 0:39.69 gam_server
11077 root 16 -4 10648 272 268 S 0.0 0.0 0:00.00 udevd
12912 root 20 0 168m 57m 3040 S 0.0 2.4 0:56.31 puppetd
13187 root 20 0 11308 1224 1220 S 0.0 0.1 0:00.00 mysqld_safe
13295 mysql 20 0 1348m 44m 4232 S 0.0 1.9 246:49.61 mysqld
13391 root 20 0 66608 516 404 S 0.0 0.0 0:00.00 sshd
13411 root 20 0 20468 740 644 S 0.0 0.0 0:00.71 crond
13452 root 20 0 243m 1428 820 S 0.0 0.1 0:00.36 rsyslogd
16087 app 20 0 14896 1096 880 R 0.0 0.0 0:00.00 top
18993 newrelic 20 0 25764 124 84 S 0.0 0.0 0:00.00 nrsysmond
18994 newrelic 20 0 103m 1540 1036 S 0.0 0.1 0:46.22 nrsysmond
23268 postfix 20 0 81356 3384 2508 S 0.0 0.1 0:00.00 pickup
29550 root 20 0 387m 3516 1088 S 0.0 0.1 2:25.48 fail2ban-server
31434 root 20 0 96264 2408 2376 S 0.0 0.1 0:00.00 sshd
31438 user 20 0 96264 816 640 S 0.0 0.0 0:00.25 sshd
31439 user 20 0 105m 1264 1260 S 0.0 0.1 0:00.00 bash
31456 root 20 0 165m 1768 1764 S 0.0 0.1 0:00.00 sudo
31457 root 20 0 138m 1020 1016 S 0.0 0.0 0:00.00 su
31458 app 20 0 13440 3332 1492 S 0.0 0.1 0:00.07 bash
注意:我问的问题与人们通常问的问题正好相反。
要求cat /proc/memoinfo
:
MemTotal: 2400000 kB
MemFree: 1682660 kB
Cached: 202948 kB
Active: 132988 kB
Inactive: 180704 kB
Active(anon): 19668 kB
Inactive(anon): 91076 kB
Active(file): 113320 kB
Inactive(file): 89628 kB
Unevictable: 0 kB
Mlocked: 0 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 4 kB
Writeback: 0 kB
AnonPages: 110744 kB
Shmem: 2568 kB
Slab: 2268056 kB
SReclaimable: 2260740 kB
SUnreclaim: 7316 kB
我相信虚拟化技术是Virtuozzo。
答案1
具体与虚拟机相关,当您处于“向外看,向内看“ 相对 ”在里面,环顾四周“
为什么虚拟机报告使用了约 500 MB,但top
实际使用的 RAM 却少得多?
如果虚拟机报告使用了约 500 MB(我假设是在虚拟机管理器中),但总量RES
却低得多,这是预料之中的。
VM(无论是 VMware、Virtuozzo 容器、Hyper-V 还是 Solaris Zone)消耗的 RAM 比其进程使用的 RAM 多。实际运行 VM 所需的“开销”与该指标(虚拟设备映射、虚拟设备缓存(如网络和磁盘)、内核空间等)合并在一起
为了完整起见,我将对大多数人问的“相反”问题进行简要解释(这就是我发现这个问题的原因)
Top 的“驻留集”大小 ( RES
)“大于”物理内存
MM_ANONPAGES
驻留集大小由内核计算为“匿名”( )页面和“文件支持”( )页面的总和MM_FILEPAGES
。由于单个页面可能被多次计数(归因于多个进程),这解释了为什么从每个正在运行的进程RES
计算top
,看起来它消耗的内存比可能的要多。