我有一台 ubuntu 10.04 和 512Mb RAM 的 vps 机器。我试图猜测运行 mongodb 守护进程后有多少内存可用。
如果我跑步free -m
我会得到
total used free shared buffers cached
Mem: 496 489 6 0 4 452
-/+ buffers/cache: 33 462
Swap: 511 4 507
如果我跑步ps euf
我会得到
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 948 0.0 0.0 5928 472 tty6 Ss+ Aug25 0:00 /sbin/getty 384
root 947 0.0 0.0 5928 472 tty5 Ss+ Aug25 0:00 /sbin/getty 384
root 946 0.0 0.0 5928 472 tty4 Ss+ Aug25 0:00 /sbin/getty 384
root 945 0.0 0.0 5928 472 tty3 Ss+ Aug25 0:00 /sbin/getty 384
root 944 0.0 0.0 5928 472 tty2 Ss+ Aug25 0:00 /sbin/getty 384
root 943 0.0 0.1 51856 536 hvc0 Ss Aug25 0:00 /bin/login --
root 978 0.0 0.4 20580 2424 hvc0 S Aug25 0:01 \_ -bash TERM=
root 7593 0.0 0.1 10332 524 hvc0 T Aug25 0:00 \_ nano he
root 12576 0.7 3.1 122520 16220 hvc0 Sl 07:42 0:12 \_ ./mongo
root 12599 0.0 0.2 16300 1060 hvc0 R+ 08:09 0:00 \_ ps euf
所以看起来进程使用的内存不到 5%,但我只有 6Mb 的可用内存...为什么?
答案1
缓冲区和高速缓存的大小是动态调整的。如果进程需要更多空间,则从缓冲区和高速缓存中获取。
关键是看第二行(“-/+ buffers/cache”)。
Mem: 496 489 6 0 4 452
-/+ buffers/cache: 33 462
请注意,第二行中的空闲 (462) 是 6(空闲)、4(缓冲区)和 452(缓存)的总和。这是实际的可用空间量。如果这个值太低,那么系统将开始将内存中的进程交换到交换空间。
所以实际上,您正在使用 33MB 内存并且有可用的462MB - 可能稍微少一点,因为您仍然需要一些 I/O 缓冲区。
答案2
除了正确的解释通过阿尔切另外,你的解释中还隐藏着另外两个误解ps euf
。
该命令
ps euf
不会列出所有进程 - 您应该使用ps axeuf
它。如您所见,给出了每个进程的已用内存百分比,四舍五入为
0.1%
。因此,将它们相加会给出错误的结果 - (大致)所有进程都使用一些内存——即使它还少0.1%
。例如,如果有 20 个进程使用0.05%
,那么它们加起来就是1%
,而不是0%
。