第2章 - システムリソース管理

| |

top (2-3)

top(1) は総合的なリソースと処理状況がリアルタイムで確認するツール。 uptime(1)、free(1)、ps(1) 等の出力を随時表示。

表示項目は、f コマンドで定義可能。 詳細(↓)
項目名解説
PID(A)プロセスID Process Id
PPID(b)親PID Parenet Process ID
RUSER(c)実ユーザ名 Real User name
起動時のユーザ。SUIDがある場合、USERと異なる場合がある。
UID(d)ユーザID User ID
USER(E)ユーザ名 User Name
GROUP(f)グループ名 Group Name
TTY(g)制御端末 Controlling TTY
PR(H)優先度 Priority
NI(I)ナイス値 Nice value
P(j)直近使用CPU-ID Last used cpu(SMPのみ)
一般に同じプロセスは同一CPUで処理される方が効率がよい。
%CPU(K)CPU使用率 CPU Usage
TIME(l)CPU使用時間 CPU Time
TIME+(M)CPU使用時間 CPU Time (1/100単位)
%MEM(N)メモリ使用率 Memory Usage
VIRT(O)使用仮想メモリ容量 Virtual Image size (KB)
SWAP(p)スワップ量 Swapped size (KB)
VIRT = SWAP + RES
RES(Q)常駐メモリ容量 Resident size(KB)
RES = CODE + DATA
CODE(r)コード容量 Code size(KB)
DATA(s)データ容量 Data + Stack size(KB)
SHR(T)使用共有メモリ容量 Shared Memory size(KB)
nFLT(u)ページフォルト回数 Page Fault count
メモリ上にないページ参照、Swap In が開始される。
nDRT(v)ダーティページ数 Dirty Pages count
メモリ上のページで更新されたがディスクに吐き出されていない状態のもの。
S(W)プロセス状況 Process Status
D: uninterruptible sleep, R: running, S: sleeping, T: toraced or stopped, Z: zombie
COMMAND(X)コマンドライン Command name/line
WCHAN(y)休眠状態 Sleeping in Function
Flags(z)タスクフラグ Task Flags(sched.h)
*(a-z)は f コマンド後のフラグ表示トグル。大文字はデフォルトで表示を表す。

vmstat (2-5)

vmstat(1)はプロセス稼働状況、リソース使用量を随時表示し継続的な監視を行う。
例) startx を起動した直後

procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id  wa st
 0  0  25252  47164   3140  36528    0    0     0     0 1003   24  0  0 100  0  0
 0  0  25252  47164   3140  36528    0    0     0     0  999   22  0  0 100  0  0
 0  0  25252  47164   3148  36528    0    0     0     6 1003   26  0  1 100  0  0
 0  0  25252  46528   3220  36876    0    0   208     0 1033   67  0  2  88 11  0
 0  1  25252  45112   3476  37440    0    0   388   116 1068  189  3 12  47 39  0
 0  1  25252  41936   3688  40016    0    0  1390     0 1077  173  2  5  47 46  0
 2  0  25248  38092   3860  43052   64    0  1646   206 1064  151 48  5   0 46  0
 0  0  25248  37692   3860  43340    0    0   140     0 1003   28 74  1  24  2  0
 0  0  25248  38344   3880  43408   48    0    98   194 1044   67  1  3  93  4  0
 0  0  25248  38412   3880  43408    0    0     0     0 1002   25  0  0 100  0  0

項目に関する補足

procs memory swap io system cpu

プロセスの遷移 (2-4)

Linux のプロセスは以下のライフサイクルとなる。

  1. プロセスの生成
    親プロセスが fork(2) システムコールにより自身の分身を生成する。 さらに exec(2) により実行イメージを置き換え実行する。
  2. 実行待ち
    OS は実行可能なプロセスを実行キューにため、順次実行する。
    実行キューから何を取り出すかは、スケジューラのアルゴリズムによる。 Kernel 2.6.2x では O(1)、2.6.3x 以降では CFS スケジューラとなる。
  3. 実行
    CPU により実行され、割り当て時間を消費しきるか、割り込みに応じて待ち行列へ移動する。
    割り込みはシグナルや、入出力要求によるデバイス待がある。
  4. 待ち行列
    実行を離れた瞬間プロセスは Wait になるが、最近の Linux では殆ど発生しない。
    SIGSTOP やデバッガ起動のものは、一時停止状態。
    デバイスの空き待ちは、Sleep で中断可能。
    直接デバイスとやりとり(DMA転送)している物や、デバイス完了まで他の割り込みが禁止されている場合は D (古くは Disk sleep、DMA 転送中は CPU の手を離れており、その間の中断はできなかったなごり。
  5. 終了
    プロセスが終了すると、リソースを解放し後処理を行う。
  6. 後処理
    a)親プロセスに SIGCHILD シグナルを発する。
    親プロセスは、それを受けプロセス一覧から子のエントリを削除する。wait(2)
    子プロセス実行中に、親プロセスが終了した場合は原則として init プロセスが引き継ぐ。
     
    b)何らかの理由で SIGCHILD を受取拒否されると、ゾンビプロセスとなる。
    ゾンビプロセスはプロセス一覧に存在するが、実際には何のリソースも消費していないもの。 但しプロセス一覧を大量ゾンビが埋め尽すと、パフォーマンスを低下や最悪の場合新規プロセスが生成できなくなる。

カーネルのメモリ管理 (2-7)

C プログラムと、実際のセグメント

$ cat -n mem.c
     1  #include <stdio.h>
     2  #include <unistd.h>
     3  static int bss[2500];
     4  char str1[] =  "....+....1....+....2....+....3....+....4....+....5\
     5  ....+....6....+....7....+....8....+....9....+....A";
     6
     7  int main()
     8  {
     9          char str2[2], *str3;
    10          str2[0] = 0x0;
    11
    12          puts(str1);
    13          printf("PID=%d, bss addr=%lx, str1 addr=%lx, str2 addr=%lx\n",
    14                  getpid(), bss, str1, str2);
    15          if( scanf("%s",str2) < 0 ) {
    16                  puts("scanf(3) error.");
    17          }
    18  }

$ make mem
cc     mem.c   -o mem
$ size mem
   text    data     bss     dec     hex filename
   1235     396   10032   11663    2d8f mem

プログラム実行時のメモリマップ

$ ./mem
....+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8....+....9....+....A
PID=2637, bss addr=8049800, str1 addr=8049760, str2 addr=bfa8643e

(別の端末から)
$ cat /proc/2637/maps
     address      perm  offset   dev  inode      file pathname
006a9000-006c4000 r-xp 00000000 fd:00 622607     /lib/ld-2.5.so
006c4000-006c5000 r-xp 0001a000 fd:00 622607     /lib/ld-2.5.so
006c5000-006c6000 rwxp 0001b000 fd:00 622607     /lib/ld-2.5.so
006c8000-0081a000 r-xp 00000000 fd:00 622615     /lib/libc-2.5.so
0081a000-0081b000 --xp 00152000 fd:00 622615     /lib/libc-2.5.so
0081b000-0081d000 r-xp 00152000 fd:00 622615     /lib/libc-2.5.so
0081d000-0081e000 rwxp 00154000 fd:00 622615     /lib/libc-2.5.so
0081e000-00821000 rwxp 0081e000 00:00 0
00d50000-00d51000 r-xp 00d50000 00:00 0          [vdso]
08048000-08049000 r-xp 00000000 fd:00 995059     /home/student/mem
08049000-0804a000 rw-p 00000000 fd:00 995059     /home/student/mem
0804a000-0804c000 rw-p 0804a000 00:00 0
b7f0d000-b7f0f000 rw-p b7f0d000 00:00 0
b7f1b000-b7f1d000 rw-p b7f1b000 00:00 0
bfa73000-bfa88000 rw-p bffe9000 00:00 0          [stack]
proc(5)より

sysstat (2-14)

sysstat パッケージに含まれるコマンド群

CommandDescription
sar定期的に収集したシステム状況の表示
sadfsar(8)で保存したデータのフォーマッタ
iostatHDD の統計情報
cifsiostatCIFS(Windows共有)の統計情報
mpstatプロセスに関する統計情報