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

Sai*_*Sai 4 vps centos top memory-usage

为什么“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
Run Code Online (Sandbox Code Playgroud)

总 MEM 使用率 = 12.1%

但是,262mb 中使用了 226mb,其中 36mb 空闲 - 即使用了 86.25%。

即使考虑到交换,总内存 262mb*2 = 524mb。假设使用了 226mb,则使用了 43.12%。两者都比top列出的实际处理高得多。

该服务器是运行 CentOS 5.2 的全新 256MB VPS - 尚未在其上安装任何东西。运行网络管理员;即没有 Plesk。

这个问题基本上是关于 top 似乎给出的相互矛盾的信息;但我也想知道这种内存使用是否正常,对于没有运行任何内存密集型应用程序的服务器。我打算安装Apache/Ruby EE/Passenger;但是,如果内存使用量已经如此之高,我不确定它会如何处理它。

Dav*_*ney 6

顶部,即%MEM列中的数字,正在计算RSS内存量(驻留段大小,基本上是内存中包含真实数据的物理页面)占您机器或 VPS 中总物理内存的百分比。

另一方面,free 只计算其中没有数据且尚未分配给缓冲区、缓存或内核的物理内存页面的数量。在类 Unix 操作系统中,操作系统通过将空闲页面用于磁盘缓存来努力将这个数字保持在尽可能低的水平。只有在机器启动之后,或者退出一个本身消耗大量物理内存的程序时,才有可能获得高可用内存值的唯一时间。

这个内存使用正常吗?简短的回答是肯定的。Unix 程序通常会分配(即要求操作系统)比它们使用的内存多得多的内存。如果您查看该VSS列,对于列出的进程,总数超过 463mb。那是因为

  • 每个进程占用的大量内存将被物理映射到同一个库,例如 glibc
  • 操作系统通常会向应用程序过度分配内存,因为大多数应用程序从未根据它们的要求收集内存。

弄清楚进程内存使用情况与其说是科学,不如说是一门艺术,恕我直言,请参阅http://lwn.net上的讨论。我的建议是密切关注iostat -xm并确保您的机器没有大量交换。