11.1 リソースの管理
Linux Essentials Online Text | 2021/07/28

プロセスの管理

プロセスとは「実行中のプログラム」のことです。Linuxに限らずOSはたくさんのプログラムの集合体です。そのため、OSを単に起動するだけでも100個以上のプロセスが裏で動いています。加えてユーザが実行するプログラムもプロセスとして動作します。

OSはこれらのプロセスを管理するわけですが、プログラムの起動に際してプロセスID(PID)と呼ばれる識別子を付与して、プログラムの実行に必要な資源、つまり、CPUやメモリなどを割り当てます。

プログラムは割り振られたリソースの上でプロセスとして稼動し、役目を終えると終了してメモリなどの資源を開放する。サーバ関係のプロセスは「daemon(デーモン)」と呼ばれ、一度起動すると、通常は終了処理が行われない限り稼動し続けます。また、プロセスには“親と子”の関係があります。例えば、bashのプロンプトでpsコマンドを実行した場合、 “bashのプロセスが親”で“psのプロセスが子”になります。それぞれ「親プロセス」と「子プロセス」と表現します。

プロセスの監視(ps)

Linux上でどのようなプロセスが動作しているかは、psコマンドを用いて確認します。

書式:

ps [オプション] [PID]

主なオプション:

-e全プロセスを表示する
-f詳細情報を表示する
-l長いフォーマットで詳細情報(NICE値を含む)を表示する
-p PID指定されたPIDの情報を表示する
a全プロセスを表示する
u詳細情報を表示する
x制御端末のないプロセス情報も表示する
fツリー状で表示する

psコマンドのオプションには、Solaris等で使用されるUnix形式とFreeBSDで使用されるBSD形式の2種類があります。Unix形式ではオプション文字にハイフンを付け、BSD形式ではハイフンを付けません。Linuxはどちらの指定も可能で、また混在することもできます

<実習:psコマンドの実行>

Unix形式で全てのプロセスを表示する場合は「-ef」、BSD形式では「aux」オプションを使います。
表示内容には多少違いがあります。なお実行はrootで行って下さい。

# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0  6月12 ?      00:00:08 /usr/lib/systemd/systemd --syste
root         2     0  0  6月12 ?      00:00:00 [kthreadd]
root         4     2  0  6月12 ?      00:00:00 [kworker/0:0H]
root         6     2  0  6月12 ?      00:00:04 [ksoftirqd/0]
root         7     2  0  6月12 ?      00:00:00 [migration/0]
root         8     2  0  6月12 ?      00:00:00 [rcu_bh]
(以下省略)
# ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.6  46212  6628 ?       Ss	6月12   0:08 /usr/lib/syst
root         2  0.0  0.0      0     0 ?        S	6月12   0:00 [kthreadd]
root         4  0.0  0.0      0     0 ?        S<	6月12   0:00 [kworker/0:0H
root         6  0.0  0.0      0     0 ?        S	6月12   0:04 [ksoftirqd/0]
root         7  0.0  0.0      0     0 ?        S	6月12   0:00 [migration/0]
root         8  0.0  0.0      0     0 ?        S	6月12   0:00 [rcu_bh]
(以下省略)

実習:psコマンドのツリー表示

# ps -l af
F S  UID  PID   PPID  C  PRI  NI ADDR SZ WCHAN  TTY  TIME CMD
0 S 1000 13201	13200  0  80   0 - 28917   do_wai  pts/0  0:00 -bash
4 S    0 14622	13201  0  80   0 - 48000   do_wai  pts/0  0:00  \_ su -
4 S    0 14626	14622  0  80   0 - 28886   do_wai  pts/0  0:00      \_ -bash
0 R    0 15391	14626  0  80   0 - 38336   -        pts/0  0:00          \_ ps -l af

「ps -l af」コマンドを実行した結果です。この結果は、一般ユーザ(1000)権限でログイン(3行目)し、suコマンドを使ってroot権限を取得(4行目)し、rootユーザのbash(5行目)でpsコマンドを実行(6行目)した結果です。
なお、PPIDが子プロセスのIDです。1行目の子プロセスが2行目、2行目の子プロセスが3行目と段々になっていることがわかります。

プロセスのツリー表示(pstree)

「f」オプションを用いたpsコマンドは、親プロセスと子プロセスを階層構造で表示しますが、pstreeコマンドを用いても確認することができます。

書式:

pstree [オプション]

主なオプション:

-pプロセスIDを表示する

<実習:pstreeコマンドの実行>

# pstree
systemd┬NetworkManager┬dhclient
       │              └2* [{NetworkManager}]
       ├agetty
       ├auditd─{auditd}
       ├chronyd
       ├crond
       ├dbus-daemon─{dbus-daemon}
       ├firewalld─{firewalld}
       ├master┬cleanup
       │      ├local
       │      ├pickup
       │      ├qmgr
       │      └trivial-rewrite
(以下省略)

上記のようにpstreeコマンドを用いることで、プロセスをツリー表示させることができます。これにより親子関係をわかりやすく表示することができます。

なお、「-p」オプションを用いるとプロセスIDをツリー上に表示させることも可能です。

# pstree -p
systemd(1)┬NetworkManager(693)┬dhclient(821)
          │                   ├{NetworkManager}(707)
          │                   └{NetworkManager}(710)
          ├agetty(690)
          ├auditd(624)─{auditd}(625)
          ├chronyd(674)
          ├crond(672)
          ├dbus-daemon(649)─{dbus-daemon}(653)
          ├firewalld(689)─{firewalld}(818)
          ├master(1258)┬cleanup(20505)
          │            ├local(20507)
          │            ├pickup(20840)
          │            ├qmgr(1260)
          │            └trivial-rewrite(20842)
(以下省略)

メモリの管理(free)

freeコマンドはメモリの利用状況を確認するコマンドです。一般ユーザでも利用できるコマンドで、引数なしで実行することができます。デフォルト表示単位はKBです。

書式:

free [オプション]

主なオプション:

-b表示単位をB(byte)で表示する
-k表示単位をKBで表示する
-m表示単位をMBで表示する
-g表示単位をGBで表示する
-h読みやすい単位で表示する

freeコマンドのオプションは、ほとんどが単位を表示するものですので、自分の読みやすいオプションを使いましょう。なお省略した場合の単位はKBです。

実習:freeコマンドの実行

# free
              total        used          free      shared   buff/cache    available
Mem:        1014764      200280        231700       13260       582784        634132
Swap:        839676         264        839412

「total」は物理メモリ全体の容量、「used」は現在使用しているメモリ容量、「free」は何にも使用されていない空きメモリ容量です。

特に何も使用していないにも関わらず、使用しているメモリ(used)の割に、空きメモリ(free)の容量が少ないことに違和感を感じるかも知れませんが、これはLinuxの仕様によるものです。システムが「buff/cache」として確保しているためにこの様な表示になっているもので、異常なわけではありません。
Linuxのメモリ使用率を確認すると、最初から高いように感じるかもしれませんが、それは上記のような理由によるものです。

ちなみに、sharedはtmpfs用のメモリで、メモリ内に作成する一時的記憶領域です。

リソースのリアルタイムモニタ(top)

これまでに紹介した様々コマンドを使用することでシステムの状態を調査することができます。しかし、いずれのコマンドも実行したその瞬間の状況しか表示することができません。
実際にサーバが正常に動作しない等の状況によっては、リアルタイムに移り変わる状況を観察しなければならないケースがあります。もちろん、psやfreeコマンドを定期的に実行する、という方法でも構いませんが、長時間になると非現実的です。

このような、リアルタイムにモニタリングしたい場合はtopコマンドを使用します。

書式:

top [オプション]

主なオプション:

-d 間隔更新する間隔を「ss.tt秒」で指定する
-n 回数表示を繰り返す回数を指定する
-U(-u) ユーザ指定したユーザを監視する。ユーザはユーザ名またはIDどちらでもよい
-p PID指定したプロセスIDを監視する

実習:topコマンドの実行

# top
top - 02:16:22 up 4 days, 15:04,  2 users,  load average: 0.00, 0.01, 0.05
Tasks:  97 total,   1 running,  96 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  1014764 total,   230820 free,   200772 used,   583172 buff/cache
KiB Swap:   839676 total,   839412 free,      264 used.   633616 avail Mem

  PID  USER   PR  NI    VIRT    RES    SHR S  %CPU  %MEM    TIME+  COMMAND
15692  root   20   0  161992   2164   1544 R   0.7   0.2  0:00.12  top
    1  root   20   0  128140   6680   4044 S   0.0   0.7  0:09.26  systemd
    2  root   20   0       0      0      0 S   0.0   0.0  0:00.03  kthreadd
                      :

topコマンドは、CPU使用率や負荷率、メモリ使用状況に加えて現在実行中のプロセスをリアルタイムに表示され、デフォルトでは5秒おきに更新されます。終了したい時は「q」キーを押します。

ちなみに、2行目はuptimeコマンド、5~6行目はfreeコマンド、8行目以下はpsコマンドと同じものが表示されます。

ロードアベレージ

簡単に説明すると、システムの負荷状態を示す指数です。0が最も小さく、数値が大きいほどシステムに負荷がかかっていることを示します。

もう少し具体的に言うと、この数値は処理順番待ちのプロセス数の平均値が表示されています。つまり、この数値が大きければ大きいほど、処理の順番待ちをしているプロセスが多い、ということを意味し、システムがプロセスを処理しきれていない状態であることを意味します。

ロードアベレージには3つの数値がありますが、左から1分平均、5分平均、15分平均となっています。

PAGE TOP