为什么“top”表示内存使用率低,而“free”表示内存使用率高?
Mem: 262144k total, 225708k used, 36436k free, 47948k buffers
Swap: 262136k total, 40k used, 262096k free, 110704k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1652 root 15 0 79456 14m 1728 S 0.0 5.6 0:00.02 miniserv.pl
3544 root 15 0 87920 3356 2584 R 0.0 1.3 0:00.01 sshd
3707 root 16 0 86704 3104 2416 S 0.0 1.2 0:00.00 sshd
3708 sshd 15 0 61864 1452 872 S 0.0 0.6 0:00.00 sshd
3548 root 16 0 10872 1432 1116 S 0.0 0.5 0:00.00 bash
1908 root 15 0 10876 1392 1072 S 0.0 0.5 0:00.00 sh
918 root 15 0 60520 1204 664 S 0.0 0.5 0:00.07 sshd
3624 root 15 0 12584 1180 920 R 0.0 0.5 0:00.00 top
926 root 18 0 19672 1152 576 S 0.0 0.4 0:00.00 crond
1 root 15 0 10324 704 588 S 0.0 0.3 0:00.02 init
311 root 16 -4 12580 704 388 S 0.0 0.3 0:00.06 udevd
874 root 16 0 5884 592 472 S 0.0 0.2 0:00.06 syslogd
877 root 18 0 3780 420 336 S 0.0 0.2 0:00.00 klogd
总 MEM 使用率 = 12.1%
但是,262mb 中已使用了 226mb,剩余 36mb 可用,即使用了 86.25%。
即使考虑到交换,总内存为 262mb*2 = 524mb。考虑到使用了 226mb,使用了 43.12%。两者都比 top 列出的实际处理量高得多。
该服务器是一台全新的 256MB VPS,运行 CentOS 5.2 - 尚未安装任何东西。运行 webadmin;即没有 Plesk。
这个问题本质上是关于 top 似乎给出的相互矛盾的信息;但我还想知道对于没有运行任何特别占用内存的应用程序的服务器来说,这种内存使用情况是否正常。我打算安装 Apache/Ruby EE/Passenger;但是如果内存使用率已经这么高,我不确定它会如何处理。
答案1
顶部,即%MEM
列中的数字,计算的是内存量RSS
(常驻段大小,基本上是内存中物理上有实际数据的页面)占机器或 VPS 中总物理内存的百分比。
另一方面,空闲内存只是计算没有数据且未分配给缓冲区、缓存或内核的物理内存页数量。在类 Unix 操作系统中,操作系统会尽量将空闲页面用作磁盘缓存,以将该数字保持在尽可能低的水平。只有在计算机启动后,或者退出消耗大量物理内存的程序时,空闲内存才有可能达到较高的值。
这种内存使用量正常吗?简而言之,是的。Unix 程序分配(即向操作系统请求)的内存量明显超过其实际使用量,这是很常见的。如果您查看该VSS
列,就会发现列出的进程的内存总量超过 463mb。这是因为
- 每个进程占用的大量内存将被物理映射到同一个库,例如
glibc
- 操作系统通常过度承诺内存分配给应用程序,因为大多数应用程序从来不会收集它们所要求的内容。
我认为,弄清楚进程内存使用情况是一门艺术,而不是一门科学,请参阅http://lwn.net。我的建议是密切关注iostat -xm
并确保你的机器没有进行大量交换。
答案2
除了 Dave Cheney 的回答之外:
总内存使用量减去缓冲区和缓存(159M)约为 67M,67/524M 约为 12%。随着运行进程需要更多内存,系统将自动清除旧缓存并分配新缓存。
如果您自由运行,您就会了解运行进程实际使用了多少内存以及实际可用的内存量。
$ free -m
total used free shared buffers cached
Mem: 247 218 29 0 46 96
-/+ buffers/cache: 74 172
Swap: 556 0 556
您感兴趣的行是 -/+ buffers/cache
答案3
您可能会发现,这并不是您的机器上运行的所有进程 - 只是按内存使用情况排序的前 13 个进程。
如果您运行“ps”,您将看到所有正在运行的进程,在 Ubuntu 的默认安装中是 109。