topコマンドのおさらい（備忘録）

# はじめに
こんにちは！

Linuxで作業をしていると、負荷状況を知りたくなることがあります。
そこで便利なのが **topコマンド**。
リアルタイムにシステムの負荷状況を監視し、問題発生の予兆をいち早く察知するために欠かせないツールです。

今回は、このtopコマンドについて、基本的な見方を振り返ります。

### topコマンドを実行してみる

まずは、ターミナルで `top` と入力してコマンドを実行してみましょう。

```bash
$ top
```

すると、以下のような画面が表示されるはずです。
（環境によって表示内容は多少異なります）

```
Processes: 466 total, 3 running, 463 sleeping, 2579 threads
2024/07/06 19:30:44
Load Avg: 3.48, 10.31, 18.44
CPU usage: 21.73% user, 29.86% sys, 48.40% idle
SharedLibs: 239M resident, 43M data, 13M linkedit.
MemRegions: 929204 total, 3494M resident, 39M private, 527M shared.
PhysMem: 8043M used (1965M wired), 148M unused.
VM: 93T vsize, 3153M framework vsize, 220843950(0) swapins, 228894984(0) swapouts.
Networks: packets: 10609880/8494M in, 6543712/4585M out.
Disks: 37609398/2929G read, 16655199/1072G written.

PID    COMMAND          %CPU TIME     #TH   #WQ #PORTS MEM   PURG  CMPRS PGRP  PPID  STATE    BOOSTS     %CPU_ME %CPU_OTHRS UID FAULTS    COW     MSGSENT   MSGRECV   SYSBSD    SYSMACH    CSW        PAGEINS IDLEW    POWER INSTRS CYCLES USER                   #MREGS RPRVT VPRVT VSIZE KPRVT KSHRD
99878  mobileassetd     0.0  00:24.97 3     1   112    3772K 0B    3476K 99878 1     sleeping *0[348]    0.00000 0.00000    0   127311    247     3756      2068      133038    6653       94559      397     886      0.0   0      0      root                   N/A    N/A   N/A   N/A   N/A   N/A
99437  WirelessRadioMan 0.0  00:02.01 2     1   49     1524K 0B    868K  99437 1     sleeping *0[1]      0.00000 0.00000    0   20958     207     5235      5387      62925     29647      28002      69      93       0.0   0      0      root                   N/A    N/A   N/A   N/A   N/A   N/A
...（以下省略）...
```

### topコマンドの見方

topコマンドの出力は、大きく分けて2つの部分で構成されています。

1. **システム全体の情報:**
   CPU使用率、メモリ使用量、ロードアベレージ、稼働時間などのシステム全体の状態が表示されます。
2. **プロセスごとの情報:**
   システム上で動作しているプロセスの一覧が表示されます。
   CPU使用率、メモリ使用量、プロセスID、コマンド名などの情報が表示されます。

これらについて、以下で説明します。

### システム全体の情報
* **Processes:** プロセス情報。システムで実行中のプロセスの総数と状態別の内訳を表示します。
* **Load Avg:** ロードアベレージ。過去の平均負荷を表示します。値が大きいほど、システムに負荷がかかっていることを示します。

**CPU使用率**

* **CPU usage:** CPU使用率。CPU時間がユーザー処理、システム処理、アイドル状態のどれに費やされているかをパーセンテージで表示します。

**メモリ使用量**

* **SharedLibs:** 共有ライブラリ。共有ライブラリが使用しているメモリ量, データセグメントサイズ,  リンクエディタ使用量を表示します。
* **MemRegions:** メモリ領域。システム全体のメモリ領域の数と使用状況を表示します。
* **PhysMem:** 物理メモリ。物理メモリの使用量と空き容量、そしてワイヤードメモリの量を表示します。

**仮想メモリとネットワーク**

* **VM:** 仮想メモリ。仮想メモリのサイズ、フレームワークの仮想メモリサイズ、スワップイン/スワップアウト回数などを表示します。
* **Networks:** ネットワーク。送受信されたネットワークパケット数とデータ量を表示します。

**ディスクI/O**

* **Disks:** ディスクI/O。ディスクの読み込みと書き込みの回数とデータ量を表示します。

これらの情報は、システム全体のリソース使用状況を把握し、パフォーマンスのボトルネックを特定したり、システムの安定稼働を維持するために役立ちます。


### プロセスごとの情報

**プロセス情報:**

* **PID:** プロセスID。各プロセスを一意に識別する番号。
* **COMMAND:** プロセス名。実行中のコマンドやプログラムの名前。

**リソース使用率:**

* **%CPU:** CPU使用率。そのプロセスが現在使用しているCPUリソースの割合。
* **TIME:** CPU時間。プロセスが開始してから使用した合計CPU時間。

**スレッドとワークキュー:**

* **#TH:** スレッド数。プロセスが使用しているスレッドの総数。
* **#WQ:** ワークキュー。プロセスに関連付けられているワークキューの数。

**メモリ使用量:**

* **MEM:** メモリ使用量。プロセスが現在使用している物理メモリの量。
* **PURG:** パージ可能メモリ。必要に応じてディスクに退避できるメモリ量。
* **CMPRS:** 圧縮メモリ。メモリ圧縮によって節約されたメモリ量。

**プロセスグループと状態:**

* **PGRP:** プロセスグループID。プロセスが属するプロセスグループのID。
* **PPID:** 親プロセスID。このプロセスを生成した親プロセスのID。
* **STATE:** プロセス状態。 running, sleeping, stopped, zombie など。

**その他:**

* **BOOSTS:** ブースト情報。プロセスの優先度ブーストに関する情報。
* **%CPU_ME:** 他プロセス起因CPU時間。他のプロセスによって消費されたCPU時間。
* **%CPU_OTHRS:** 自分起因CPU時間。このプロセスによって消費されたCPU時間。
* **UID:** ユーザーID。プロセスを実行しているユーザーのID。
* **FAULTS:** ページフォルト。プロセスがアクセスできなかったメモリページへのアクセス試行回数。
* **COW:** コピーオンライトフォルト。コピーオンライトによって発生したページフォルト数。
* **MSGSENT:** 送信メッセージ数。プロセスが他のプロセスに送信したメッセージの数。
* **MSGRECV:** 受信メッセージ数。プロセスが他のプロセスから受信したメッセージの数。
* **SYSBSD:** BSDシステムコール回数。プロセスが行ったBSDシステムコールの数。
* **SYSMACH:** Machシステムコール回数。プロセスが行ったMachシステムコールの数。
* **CSW:** コンテキストスイッチ回数。プロセスがCPUを他のプロセスに明け渡した回数。
* **PAGEINS:** ページイン回数。ディスクからメモリに読み込まれたページの数。
* **IDLEW:** アイドルウェイクアップ回数。プロセスがアイドル状態からウェイクアップされた回数。
* **POWER:** 電力使用量。プロセスが消費している電力の推定値。
* **INSTRS:** 命令実行数。プロセスが実行したCPU命令の数。
* **CYCLES:** CPUサイクル数。プロセスが消費したCPUサイクルの数。
* **USER:** ユーザー名。プロセスを実行しているユーザーの名前。

これらの情報は、システムの負荷状況やプロセスの動作状況を把握し、問題解決やパフォーマンスチューニングを行う際に役立ちます。


### まとめ

topコマンドは、システム管理者にとって欠かせないツールで、基本的な見方をマスターするだけでも、システムの状態を把握するのに非常に役立ちます。

topコマンドを使いこなし、一システムの状態を判断できるようになりましょう！