为什么“top”中的内存使用量没有累加?

为什么“top”中的内存使用量没有累加?

我注意到有时候我跑步的时候顶部,进程表中各个进程的内存使用量加起来好像不等于总数。

例如,在下面的转储中,top 显示我使用了 16 Gb 内存。但是,进程表仅显示两个进程使用了​​略多于 520 Mb 的内存。我如何才能找出消耗了其他 15.5 Gb 的进程?(我使用的是 CentOS。)

$ 顶部

顶部 - 12:16:34 启动 45 天,2:28,3 个用户,平均负载:0.24、0.65、0.71
任务:总计 274 个,其中 1 个正在运行,273 个正在休眠,0 个已停止,0 个僵尸
CPU:2.3%us,0.2%sy,0.0%ni,97.5%id,0.0%wa,0.0%hi,0.0%si,0.0%st
内存:总计 16432032k,已用 16340144k,可用 91888k,缓冲区 21736k
交换:总计 18481144k,已使用 1112k,可用 18480032k,缓存 15624488k

  PID 用户 PR NI VIRT RES SHR S %CPU %MEM TIME+ 命令
18159 jsmith 15 0 260m 31m 4560 S 16.6 0.2 53:35.64 python
 4795 26 15 0 260m 6608 4220 S 2.0 0.0 0:00.06 邮政局长
    1 根 15 0 10344 680 568 S 0.0 0.0 0:39.36 初始化
    2 根 RT -5 0 0 0 S 0.0 0.0 0:00.53 迁移/0
    3 根 34 19 0 0 0 S 0.0 0.0 0:00.62 ksoftirqd/0
    4 根 RT -5 0 0 0 S 0.0 0.0 0:00.00 看门狗/0
    5 根 RT -5 0 0 0 S 0.0 0.0 0:02.09 迁移/1
    6 根 34 19 0 0 0 S 0.0 0.0 0:01.32 ksoftirqd/1
    7 根 RT -5 0 0 0 S 0.0 0.0 0:00.00 看门狗/1
    8 根 RT -5 0 0 0 S 0.0 0.0 0:00.99 迁移/2
    9 根 34 19 0 0 0 S 0.0 0.0 0:01.74 ksoftirqd/2
   10 根 RT -5 0 0 0 S 0.0 0.0 0:00.00 看门狗/2
   11 根 RT -5 0 0 0 S 0.0 0.0 0:02.16 迁移/3
   12 根 34 19 0 0 0 S 0.0 0.0 0:01.30 ksoftirqd/3
   13 根 RT -5 0 0 0 S 0.0 0.0 0:00.00 看门狗/3
   14 根 RT -5 0 0 0 S 0.0 0.0 0:01.94 迁移/4
   15 根 34 19 0 0 0 S 0.0 0.0 0:01.78 ksoftirqd/4
   16 根 RT -5 0 0 0 S 0.0 0.0 0:00.00 看门狗/4
   17 根 RT -5 0 0 0 S 0.0 0.0 0:01.92 迁移/5
   18 根 34 19 0 0 0 S 0.0 0.0 0:01.30 ksoftirqd/5
   19 根 RT -5 0 0 0 S 0.0 0.0 0:00.00 看门狗/5
   20 根 RT -5 0 0 0 S 0.0 0.0 0:02.06 迁移/6
   21 根 34 19 0 0 0 S 0.0 0.0 0:01.83 ksoftirqd/6
   22 根 RT -5 0 0 0 S 0.0 0.0 0:00.00 看门狗/6
   23 根 RT -5 0 0 0 S 0.0 0.0 0:02.31 迁移/7
   24 根 34 19 0 0 0 S 0.0 0.0 0:01.50 ksoftirqd/7
   25 根 RT -5 0 0 0 S 0.0 0.0 0:00.00 看门狗/7
   26 根 10 -5 0 0 0 S 0.0 0.0 0:00.42 事件/0
   27 根 10 -5 0 0 0 S 0.0 0.0 0:00.28 事件/1
   28 根 10 -5 0 0 0 S 0.0 0.0 0:00.37 事件/2
   29 根 10 -5 0 0 0 S 0.0 0.0 0:00.21 事件/3
   30 根 10 -5 0 0 0 S 0.0 0.0 0:00.38 事件/4
   31 根 10 -5 0 0 0 S 0.0 0.0 0:00.27 事件/5
   32 根 10 -5 0 0 0 S 0.0 0.0 0:00.52 事件/6
   33 根 10 -5 0 0 0 S 0.0 0.0 0:00.64 事件/7
   34 根 10 -5 0 0 0 S 0.0 0.0 0:00.00 khelper

答案1

从顶部的内存使用相关行:

Mem: 16432032k total, 16340144k used, 91888k free, 21736k buffers
Swap: 18481144k total, 1112k used, 18480032k free, 15624488k cached

让我们忽略交换。总内存等于已用内存和可用内存的总和。另一方面,已用内存是“应用程序实际使用内存”以及缓存和缓冲区的总和。因此,对于您的情况,如下所示:

  • 内存 = 16432032k = 16340144k + 91888k;
  • “应用程序真正使用”=已使用-(缓存+缓冲区)= 16340144k-(15624488k+21736k)= 693920k。

其余 15.5 GB 被缓存。这提高了性能。但是,当应用程序需要部分缓存内存时,它会立即分配给它。如果您运行一些占用大量内存的应用程序并进行监控,您会注意到这一点top

答案2

在我看来,该列表不像是274 total进程。Top 通常只显示适合您的终端/屏幕的内容。请使用ps aux并添加rss值(或您的版本显示的任何常驻内存列)。

您也不想把虚拟内存大小加起来,看来您实际上对常驻(RES)列感兴趣。

相关内容