为什么“top”表示内存使用率低,而“free”表示内存使用率高?

为什么“top”表示内存使用率低,而“free”表示内存使用率高?

为什么“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。

相关内容