こんにちは、かつコーチです。
「サーバーの動きが急に重くなった」「アプリが応答しなくなった」というとき、原因調査の第一歩になるのがプロセスの確認です。
この記事では、Ubuntu 26.04 LTSでの実例を交えながら、プロセスの基本概念とps・topコマンドの使い方を解説します。
プロセスとは?
プロセスの定義:実行中のプログラムの単位
プロセスとは、実行中のプログラムをOSが管理するための単位です。
例えばWebサーバーのnginxを起動すると、OS上に「nginxのプロセス」が1つ(あるいは複数)生成され、CPUやメモリなどのリソースを割り当てられて動作します。
似た言葉にプログラムがありますが、プログラムはディスク上に保存された「実行可能なファイル」そのものを指し、プロセスはそれが実行されて「メモリ上に展開され、実際に動いている状態」を指します。
同じプログラムを2回起動すれば、2つの別々のプロセスが生成されます。
なぜプロセスの確認が必要なのか
サーバーを運用していると、以下のような理由でプロセスを確認する場面が頻繁に発生します。
- サーバーの応答が遅いとき、どのプロセスがCPU・メモリを消費しているか特定する
- 意図せず起動したままになっているプロセス(ゾンビ化したバッチ処理など)を見つける
- アプリが正しく起動しているか、プロセスとして存在するかを確認する
プロセスを可視化できないと、「なんとなく重い」という感覚的な判断しかできず、原因調査に時間がかかります。
基本の書き方:ps・topの使い方
手順1:psで現在のプロセス一覧を確認する
psは、実行時点のプロセス一覧をスナップショットとして表示するコマンドです。
$ ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 168000 11000 ? Ss 09:00 0:02 /sbin/init
katsu 1523 0.5 1.2 812000 98000 ? Sl 10:15 0:12 php-fpm: master process
auxは定番の組み合わせで、a(全ユーザーのプロセス)、u(ユーザー名など詳細表示)、x(端末に紐づかないプロセスも表示)を意味します。
出力の主な列は以下の通りです。
| 列 | 意味 |
|---|---|
| PID | プロセスID(プロセスごとの一意な番号) |
| %CPU | CPU使用率 |
| %MEM | メモリ使用率 |
| STAT | プロセスの状態(S=スリープ、R=実行中など) |
| COMMAND | 実行されているコマンド |
PID(Process ID)は、後述するプロセスの操作(停止・再起動など)で必須になる番号です。
手順2:grepと組み合わせて特定のプロセスを探す
プロセス数が多いと目的のプロセスを探すのが大変なので、grepと組み合わせるのが定番です。
$ ps aux | grep nginx
www-data 2201 0.0 0.3 55000 12000 ? S 10:20 0:00 nginx: master process
www-data 2202 0.0 0.2 55000 10000 ? S 10:20 0:00 nginx: worker process
nginxに関連するプロセスだけを絞り込んで確認できます。
手順3:topでリアルタイムに監視する
psが「その瞬間のスナップショット」なのに対し、topはプロセスの状態をリアルタイムに更新し続けながら表示するコマンドです。
$ top
実行すると、CPU使用率・メモリ使用率順にプロセスが自動でソートされながら、画面が数秒ごとに更新されます。qキーで終了、PキーでCPU使用率順、Mキーでメモリ使用率順に並び替えができます。
つまずきやすい設定・注意点
topはターミナルを占有し続けるため、ログを残したい場合には向きません。
ログとして残したい場合はps auxをシェルスクリプトなどで定期的に実行し、ファイルに書き出す方法が使われます。
よくあるつまずきポイント・エラー対処
%CPUの合計が100%を超えて驚く
私が初めてtopでマルチコアサーバーを見たとき、%CPUの合計が300%近くまで表示されて、計算がおかしいのではと驚いたことがあります。
❌Before:%CPUの合計を100%が上限だと思い込み、異常な数値だと勘違いする
%Cpu(s): ...
PID USER %CPU %MEM COMMAND
2301 katsu 280.0 4.2 batch-worker
✅After:%CPUはコア単位の合計であり、コア数×100%まで表示されると理解する
$ nproc
4
nprocコマンドでCPUコア数を確認すると、このサーバーは4コアあることが分かりました。
つまり理論上の上限は400%であり、280%という数値は「4コアのうち2.8コア分をこのプロセスが使っている」という意味だったのです。
コア数を確認せずに%CPUだけを見て判断すると、実際には正常な状態を異常だと誤解してしまいます。
ゾンビプロセスが残り続けて原因が分からない
もう1つの実体験として、STAT列にZと表示されるプロセスが増え続け、原因が分からず困ったことがあります。
$ ps aux | grep Z
katsu 3301 0.0 0.0 0 0 ? Z 09:00 0:00 [worker] <defunct>
❌Before:Z(ゾンビ)状態のプロセスをkillで終了させようとして、消えないことに戸惑う
✅After:ゾンビプロセスは親プロセス側の後処理待ちだと理解し、親プロセスを確認する
$ ps -o pid,ppid,stat,cmd -p 3301
PID PPID STAT CMD
3301 2999 Z [worker] <defunct>
ゾンビプロセスとは、処理自体は終了しているのに、親プロセスが終了ステータスを受け取っていないために、プロセステーブル上に残り続けている状態のプロセスです。killはすでに終了しているプロセスには効果がなく、根本的な解決には親プロセス(PPID)側のバグ修正や再起動が必要になります。
このようにZという表示自体が「もう終わっているが片付いていない」というサインだと知っておくと、無駄にkillを試し続ける時間を減らせます。
応用・一歩先の使い方
psの表示項目をカスタマイズする
ps auxはデフォルトの表示項目ですが、-oオプションで表示項目を自由に指定できます。
$ ps -eo pid,ppid,user,%cpu,%mem,cmd --sort=-%cpu | head
--sort=-%cpuでCPU使用率の降順に並び替え、headで上位だけを表示すると、重いプロセスをすばやく特定できます。
htopという選択肢
topは標準で使えて便利ですが、視認性や操作性を改善したhtopというツールもよく使われます。
$ sudo apt install htop
$ htop
htopはプロセスを色付きで表示し、マウス操作やキー操作でプロセスをkillするといった対話的な操作がしやすい点が特徴です。
標準ツールで十分な場面ではtop、より快適に監視したい場面ではhtop、という使い分けがおすすめです。
まとめ
この記事のポイント
- プロセスは実行中のプログラムをOSが管理する単位で、それぞれ固有のPIDを持つ
ps auxはその瞬間のプロセス一覧を確認するコマンドtopはプロセスの状態をリアルタイムに監視できるコマンド- %CPUはコア単位の合計値であり、コア数×100%まで表示され得る
- ゾンビプロセス(
Z)はkillでは消えず、親プロセス側の対応が必要になる
次に読むべき記事
プロセスの確認ができるようになったら、次は実際にプロセスを制御する「ジョブ管理(fg・bg・kill)とシグナルの基本」に進んでみてください。
今回確認したPIDを使って、プロセスを止めたりバックグラウンドに回したりする方法が身につきます。
タグ: Linux, 中級者向け, プロセス管理