可視化で極めるプロセス管理：htopの使い方と活用術

## 概要

CPUのメモリ利用率を知るためにtopやfreeというコマンドはよく使われると思いますが、htopという可視化ツールもなかなか魅力的なツールだと思いました。


- エンジニアが好きそうなダッシュボード感がたまらない
- 特定のタスクについて絞り込む機能も魅力的
- プロセスの削除をGUIから容易に行える

特に、プロセスの削除に関しては複数のpythonタスクを実行中に、PIDを調べて一つ一つkillしていくのは手間ですし、ミスする可能性もありますが、htopなら容易に実行できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253735/50e43d23-1cc6-c5f0-cef2-f62b44df7c1c.png)


bashに標準装備のtopの画面はこんな感じです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253735/a745df32-8a0a-0894-a659-933629eba95e.png)


htop/top両方について言えることですが、使いこなせていない自信があります。
今回はそれぞれのバロメータが何を表しているのかこの機会に調べてみてアウトプットを試みようという企画です。


### htopのインストール

```bash

# macos
brew install htop

# linux
sudo apt install htop
```

## 知りたいこと

- topやhtopが示すインジゲータの意味
- topやhtopのオプション


というわけで調べていきます。htopベースでまずは記載していきます。

## 概要

htop起動画面で`h`を押すと、なんと説明が出てきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253735/cb74c4bb-f168-face-ec43-c1c80c4cae4e.png)



### CPU usage, Memory, Swp bar

今回使用しているCPUは4コア8スレットのXeon W-2123です。

```bash
Architecture:            x86_64
  CPU op-mode(s):        32-bit, 64-bit
  Address sizes:         46 bits physical, 48 bits virtual
  Byte Order:            Little Endian
CPU(s):                  8
  On-line CPU(s) list:   0-7
Vendor ID:               GenuineIntel
  Model name:            Intel(R) Xeon(R) W-2123 CPU @ 3.60GHz
    CPU family:          6
    Model:               85
    Thread(s) per core:  2
    Core(s) per socket:  4
    Socket(s):           1
    Stepping:            4
    CPU max MHz:         3900.0000
    CPU min MHz:         1200.0000
```

CPU使用率を示すインジケータは0-7までありますので、スレットベースでのインジケータであることがわかります。
i番目のThreadのCPU稼働率（リソースの使用率）がわかるようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253735/e2431e84-11bf-4f33-1404-b352fb9a215f.png)

htopによってThreadごとのCPUリソース使用率がわかるので、
例えばリソース使用が偏っている場合、並列に処理を実行することで高速化できる可能性があります。

色分けについては、

- 緑色：Normal（ユーザーモード）。通常のアプリケーション、ユーザースクリプト	ユーザーレベルでの計算処理
- 赤色：Kernel（カーネルモード）。ファイル操作、ネットワーク、デバイス制御	OSが重要な操作を管理
- 青色：Low-priority。バックグラウンドタスク、低優先度プロセス	リソース競争が少ない場合のみ実行

を表しているようです。

メモリとスワップメモリの説明は多くの解説記事があるので解説を譲りますが、概要を以下に記載します。

- **Memory/RAM**は、物理的なメインメモリ（Random Access Memory）のことを指します
- **Swap**は、物理メモリ（RAM）が不足した場合に、ハードディスクやSSDの一部を仮想的なメモリとして使用する仕組みです

| **項目**       | **Memory（RAM）**                          | **Swap**                                    |
|----------------|-------------------------------------------|--------------------------------------------|
| **位置**       | 物理メモリ（RAMモジュール）               | ストレージ（HDD/SSD）                       |
| **速度**       | 非常に高速                               | RAMに比べて遅い（特にHDDでは顕著）         |
| **揮発性**     | 揮発性（電源を切るとデータ消失）          | 非揮発性（データはストレージ上に残る）      |
| **用途**       | アクティブなプロセスのデータ保持          | RAM不足時のデータ退避                     |
| **容量**       | 限られている（数GB～数十GB）              | ストレージ容量に依存（必要に応じて増加可能）|
| **性能**       | パフォーマンスに直接影響                 | 頻繁に使用されるとシステムが遅くなる       |


`free -h`と入力するとシンプルにメモリとSwwapの使用率が確認できます。

```bash
           total        used        free      shared  buff/cache   available
Mem:            23Gi        13Gi       465Mi       200Mi       9.0Gi       8.8Gi
Swap:          2.0Gi       2.0Gi       0.0Ki
```



### PRI, NI, VIRT, RES, SHR, S, CPU%, MEM%, TIME+, Commandの意味

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253735/91e35723-372a-6e98-87af-dd331799f24e.png)


一つ一つ調べていった結果がこの通りです。

| **項目**  | **意味**                                          | **内容/詳細**                          |
|-----------|--------------------------------------------------|----------------------------------------|
| PRI       | プロセスの優先度                                  | 数値が小さいほど高優先度               |
| NI        | Nice値（優先度の調整値）                          | -20（高優先度）～19（低優先度）         |
| VIRT      | 仮想メモリ使用量                                  | 物理メモリ + スワップ                  |
| RES       | 物理メモリ使用量                                  | 現在RAM上に存在するデータ              |
| SHR       | 共有メモリ量                                      | 他のプロセスと共有しているリソース      |
| S         | プロセスの状態                                    | `R`, `S`, `D`, `Z`, `T`, `I`          |
| CPU%      | CPU使用率                                         | 単一コアに対する割合                   |
| MEM%      | メモリ使用率                                      | RESが物理メモリ全体に占める割合        |
| TIME+     | プロセスの合計CPU使用時間                         | 累計CPU時間                            |
| Command   | 実行中のコマンドまたはプロセス名                  | 実行ファイルやオプション情報を表示     |


#### PRI = Priority, プロセスの優先度 / NI = Nice, ニース値

優先度が1番高いジョブは0で表されており、私のサーバーだと50までジョブがありました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253735/b5665e5d-2b98-a6bb-73de-c32127dbd02b.png)

NIは相対的な優先度を表しているようです。


#### VIRT = Virtual Memory, 仮想メモリ量 / RES = Resident Memory, 物理メモリ量

VIRTの値で降順ソートすると1163GBととんでもない値になりましたが、そもそもメモリの容量（このサーバーの場合48GB）をはるかに超えており、？？？となりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253735/b421586f-f4f1-6f16-8eb7-67c9e1e78ec9.png)

上記は動画処理をしているケースですので、実際のメモリ使用量（RES）をみてみると、389MBとなっており想定の範囲内の数字となっています。


#### S = State, プロセスの状態

R: 実行中（Running）。
S: スリープ中（Sleeping）。
D: ディスク待ち（Uninterruptible Sleep）。
Z: ゾンビプロセス（Zombie）。
T: 停止中（Stopped）。
I: 無操作（Idle）。


後のCPU%, MEM%, TIME+, Commandは言葉の通りですので説明を省きます。


これでhtopの登場人物はあらかた理解できて気がします。
便利なコマンドですので、これからも積極的に活用していきたいと思います。


おしまい！