Linux
Linuxコマンド

free, top コマンド

この記事は Linux コマンド 全部オレ Advent Calendar 2017 の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 を指定すると、bufferscache を別カラムで表示する。

用語 意味
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。 以下のいずれの状態であるかを示している。
D : 割り込み不能
R : 実行中
S : スリープ状態
T : 停止中
Z : ゾンビプロセス
%CPU CPU 使用率 タスクの CPU 使用率
%MEM メモリ使用率 Memory Usage (RES)。タスクの物理メモリの使用率
TIME+ 実行時間 タスクが起動してから利用した CPU 時間の総量(なので sleep してるだけだと増えない)
COMMAND 実行時間 現在実行中のコマンド名