如何读取“top”。进程列表显示进程有交换,但概览显示未使用交换

如何读取“top”。进程列表显示进程有交换,但概览显示未使用交换

我用它top来监控我的服务器。交换行显示

Swap: 1044220k total, 0k used, 1044220k free, 148544k cached

我已O p按交换排序。

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  SWAP COMMAND 
  703 mysql     20   0  930m  43m 7092 S    0  8.9   0:00.66 886m mysqld                                                         
 1555 www-data  20   0  346m 9792 3208 S    0  2.0   0:00.00 337m apache2                                                        
 1559 www-data  20   0  347m  10m 3712 S    0  2.2   0:00.01 336m apache2                                                        
 1567 www-data  20   0  345m 9448 2552 S    0  1.9   0:00.01 336m apache2                                                        
 1557 www-data  20   0  345m 9452 2556 S    0  1.9   0:00.01 336m apache2                                                        
 1562 www-data  20   0  345m 9508 2344 S    0  1.9   0:00.01 336m apache2                                                        
 1566 www-data  20   0  345m 9684 2684 S    0  1.9   0:00.02 335m apache2     

我在想我应该怎么读这个。这些进程可用的交换空间是这样的吗?
今天早上 top 显示 mysqld 使用了 1.1 gb 的交换空间,我的交换空间已经用完了 30%。在给机器增加更多内存后mysqld886mtop 显示交换空间使用率为 0(这个计算似乎有道理)。所以我只是想知道交换列显示的是什么?为什么交换概览不反映交换列的总和?谢谢。

答案1

计算方法是从虚拟内存中减去物理内存:

SWAP = VIRT - RES

man top更多细节:

   o: VIRT  --  Virtual Image (kb)
      The  total amount of virtual memory used by the task.  It includes all code, data and shared libraries
      plus pages that have been swapped out and pages that have been mapped but not used.

   p: SWAP  --  Swapped size (kb)
      Memory that is not resident but is present in a task.  This is memory that has been  swapped  out  but
      could  include additional non-resident memory.  This column is calculated by subtracting physical mem‐
      ory from virtual memory.

   q: RES  --  Resident size (kb)
      The non-swapped physical memory a task has used.

答案2

我认为上面的计算是错误的,我创建了以下程序,并且在没有任何运行软件的情况下在服务器中启动

#include <stdio.h>
#include <stdlib.h>


#define ALLOC_SIZE(e)( e * 1024 )

int main(){
       char *p = malloc(ALLOC_SIZE(1024 * 1024));
       sleep(190);
}

gcc -o kk kk.c

./kk &
[1] 9880

top -p 9880
Swap: 31457272k total,        0k used, 31457272k free,   392892k cached

PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  SWAP COMMAND
9880 root      16   0 1027m  352  284 S  0.0  0.0   0:00.00 1.0g kk

自由输出

free -m
           total       used       free     shared    buffers     cached
Mem:        128966        715     128250          0         87        383
-/+ buffers/cache:        244     128721
Swap:        30719          0      30719

万明信息

grep -i swap /proc/meminfo
SwapCached:          0 kB
SwapTotal:    31457272 kB
SwapFree:     31457272 kB

简而言之,top 说我使用了 1GB 的交换空间,但是从之前的输出来看,我并没有占用任何交换空间,因此我没有任何内存部分被交换到后备存储。

其余部分 (VIRT - RES) 是虚拟的,从未触及

相关内容