web-dev-qa-db-ja.com

`top`の読み方。プロセスリストにはプロセスにスワップがあると記載されていますが、概要にはスワップが使用されていないと記載されています

topを使用してサーバーを監視しています。スワップ行の読み取り

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

Opを押してスワップで並べ替えました。

  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     

私はこれをどのように読むべきか疑問に思いました。これはこれらのプロセスで利用可能なスワップですか?
今朝一番上に表示されたmysqldは1.1GBのスワップを使用していて、私のスワップの30%が使い果たされていました。マシンにさらにRAMを投入した後、mysqld886mになり、topはスワップの使用量が0であると言います(数学は理にかなっているようです)。だから私はスワップ列が何を表示しているのか疑問に思っていますか?スワップの概要にスワップ列の合計が反映されないのはなぜですか?ありがとうございました。

4
dm03514

これは、仮想メモリから物理メモリを差し引くことによって計算されます。

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.
4
quanta

一番上の計算が間違っていると思います。次のプログラムを作成し、実行中のソフトウェアなしでサーバーで起動しました。

#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

Meminfo

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

簡単に言うと、topは1GBのスワップを使用していると言っていますが、前の出力からはスワップスペースが占有されていないため、メモリのどの部分もバッキングストレージにスワップアウトされていません。

(VIRT-RES)の残りの部分は、仮想的に触れられることはありません

2
c4f4t0r