topコマンド

`自分用のリマインダなので注意`

# top コマンド

# 概要
システム全体の負荷情報やプロセス、CPU、メモリ、スワップなどの統計情報を取得する。  
主に監視の際に使用する。

各項目については以下に記載。

***
## ヘッダー

**Load Average**

```
top - 08:42:47 up 2min,  2 users,  load average: 2.76, 0.76, 0.27
```

| 項目 | 概要 |
|---|---|
| 08:42:47 | 現在時間 |
| up 2min | サーバーの稼働時間 |
| 2 users | ログインユーザー数 |
| load average: 2.76, 0.76, 0.27 | 左から、"1分"、"5分"、"15分"あたりの待機タスク数 |

***
**Task**

```
Tasks: 110 total,   7 running, 103 sleeping,   0 stopped,   0 zombie
```

| 項目 | 概要 |
|---|---|
| 110 total | 合計タスク数 |
| 7 running | 稼働中タスク |
| 103 sleeping | 待機中タスク |
| 0 stopped | 停止タスク |
| 0 zombie | ゾンビタスク |

> **ゾンビタスク**
> 既に処理が終了したにも関わらず残存し続ける(メモリを食い続ける)タスクのこと。  
> 親プロセスが`fork()`で子プロセスを作成し、子プロセスの処理が終了した際に`wait()`で子プロセスの内容を消去するが、ここで子プロセスに対してwait()が実行されない場合にその子プロセスが**ゾンビタスク**として残存し続けることになる。

***
**CPU**

CPUの使用時間割合を示す

```
Cpu(s): 77.1%us,  8.4%sy,  0.0%ni,  0.1%id, 14.3%wa,  0.0%hi,  0.2%si,  0.0%st
```
| 項目 | 概要 |
|---|---|
| xx.x%us | ユーザプロセスの使用時間 |
| xx.x%sy | システムプロセスの使用時間 |
| xx.x%ni | 実行優先度を変更したユーザプロセスの使用時間 |
| xx.x%id | アイドル状態の時間 |
| xx.x%wa | I/Oの終了待をしている時間 |
| xx.x%hi | ハードウェア割込み要求での使用時間 |
| xx.x%si | ソフトウェア割込み要求での使用時間 |
| xx.x%st | OS仮想化利用時に、ほかの仮想CPUの計算で待たされた時間 |

> ヘッダ行のCPU使用率は**OSを起動してからの平均値**なので、何事も無ければ無い程(急激にメモリを食うような処理をしないほど)数値が低く出る。  
> そのため、パフォーマンスの調査なのではヘッダのCPU使用率は見ないほうがいい。

***
**Memory/Swap**

```
Mem:  15144564k total,  1178112k used, 13966452k free,    28300k buffers
Swap:        0k total,        0k used,        0k free,   289928k cached
```

| 項目 | 概要 |
|---|---|
| **Memory** |
| total | メモリーの合計容量 |
| used | 使用中のメモリー容量 |
| free | 未使用のメモリー容量 |
| buffers | バッファとして使用されているメモリー容量 |
| **Swap** |
| total | スワップ領域の合計容量 |
| used | 使用中のスワップ領域の容量 |
| free | 未使用のスワップ領域の容量 |
| cached | キャッシュされているスワップ領域の容量 |

***
## プロセス一覧

```
  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
    1 root      20   0 19348 1528 1220 S  0.0  0.0   0:01.41 init
```

| 項目 | 概要 |
|---|---|
| PID | `Proccess ID` <br> プロセスID |
| USER | プロセスの実行ユーザー |
| PR | `priority` <br> プロセスの静的優先度(降順) |
| NI | プロセスの相対優先度 <br> 0を基準とし、**-20 ~ 19**で表示(昇順) |
| VIRT | `virtual` <br> プロセスの仮想メモリサイズ <br> **メモリ使用量 + スワップ使用量** |
| RES | `resistory` <br> プロセスの使用している物理メモリ容量 |
| SHR | `share` <br> プロセスの使用している共有メモリ容量 |
| S | `status` <br> プロセスの状態 |
| %CPU | CPU使用量 |
| %MEM | 物理メモリ使用量 |
| TIME+ | プロセスの実行時間 |
| COMMAND | プロセスで実行されているコマンド |

> %CPUは前回スクリーン更新からのタスクのCPU時間占有率を表すため、現在のCPU使用率を全体の容量との割合で算出している訳ではないため注意が必要。  
> 基本的に2回目以降の出力を見るようにする。

***
## プロセスのステータス

`プロセス一覧`の`S`について、ステータスの種類は以下

| コード | 状態 |
|---|---|
| S | スリープ |
| T | 停止中 |
| D | 割り込み不可 |
| N | ナイス値がプラス |
| \< | ナイス値がマイナス |
| R | 実行中 |
| Z | ゾンビ状態 |
| W | スワップアウト状態 |

***
# オプション

`値`欄についてはオプションに対して値を指定する必要があるもののみ記載する。  
無いものについては`-`とする。  

> 以下にすべてを書ききっているわけではないことと、バージョンによって使用できるコマンド/オプションも異なるため、参考程度に見ること。  
> 現在操作している端末で使用可能なオプションは`man [コマンド名]`で調べることが出来る。

| オプション | 概要 | 値 | 
|---|---|---|
| -a | メモリ使用順にソート | - |
| -p [PID] | 特定のプロセス監視 | プロセスID |
| -d [秒.ミリ秒] | 監視の更新タイミング | 更新間隔 |
| -n [整数] | 更新回数 | 繰り返し監視する回数指定 |
| -b | バッチモード <br> `-n`による回数指定が終了するもしくは`Ctrl + C`でキルされるまで実行し続ける | - |
| -s | セキュアモードで実行 | - |
| -u [USER] | 監視するユーザを名前もしくはIDで指定 | ユーザー名もしくはUSERの値 |
| -c | COMMAND欄をプログラム名の表示かコマンドラインの表示かを切り替える <br> 起動中は`c`で切り替え | - |
| -i | 何も実行していないアイドル状態のプロセスを表示するか切り替える <br> 起動中は`i`で切り替え |  |
| -S | 累計時間モード <br> 起動中は`S`で切り替え | - |
| -w [桁数] | 出力の幅 | [整数] |

***
# **Sample Code**

* とりあえず見たいとき

```console
$ top
```

* 5秒ごとに監視の更新をしたいとき

```console
$ top -d 5
```