linuxでのプロセスの監視について


この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。

linuxでは様々なプログラムを実行、処理することができますが、

今回はそれをどのように管理しているのか見ていきたいと思います。

 

プロセスとは

 

まず、プログラムが管理される仕組みは下記のような流れです。

 

①Linux上でプログラムを実行
②プログラムにメモリが割り当てられる
③CPUで処理
④動作中のプログラムをOSで管理

 

ここの④で管理される単位のことを"プロセス"と呼びます。

プロセスは新しいプログラムごとに生成されます。

psコマンド

 

そのプロセス(OSでプログラムを管理する単位)情報を確認するコマンドが「ps」コマンドです。

 

表示させる情報を増やすためのオプションが多くあるのですが、

まずはなにもオプションを付けない状態で表示させてみます。

 

[root@localhost ~]# ps
    PID TTY          TIME CMD
   3033 pts/0    00:00:00 su
   3038 pts/0    00:00:00 bash
   3497 pts/0    00:00:00 ps

 

これでps実行した端末で実行されているプロセスが表示されています。

1行目:ログイン後にrootユーザに変更
2行目:ログイン後に実行されているbashファイル
3行目:現在実行中のpsコマンド

 

ですが、上からわかるように得られる情報量が非常に少ないことがわかります。

なのでオプションをつけて情報を増やしてみます。

 

オプション

 

「ps」コマンドのオプションには以下の種類があります。

 

a     他のユーザーの全てのプロセスを表示
f     プロセスの親子関係を表示
u     プロセスのユーザー情報を表示
x     端末を利用していない全てのプロセスを表示
-e     全てのプロセスを表示
-l     プロセスの詳細情報の表示
-p PID     指定したプロセスID(PID)の情報のみ表示
-C プロセス名 指定した名前のプロセスのみ表示
-w     長い行を折り返して表示

 

ここでは、"a","u","x"のオプションをつなげて表示してみます。

 

[root@localhost ~]# ps aux
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.2  0.8 187132 14836 ?        Ss   17:39   0:03 /usr/lib/systemd/systemd --switch
root           2  0.0  0.0      0     0 ?        S    17:39   0:00 [kthreadd]
root           3  0.0  0.0      0     0 ?        I<   17:39   0:00 [rcu_gp]
root           4  0.0  0.0      0     0 ?        I<   17:39   0:00 [rcu_par_gp]
root           6  0.0  0.0      0     0 ?        I<   17:39   0:00 [kworker/0:0H-events_highpri]
root           7  0.0  0.0      0     0 ?        I    17:39   0:00 [kworker/0:1-events_power_efficie
root           9  0.0  0.0      0     0 ?        I<   17:39   0:00 [mm_percpu_wq]
root          10  0.0  0.0      0     0 ?        S    17:39   0:00 [ksoftirqd/0]



root        2087  0.1  4.2 628900 77860 ?        Ssl  17:40   0:02 /usr/libexec/packagekitd
colord      2187  0.0  0.7 348440 13520 ?        Ssl  17:40   0:00 /usr/libexec/colord
root        2274  0.0  0.9 364304 17324 ?        Sl   17:40   0:00 gdm-session-worker [pam/gdm-passw
daisuke     2285  0.0  0.5 100972 10288 ?        Ss   17:40   0:00 /usr/lib/systemd/systemd --user
daisuke     2293  0.0  0.3 264920  5584 ?        S    17:40   0:00 (sd-pam)



 

これらのオプションによって
他のユーザのプロセスや端末を利用していない全てのプロセス、プロセスのユーザ情報が表示されました。

 

ちなみに"a"のオプションのみを使用すると、

 

[root@localhost ~]# ps a
    PID TTY      STAT   TIME COMMAND
   2336 tty2     Ssl+   0:00 /usr/libexec/gdm-wayland-session --register-session gnome-session
   2342 tty2     Sl+    0:00 /usr/libexec/gnome-session-binary
   2403 tty2     Rl+    0:35 /usr/bin/gnome-shell

このような結果になりました。

"a"コマンドのみで実行したときと、"aux"を使ったときを比較すると

 

USER  プロセスを実行しているユーザ名
%CPU  CPU使用率
%MEM  メモリ使用率
VSZ  割り当て済みの仮想アドレス空間サイズ
RSS  物理メモリ使用量 ( %MEMに比例 )
START  プロセスの起動時刻

 

の項目が表示されていないことがわかります。

 

topコマンド

 

topコマンドを使用することで、

現在実行中のプロセスをリアルタイムに表示させることができます。

情報としては、システム全体の負荷やプロセスの統計情報(CPU,メモリ,スワップ,プロセス)があります。

デフォルトではCPUの使用率が多い順に表示されます。

 

[root@localhost ~]# top

top - 20:52:04 up  3:12,  1 user,  load average: 0.00, 0.00, 0.00
Tasks: 292 total,   3 running, 289 sleeping,   0 stopped,   0 zombie
%Cpu(s):  8.6 us,  5.5 sy,  0.0 ni, 82.5 id,  0.0 wa,  3.4 hi,  0.0 si,  0.0 st
MiB Mem :   1790.4 total,    159.2 free,   1037.5 used,    593.7 buff/cache
MiB Swap:   2048.0 total,   2047.0 free,      1.0 used.    587.0 avail Mem 

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND                                        
   2403 daisuke   20   0 2633304 193092  96520 R   8.9  10.5   0:47.67 gnome-shell                                    
   2969 daisuke   20   0  532688  43628  30956 S   3.3   2.4   0:14.66 gnome-terminal-                                
      1 root      20   0  187132  14836   9560 S   0.7   0.8   0:03.42 systemd                                        
   5017 root      20   0   65560   5104   4232 R   0.7   0.3   0:00.22 top                                            
   1001 dbus      20   0   73868   7528   4656 S   0.3   0.4   0:01.35 dbus-daemon  

 

10秒後にもう一度表示させてみます。

 

[root@localhost ~]# top

top - 20:52:45 up  3:12,  1 user,  load average: 0.08, 0.02, 0.01
Tasks: 292 total,   2 running, 290 sleeping,   0 stopped,   0 zombie
%Cpu(s):  1.0 us,  0.7 sy,  0.0 ni, 97.6 id,  0.0 wa,  0.7 hi,  0.0 si,  0.0 st
MiB Mem :   1790.4 total,    159.4 free,   1037.3 used,    593.7 buff/cache
MiB Swap:   2048.0 total,   2047.0 free,      1.0 used.    587.2 avail Mem 

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND                                        
   2403 daisuke   20   0 2634328 193168  96520 S   1.0  10.5   0:49.34 gnome-shell                                    
   2969 daisuke   20   0  532688  43720  30960 S   0.7   2.4   0:15.48 gnome-terminal-                                
   5029 root      20   0   65560   5004   4128 R   0.7   0.3   0:00.14 top                                            
   1004 root      20   0  365772  11768   9932 S   0.3   0.6   0:15.25 vmtoolsd                                       
      1 root      20   0  187132  14836   9560 S   0.0   0.8   0:03.42 systemd 

 

リアルタイムで反映されているため、表示されている内容が異なることがわかります。

topコマンドを叩いただけだと、どんどんリアルタイムで反映されていくため次のコマンドを打てません。
その状態からは「q」キーを押すことで元の状態に戻ることができます。

 

オプション

 

topコマンドにもオプションがあります。

-b バッチモードで実行する
-c コマンドライン表示を切り替える
-d [秒数] 表示を更新する間隔を指定
-H スレッドごとの表示に切り替える
-n [回数] 指定した回数だけ表示を更新して終了する
-p [PID] 指定したプロセスIDのプロセスのみを表示
-u [ユーザー] 指定したユーザーが実行しているプロセスを表示
-i アイドル状態のプロセスを表示しない
-o [項目名] 指定した項目でソートして表示
-a アイドル状態のプロセスを表示する

※[PID]はtopコマンドで表示されている一番左の項目です。

 

topコマンドはトラブルシューティングなどにも使うことができます。

 

例えば、メモリの使用率が高いものを特定したい場合は
「top -o %MEM」を使用します。

 

[root@localhost ~]# top -o %MEM

top - 00:23:10 up  4:10,  1 user,  load average: 0.00, 0.00, 0.00
Tasks: 294 total,   3 running, 291 sleeping,   0 stopped,   0 zombie
%Cpu(s):  1.0 us,  0.7 sy,  0.0 ni, 98.0 id,  0.0 wa,  0.3 hi,  0.0 si,  0.0 st
MiB Mem :   1790.4 total,    109.0 free,   1075.9 used,    605.5 buff/cache
MiB Swap:   2048.0 total,   2047.0 free,      1.0 used.    540.5 avail Mem 

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND                                        
   2403 daisuke   20   0 2634776 193184  96520 S   0.3  10.5   0:57.62 gnome-shell                                    
   2750 daisuke   20   0  998496  84432  40252 S   0.0   4.6   0:01.90 gnome-software                                 
   2087 root      20   0  628900  77428  23508 S   0.0   4.2   0:02.52 packagekitd                                    
   2424 daisuke   20   0  588016  61528  42368 S   0.0   3.4   0:00.92 Xwayland                                       
   2632 root      20   0  478220  58808  26204 S   0.0   3.2   0:05.04 rhsm-service                                   
   2458 daisuke   20   0  545220  57408  46160 S   0.0   3.1   0:00.26 ibus-x11                                       
   2969 daisuke   20   0  532688  43724  30964 S   0.3   2.4   0:17.33 gnome-terminal-  

これでメモリ使用率の高い順にプロセスが表示されています。
ここから不要なリソースを特定、削除したりすることも可能です。

まとめ

システムの監視、トラブルシューティングはインフラ構築をするうえで必須になってくるので、
今回取り上げたコマンドを使いこなしてどんどんエンジニアとしてレベルを上げていきたいですね!

Last modified: 2023-08-24

Author