この記事は公開されてから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-
これでメモリ使用率の高い順にプロセスが表示されています。
ここから不要なリソースを特定、削除したりすることも可能です。
まとめ
システムの監視、トラブルシューティングはインフラ構築をするうえで必須になってくるので、
今回取り上げたコマンドを使いこなしてどんどんエンジニアとしてレベルを上げていきたいですね!