free, top コマンド

この記事は [Linux コマンド 全部オレ Advent Calendar 2017](https://adventar.org/calendars/2630) の16日目の記事です。

# free

```
NAME
       free - Display amount of free and used memory in the system

SYNOPSIS
       free [options]

DESCRIPTION
       free  displays  the total amount of free and used physical and swap memory in the system, as well as the buffers and caches used by
       the kernel. The information is gathered by parsing /proc/meminfo. The displayed columns are:

       total  Total installed memory (MemTotal and SwapTotal in /proc/meminfo)

       used   Used memory (calculated as total - free - buffers - cache)

       free   Unused memory (MemFree and SwapFree in /proc/meminfo)

       shared Memory used (mostly) by tmpfs (Shmem in /proc/meminfo, available on kernels 2.6.32, displayed as zero if not available)

       buffers
              Memory used by kernel buffers (Buffers in /proc/meminfo)

       cache  Memory used by the page cache and slabs (Cached and Slab in /proc/meminfo)

       buff/cache
              Sum of buffers and cache

       available
              Estimation of how much memory is available for starting new applications, without swapping. Unlike the data provided by  the
              cache  or  free  fields,  this  field  takes  into account page cache and also that not all reclaimable memory slabs will be
              reclaimed due to items being in use (MemAvailable in /proc/meminfo, available on kernels 3.14, emulated on kernels  2.6.27+,
              otherwise the same as free)
```
現在のメモリーの使用状況を知ることができる。/proc/meminfo を整形して表示するコマンド。

## 主な使い方

```
[sinsengumi ~]$ free -wh
              total        used        free      shared     buffers       cache   available
Mem:           3.7G        273M        1.8G        560K        1.9M        1.6G        3.1G
Swap:          4.0G          0B        4.0G
```
`-w` を指定すると、`buffers` と `cache` を別カラムで表示する。

| 用語        | 意味                           |
|------------|-------------------------------------------|
| total      | OS が認識している物理的なメモリサイズ（RAID カードや NIC などでメモリが使われておりその分は計上されていない） |
| used       | 使用しているメモリサイズ（`total - free - buffers - cache`）つまり、buffers と cache は含まない|
| free       | 空きメモリサイズ（buffers と cache は含まれていない） | 
| shared     | 共有メモリに割り当てられたメモリサイズ | 
| buffers | バッファキャッシュに割り当てられたメモリサイズ（バッファキャッシュとはブロックデバイス用のキャッシュ） | 
| cache  | ページキャッシュに割り当てられたメモリサイズ（ページキャッシュはファイルに対するキャッシュ） | 
| available  | 新しいアプリがスワップせずに使えるメモリサイズ | 
| Swap | スワップに割り当てたメモリサイズ（スワップとはディスク領域の一部をメモリとして利用する技術なので、実態はディスクが 4.0G 割り当てられているということ）

OS は使い続けるほど、メモリにキャッシュを割り当てる。そのため free はどんどん減っていく。
なので、free が無いからといってメモリが枯渇しているということではない。buffers と cache の値も見る必要がある。

以前の free には `-/+ buffers/cache` 行があって、実際に使用できる空きメモリ（buffers と cache を考慮した）はこちらの free カラムを見ていたが、最新の CentOS7 では無くなって available カラムが追加されている。基本的に今どれくらいのメモリが空いてるのかはこれを見ればよさそう（キャッシュも考慮してるみたい）

# top

```
NAME
       top - display Linux processes

SYNOPSIS
       top -hv|-bcHiOSs -d secs -n max -u|U user -p pid -o fld -w [cols]

       The traditional switches `-' and whitespace are optional.

DESCRIPTION
       The  top program provides a dynamic real-time view of a running system.  It can display system summary information as well as a list of processes or
       threads currently being managed by the Linux kernel.  The types of system summary information shown and the types, order  and  size  of  information
       displayed for processes are all user configurable and that configuration can be made persistent across restarts.

       The  program provides a limited interactive interface for process manipulation as well as a much more extensive interface for personal configuration
        --  encompassing every aspect of its operation.  And while top is referred to throughout this document, you are free to name the  program  anything
       you wish.  That new name, possibly an alias, will then be reflected on top's display and used when reading and writing a configuration file.
```
システム全体の負荷やプロセス, CPU, メモリ, スワップの統計情報を表示する。

## 主な使い方

```
[sinsengumi ~]$ top
top - 15:49:30 up 26 days,  4:20,  2 users,  load average: 0.00, 0.01, 0.05
Tasks:  90 total,   1 running,  89 sleeping,   0 stopped,   0 zombie
%Cpu(s): 18.7 us,  0.7 sy,  0.0 ni, 80.6 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  1883472 total,   151348 free,   442012 used,  1290112 buff/cache
KiB Swap:  2097148 total,  2097096 free,       52 used.  1204188 avail Mem

   PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
  2027 root      20   0  767764  78556   8508 S 18.9  4.2  84:48.73 ds_agent
  1653 root      20   0  913600  17796   3780 S  0.3  0.9  94:18.24 box
101960 root      20   0  285792  68272   3060 S  0.3  3.6  28:20.82 ruby
     1 root      20   0   51744   4060   2504 S  0.0  0.2   3:15.58 systemd
     2 root      20   0       0      0      0 S  0.0  0.0   0:00.17 kthreadd
     3 root      20   0       0      0      0 S  0.0  0.0   0:31.20 ksoftirqd/0
     5 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 kworker/0:0H
     7 root      rt   0       0      0      0 S  0.0  0.0   0:00.00 migration/0
     8 root      20   0       0      0      0 S  0.0  0.0   0:00.00 rcu_bh
     9 root      20   0       0      0      0 S  0.0  0.0   1:10.49 rcu_sched
    10 root      rt   0       0      0      0 S  0.0  0.0   0:08.48 watchdo
```
デフォルトでは3秒間隔で表示が更新される。

### 1行目

```
top - 15:49:30 up 26 days,  4:20,  2 users,  load average: 0.00, 0.01, 0.05
```

- 15:49:30
    - 現在時刻
- up 26 days,  4:20
    - 稼働時間
- 2 users
    - ログインユーザ数
- load average: 0.00, 0.01, 0.05
    - 1分,5分,15分間の単位時間あたりの平均待ちタスク数。

ロードアベレージが、CPU のコア数以上になっていると負荷が高い。
ちなみに CPU のコア数は以下のように取る。

```
[sinsengumi ~]$ cat /proc/cpuinfo | grep processor | wc -l
2
```

### 2行目

```
Tasks:  90 total,   1 running,  89 sleeping,   0 stopped,   0 zombie
```

タスク（= プロセス）の情報を表示している。

| 項目       | 意味          |
|:----------|:--------------|
| total	    | タスクの合計数   |
| running   | 稼働中のタスク数 |
| sleeping  | 待機中のタスク数 |
| stopped   | 停止タスク数    |
| zombie    | ゾンビタスク数   |

ちなみに、スレッドの数は以下のような感じで取ることができる。

```
[sinsengumi ~]$ cat /proc/99020/status | grep -i thread
Threads:   2
[sinsengumi ~]$ ls /proc/99020/task
99020  99021
[sinsengumi ~]$ ls /proc/99020/task | wc -l
2
```


### 3行目

```
%Cpu(s): 18.7 us,  0.7 sy,  0.0 ni, 80.6 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
```

CPU 使用率を表示している。
man には、以下のように記載があるので、ほぼほぼリアルタイムの CPU 使用率と思ってよさそう（Web の記事を見ると、`OS を起動してからの平均値` と書いてあったりするので注意。昔はそうだった？）

```
Line 2 shows CPU state percentages based on the interval since the last refresh.
```

| 項目       | 意味          |
|:----------|:--------------|
| us | ユーザプロセスの使用時間   |
| sy | システムプロセスの使用時間   |
| ni | 実行優先度を変更したユーザプロセスの使用時間 |
| id | アイドル状態の時間                      |
| wa | I/O の終了待をしている時間    |
| hi | ハードウェア割込み要求での使用時間   |
| si | ソフトウェア割込み要求での使用時間 |

また、top 中に `1` を押すと、CPU のコア毎の値が見れるようになる。

```
%Cpu0  :  0.3 us,  0.3 sy,  0.0 ni, 99.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu1  :  0.3 us,  0.3 sy,  0.0 ni, 99.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
```

### 4,5行目

```
KiB Mem :  1883472 total,   151348 free,   442012 used,  1290112 buff/cache
KiB Swap:  2097148 total,  2097096 free,       52 used.  1204188 avail Mem
```

メモリーの使用状況を表示している。

| 項目    | 意味          |
|:--------|:--------------|
| total	  | トータルのメモリサイズ |
| free	  | 使用していないメモリサイズ |
| used	  | 使用中のメモリメモリサイズ |
| buff/cache | バッファキャッシュ/ページキャッシュとして割り当てられたメモリサイズ |
| avail Mem  | 新しいアプリがスワップせずに使えるメモリサイズ |
 

### 7行目以降

```
   PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
  2027 root      20   0  767764  78556   8508 S 18.9  4.2  84:48.73 ds_agent
  1653 root      20   0  913600  17796   3780 S  0.3  0.9  94:18.24 box
101960 root      20   0  285792  68272   3060 S  0.3  3.6  28:20.82 ruby
     1 root      20   0   51744   4060   2504 S  0.0  0.2   3:15.58 systemd
     2 root      20   0       0      0      0 S  0.0  0.0   0:00.17 kthreadd
```

プロセスの一覧を表示している。

| 項目     | 意味 | 説明 |
|:--------|:--|:--|
| PID     | プロセス ID | プロセス ID |
| USER    | ユーザ | プロセスを実行しているユーザ |
| PR      | 優先度 | プロセスの静的優先度(数字が低い程優先度は高い) |
| NI      | 相対優先度 | プロセスの相対的優先度（相対的優先度）-20（最高）～19（最低）|
| VIRT    | 仮想メモリ | Virtual Image (KiB)。確保された（まだ使われてない可能性もある）仮想メモリ全て。スワップしたメモリ使用量を含む。 |
| RES     | 物理メモリ | Resident Size (KiB)。 スワップしていない、使用した物理メモリのサイズ。 |
| SHR     | 共有メモリ | Shared Memory (KiB)。 他のプロセスと共有される可能性のあるメモリのサイズ。 |
| S       | 状態 | Process Status。 以下のいずれの状態であるかを示している。<br>D : 割り込み不能<br>R : 実行中<br>S : スリープ状態<br>T : 停止中<br>Z : ゾンビプロセス |
| %CPU    | CPU 使用率 | タスクの CPU 使用率 |
| %MEM    | メモリ使用率 | Memory Usage (RES)。タスクの物理メモリの使用率 |
| TIME+   | 実行時間 | タスクが起動してから利用した CPU 時間の総量（なので sleep してるだけだと増えない） |
| COMMAND | 実行時間 | 現在実行中のコマンド名 |