これまでのLinux中級では、 ユーザ・グループ・ファイルの所有者や権限 について学習してきました。
ここからは、 Linuxサーバ上で実際に動作している プログラムや処理 に目を向けていきます。
Linuxでは、実行中のプログラムや処理を プロセス(process) として管理しています。
CPUを大量に使っている処理はどれ?
Webサーバのプロセスは起動している?
こうした確認に利用する代表的なコマンドが、 psとtopです。
この記事はLinux中級講座の一部です。 Linuxサーバ上で動作しているプロセスを確認し、 障害調査や負荷確認の基本を学習します。
Linux中級講座を見る →
Linuxのプロセス・PIDの意味を理解し、
ps・ps aux・top
を使って実行中の処理やCPU・メモリ使用率を確認できる状態を目指します。
Linuxのプロセスとは?
プロセスとは、 現在実行されているプログラムや処理 のことです。
たとえばLinuxサーバでは、 次のような処理が同時に動いています。
SSH接続を受け付ける
Webページを配信する
システムやサービスを管理する
ユーザのシェルを動かす
これらはすべて、 Linux上ではプロセスとして管理されています。
プロセスにはPIDが割り当てられる
Linuxでは、 それぞれのプロセスに PID(Process ID) という番号が割り当てられます。
つまりLinuxは、 プロセス名だけではなく PIDによって個々のプロセスを識別 しています。
次の記事で学習する
killコマンドでは、
このPIDを指定してプロセスを終了させることがあります。
psコマンド:現在のプロセスを確認する
実行中のプロセスを確認する代表的なコマンドが、 psです。
ps
$ ps
PID TTY TIME CMD
2301 pts/0 00:00:00 bash
2410 pts/0 00:00:00 ps
引数なしのpsでは、 現在の端末に関連するプロセス などが表示されます。
表示内容を見てみましょう。
ps auxでサーバ全体のプロセスを確認する
実務でよく利用するのが、 ps auxです。
ps aux
$ ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.2 171452 13200 ? Ss 09:00 0:02 /usr/lib/systemd/systemd
root 850 0.0 0.1 82340 7500 ? Ss 09:01 0:00 /usr/sbin/sshd
nginx 1250 0.2 1.5 160240 62000 ? S 09:05 0:14 nginx: worker process
mysql 1400 3.8 8.2 950000 330000 ? Ssl 09:05 4:31 mysqld
user 2301 0.0 0.1 18000 6200 pts/0 Ss 10:20 0:00 bash
これなら、 システム全体でどのようなプロセスが動いているのかを確認できます。
ps auxの表示項目を理解しよう
ps auxでは多くの情報が表示されますが、 中級ではまず次の項目を確認できれば十分です。
USER
プロセスを実行しているユーザ
PID
プロセスID
%CPU
CPU使用率
%MEM
メモリ使用率
STAT
プロセスの状態
COMMAND
実行しているコマンドやプログラム
USERを見ると「誰の権限で動いているか」が分かる
前の記事までに学習した Linuxユーザ管理が、 ここでもつながります。
USER PID COMMAND
root 1 /usr/lib/systemd/systemd
nginx 1250 nginx: worker process
mysql 1400 mysqld
この例では、
というユーザ権限で各プロセスが動作しています。
サービス専用ユーザでプロセスを動かすことで、 必要以上の権限を与えないようにすることができます。
%CPUと%MEMで負荷を確認する
サーバの動作が重いときには、 %CPUと%MEMが重要です。
どのプロセスがCPUを多く使用しているか確認する。
どのプロセスがメモリを多く使用しているか確認する。
たとえば、
USER PID %CPU %MEM COMMAND
nginx 1250 0.2 1.5 nginx
mysql 1400 78.4 42.0 mysqld
sshd 850 0.0 0.1 sshd
となっていれば、 mysqldのCPU・メモリ使用率が非常に高い ことが分かります。
ps auxとgrepを組み合わせて特定プロセスを探す
サーバ全体のプロセスを表示すると、 非常に多くの行が表示されることがあります。
そのため、 初級で学習した grepを組み合わせる方法もよく利用します。
ps aux | grep nginx
$ ps aux | grep nginx
root 1200 0.0 0.1 159100 5100 ? Ss 09:05 0:00 nginx: master process
nginx 1250 0.2 1.5 160240 62000 ? S 09:05 0:14 nginx: worker process
user 2501 0.0 0.0 12100 2100 pts/0 S+ 10:35 0:00 grep --color=auto nginx
これでnginxに関係する行だけ絞り込めます。
ps aux | grep nginxを実行すると、
「grep nginx」というプロセス自体も検索条件に一致するため
表示される場合があります。
「|」はコマンドの出力を次のコマンドへ渡す
ここで初めて
|
が登場しました。
これは パイプ(pipe) と呼ばれます。
ps aux
全プロセスを表示
grep nginx
nginxだけ検索
つまり、
という流れです。
ps aux | grep nginxのように、
1つのコマンドの出力を別のコマンドへ渡すことで
必要な情報を絞り込めます。
topコマンド:プロセスをリアルタイムに確認する
psは実行した時点の情報を表示します。
一方、 topは プロセスの状態をリアルタイムに更新しながら表示します。
top
top - 10:42:01 up 1 day, 2:10, 1 user, load average: 0.82, 0.61, 0.44
Tasks: 132 total, 1 running, 131 sleeping, 0 stopped, 0 zombie
%Cpu(s): 12.4 us, 3.1 sy, 84.1 id
MiB Mem : 4096.0 total, 620.0 free, 2250.0 used, 1226.0 buff/cache
PID USER PR NI VIRT RES %CPU %MEM COMMAND
1400 mysql 20 0 950000 330000 38.4 8.2 mysqld
1250 nginx 20 0 160240 62000 4.2 1.5 nginx
2301 user 20 0 18000 6200 0.0 0.1 bash
topを使うと、 CPU使用率やメモリ使用率が変化していく様子を確認できます。
top画面の上部ではサーバ全体の状態を確認できる
topの画面は、 大きく サーバ全体の情報と プロセス一覧に分かれます。
システム負荷の目安
プロセス数・状態
CPU全体の利用状況
メモリ全体の利用状況
topの下部では負荷の高いプロセスを確認できる
top画面下部では、 各プロセスのCPU・メモリ使用率を確認できます。
PID USER %CPU %MEM COMMAND
1400 mysql 38.4 8.2 mysqld
1250 nginx 4.2 1.5 nginx
2301 user 0.0 0.1 bash
この例なら、 mysqldが最もCPUを利用している ことが分かります。
topで覚えておきたい基本操作
q
終了
topを終了する
P
CPU順
CPU使用率で並べる
M
メモリ順
メモリ使用率で並べる
lessと同じように、
topも通常のプロンプト画面とは別の表示になります。
終了するときはqを押します。
psとtopはどう使い分ける?
実行したタイミングの プロセス一覧を確認する。
ps aux
CPU・メモリ使用率などを 更新しながら確認する。
top
プロセスには状態がある
psやtopには、 STATや状態に関する情報も表示されます。
代表的な状態を簡単に覚えておきましょう。
R
Running:実行中または実行可能
S
Sleeping:待機中
T
Stopped:停止中
Z
Zombie:終了したが情報が残っている状態
多くのサービスは、 常にCPUを使って処理しているわけではなく、 通信やイベントを待っている間はSleeping状態になります。
プロセスには親子関係もある
Linuxでは、 あるプロセスが別のプロセスを起動することがあります。
そのため、 プロセスには 親プロセスと子プロセス という関係があります。
親プロセスのPIDは PPID(Parent Process ID) として確認できます。
ps -ef
$ ps -ef
UID PID PPID C STIME TTY TIME CMD
root 850 1 0 09:01 ? 00:00:00 /usr/sbin/sshd
user 2200 850 0 10:20 ? 00:00:00 sshd: user
user 2301 2200 0 10:20 pts/0 00:00:00 -bash
実務ではどのようにプロセスを確認する?
たとえば、 「Webサイトが重い」という問い合わせがあったとします。
その場合、Linuxサーバでは次のように確認できます。
CPU・メモリ使用率を確認
どのプロセスが原因か特定
ユーザやCommandを詳しく確認
たとえばtopで、
PID USER %CPU %MEM COMMAND
1400 mysql 95.8 42.0 mysqld
と表示されていれば、 mysqldが高負荷になっている可能性があります。
CPU使用率が高いプロセスでも、 正常な処理によって一時的に負荷が高くなっている場合があります。 プロセスを停止する前に、原因や影響を確認することが重要です。
ここで実際に試してみよう:Linuxプロセス確認シミュレーター
疑似Linux環境で、
ps・ps aux・ps aux | grep nginxを実行してみましょう。
Linux Process Monitor
まずps auxでプロセス一覧を確認しましょう
USER・PID・%CPU・%MEM・COMMANDに注目してみましょう。
理解度チェック:高負荷プロセスを見つけよう
次のプロセス一覧を確認してください。
PID USER %CPU %MEM COMMAND 850 root 0.0 0.1 sshd 1250 nginx 3.2 1.5 nginx 1400 mysql 92.4 41.8 mysqld 2301 user 0.1 0.2 bash
CPU使用率が最も高いプロセスのPIDはどれでしょうか?
%CPU列を確認してみましょう。
問題のあるプロセスを見つけたらどうする?
ここまでで、 psやtopを使って どのプロセスが動いているか を確認できるようになりました。
では、 次のような状態になった場合はどうでしょうか。
プロセスが異常状態となり、 正常な方法では停止できない。
このような場合、 Linuxではプロセスへ シグナルを送って 終了を要求することがあります。
そこで利用する代表的なコマンドが killです。
kill PID
次の記事では、 PIDを指定してプロセスを終了する方法や、 SIGTERM・SIGKILLの違い について学習します。
確認問題:Linuxプロセス管理の基本を確認しよう
Linuxで各プロセスを識別する番号はどれですか?
PIDはProcess IDの略で、 Linuxが個々のプロセスを識別するために利用します。
サーバ全体のプロセスを一覧で確認するときによく使うコマンドはどれですか?
ps auxを使うと、 多くのプロセスについてUSER・PID・CPU・MEMORYなどを確認できます。
CPU・メモリ使用率をリアルタイムに確認したい場合に適しているコマンドはどれですか?
topはプロセスやCPU・メモリ使用率などを リアルタイムに更新しながら確認できます。
3問に挑戦してみましょう。
まとめ
Linuxでは実行中のプログラムを プロセスとして管理する
各プロセスには PID(Process ID)が割り当てられる
ps auxで
USER・PID・CPU・メモリ使用率などを確認できる
topを使うと
CPU・メモリ・プロセスの状態をリアルタイムに確認できる
高負荷プロセスを見つけても、 原因や影響を確認してから対応する ことが重要
次は「killコマンドでプロセスを終了する」を学びましょう
ps・topを使ってプロセスを確認できるようになったら、 次は問題のあるプロセスへ終了を要求する方法を学習します。
次の記事では、 kill・PID・シグナル・SIGTERM・SIGKILL の関係を理解し、 安全にプロセスを終了する考え方を学びます。
killコマンドでプロセスを終了する →
