はじめに
コンテキストスイッチ
CPU が実行中のプロセスを切り替えること。
コンテキストスイッチ数が増えるほど、切り替えのためのオーバーヘッドが発生している。
キャリアエラー
carrier error
NIC が物理的な信号を検出できなかった、もしくは異常な状態であったことを表す。
ケーブルの断線、スイッチポートの不良、NIC 自体の故障などが原因になる。
フレームエラー
frame error
受信した フレーム が正しい構造(フォーマット)になっていない場合に発生する。
電磁ノイズの多い環境で発生する。
オーバーラン
NIC が受信したデータを処理しきれず、受信したデータが受信用バッファである FIFO から溢れて破棄されること。
負荷が高すぎる、もしくは NIC の性能不足などが原因。
FIFO
file in file out
入力されたデータが、順番通りに出力されるキュー構造。
I / O 処理は CPU の処理と比較して桁違いに遅いため、データは一時保管用バッファに格納され CPU はバッファからデータを入出力する。
LIFO
last in first out
最後に入力されたデータが最初に取り出されるスタック構造。
$ uptime
$ uptime
$ uptime
21:20:09(現在時刻) up 21:05(稼働時間), 1 user(ログインユーザ数), load average: 0.00, 0.00, 0.00
load average
は $ top
コマンドと同じ。
$ top
$ top
top - 21:03:57(現在時刻) up 24 min(起動後の経過時間), 1 user(ログインユーザ数), load average(平均負荷): 0.00(1分間平均), 0.00(5分間平均), 0.00(15分間平均)
Tasks: 119 total(総プロセス数), 1 running(実行状態 or 実行可能状態), 118 sleeping(スリープ状態), 0 stopped(停止状態), 0 zombie(ゾンビ状態)
load average
の数値は、CPU 使用中のために待機しているプロセス数を表す。処理のつまり具合を意味する。
【1 CPU(シングルコア) × 1 個 = 1 コアが搭載されている場合】
→ 1.00
がフル稼働状態を意味する
【4 CPU(クアッドコア) × 2 個 = 8 コアが搭載されている場合】
→ 8.00
がフル稼働状態を意味する
%Cpu(s)(CPU 使用時間の割合): 0.0 us(user:ユーザ), 0.0 sy(system:カーネル), 0.0 ni(nice:nice 値が変更されたプロセス),100.0 id(idle:アイドル状態), 0.0 wa(io wait:I/O 待ち), 0.0 hi(hardware irq:ハードウェア割り込み要求), 0.0 si(software irq:ソフトウェア割り込み要求), 0.0 st(steal:ゲスト OS が CPU を割り当てられなかった時間)
略称 | 説明 |
---|---|
us |
user ユーザプロセスが CPU を使った時間。通常のアプリケーションなど。 |
sys |
system カーネルが CPU を使った時間。システムコール やドライバ処理。 |
ni |
nice nice 値が変更されたユーザプロセスの処理時間( $ nice )。 |
id |
idle アイドル時間。CPU が完全に暇な状態。 |
wa |
io wait ディスクやネットワーク I / O 待ち時間。CPU は暇だが、I / O が終わるのを待っている状態。 |
hi |
hardware interrupt request ハードウェア割り込み処理時間。NIC やディスクからの割り込みなど。 |
si |
software interrupt request ソフトウェア割り込み処理時間。カーネル内部イベントなど。 |
st |
steal 仮想マシン(VM)に割り当てられたはずの CPU 時間が、実際にはホスト側で使われていて奪われた(steal)時間。 0 % であれば、要求通り CPU が割り当てできている状態。 |
MiB Mem(メモリ) : 3902.6 total, 3445.0 free, 288.7 used, 315.3 buff/cache
MiB Swap(スワップ): 0.0 total, 0.0 free, 0.0 used. 3613.8 avail Mem
PID(プロセス ID) USER(ユーザ名) PR(優先度) NI(nice 値) VIRT(使用中の仮想メモリ) RES(使用中の実メモリ) SHR(共有メモリ) S(プロセスの状態) %CPU(CPU 使用率) %MEM(物理メモリの使用率) TIME+(プロセス起動後の CPU 使用総時間) COMMAND(実行コマンド)
S |
説明 |
---|---|
R |
Running 実行中、または実行可能状態 |
S |
Sleeping 待機状態 |
D |
Uninterruptible Sleep 割り込み不可スリープ( $ kill で終了できない) |
T |
Stopped 停止中(シグナル SGISTOP などで停止された状態) |
t |
Tracing Stop トレース停止中 |
Z |
Zombie ゾンビ状態 |
I |
Idle アイドル状態 |
実行例
$ top
top - 20:41:33 up 2 min, 1 user, load average: 0.02, 0.01, 0.00
Tasks: 128 total, 1 running, 127 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.1 sy, 0.0 ni, 99.9 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 3902.6 total, 3445.6 free, 290.3 used, 312.9 buff/cache
MiB Swap: 0.0 total, 0.0 free, 0.0 used. 3612.2 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
60 root 20 0 0 0 0 I 0.3 0.0 0:00.05 kworker/3:1-events
1109 kei 20 0 12216 5248 3200 R 0.3 0.1 0:00.23 top
1 root 20 0 21900 11844 8516 S 0.0 0.3 0:00.91 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 0:00.00 pool_workqueue_release
キー押下でインタラクティブモードに切り替えができる。
キー | 動作 |
---|---|
q |
quit 終了する |
k |
kill プロセスに kill シグナルを送信する(シグナル) |
u |
user ユーザを指定する |
d , s
|
delay, seconds 実行間隔を指定する |
f |
fields 表示項目を選択、変更する |
o |
order 並べ替え対象の列を選ぶ |
I |
idle, info 平均負荷 IRIX mode on/off を切り替える on:CPU 数 × 100%(1 CPU 当たり 100 %) off:最大 100%(割合) |
i |
idle CPU を使用中のプロセスだけを表示する(idle 状態の表示/非表示) |
m |
memory メモリ、スワップを表示形式を切り替える |
t |
task, threads プロセスと CPU 状態の表示/非表示を切り替える |
M |
memory メモリ使用率順に並び替える |
P |
processor CPU 使用率順に並び替える |
T |
time 起動時間順に並び替える |
N |
number PID 順に並び替える |
< , >
|
並び順を変更する |
h , ?
|
help ヘルプを表示する |
$ top -d 秒数
$ top -n 回数 # 指定回数終了後、top は自動終了
$ top -u ユーザ名
$ top -p PID
-b
をつけると、バッチモードと呼ばれる「非対話モード」で実行することができる。
対話モードでは q
で実行を終了できるが、バッチモードでは Ctrl
+ C
で終了させるしかない。
対話モードのようにインタラクティブな操作ができないため、-n
と併せて使用して出力回数を指定してファイルに書き込むなどの用途で利用される。
$ top -n 5 -b > ログファイル
$ free
$ free
$ free
total used free shared buff/cache available
Mem: 3996212 383316 1849244 5340 1960396 3612896
Swap: 0 0 0
Mem |
意味 |
---|---|
total |
物理メモリの総量 |
used |
使用中のメモリサイズ(キャッシュ、バッファ含む) |
free |
未使用の空きメモリサイズ |
shared |
tmpfs など共有メモリで使われているサイズ |
buff/cache |
バッファ、キャッシュで使われているサイズ(使用後は開放可能) |
available |
アプリケーションが新たに利用可能なメモリ量(実用上の空きメモリ) |
Linux では「余ったメモリはキャッシュに使う」設計になっている。そのため、used
が多くてもメモリが本当に不足しているとは限らない。
そのため、実用上は available
を見た方が良い。
Mem |
意味 |
---|---|
total |
スワップ領域の合計サイズ |
used |
使用中のスワップ領域 |
free |
スワップ領域の空きサイズ |
$ free -h
$ free -b
$ free -k
$ free -m
$ free -o
$ free -s 秒数
$ iotop
プロセスごとの I / O 情報を $ top
と同じように表示する。
$ iotop
$ vmstat
vurtual memory statistics
$ vmstat
$ vmstat 秒間隔 出力回数
$ vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- -------cpu-------
r b swpd free buff cache si so bi bo in cs us sy id wa st gu
0 0 0 1894800 112300 1809588 0 0 52 254 79 0 0 0 100 0 0 0
項目 | 意味 |
---|---|
procs |
r :実行待ちプロセス数(ready, runnable)b :I / O 待ちのためブロック状態のプロセス数(blocked)。0 が理想の状態 |
memory (KB) |
swapd :使用中のスワップ領域(swapped)free :空きメモリbuff :バッファ使用中のメモリ(buffer)cache :ページキャッシュに使用されているメモリ |
swap (KB / 秒) |
si :ディスク(スワップ)→メモリ にスワップインされているメモリ(swap in)so :メモリ→ディスク(スワップ) へスワップアウトされているメモリ(swap out) |
io (ブロック / 秒) |
bi :ブロックデバイス からの読込み量(block in)bo :ブロックデバイスへの書込み量(block out) |
system (回数 / 秒) |
in :カーネル内の割り込み数(interrupt)cs :コンテキストスイッチ数(context switch) |
cpu (%) |
合計が 100 % になるus :ユーザプロセスが CPU を使用している時間(user)sy :カーネルが CPU を使用している時間(system)id :CPU がアイドル状態の時間(idle)wa : ディスク I / O 待ちの時間(wait)st :他の仮想マシンに CPU を奪われていた時間(steal) |
$ iostat
input output statistics
I / O 性能やディスク使用状況を調べるためのツール。
$ iostat
引数なしの場合、起動〜現在までの統計情報が表示される。引数を与えた場合、2 回目の出力以降は、前回出力との差分が表示される。
$ vmstat 秒間隔 出力回数
$ iostat -d
$ iostat -c
$ iostat -p
$ iostat -k
$ iostat -m
$ iostat -t
$ iostat
Linux 6.8.0-62-generic (ホスト名) 07/08/25 _aarch64_ (4 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.07 0.02 0.11 0.02 0.00 99.78
Device tps kB_read/s kB_wrtn/s kB_dscd/s kB_read kB_wrtn kB_dscd
dm-0 6.58 23.20 146.25 242.12 638249 4022916 6660148
loop0 0.00 0.00 0.00 0.00 14 0 0
vda 4.51 31.05 152.19 327.21 854182 4186325 9000620
avg-cpu: %user %nice %system %iowait %steal %idle
0.07 0.02 0.11 0.02 0.00 99.78
処理時間の割合(average)が表示される。合計が 100 % となる。
項目 | 意味 |
---|---|
%user |
ユーザプロセスの CPU 使用率 |
%nice |
nice 値が変更されたプロセスの CPU 使用率 |
%system |
カーネルの CPU 使用率 |
%iowait |
I / O 待ち時間の割合 |
%steal |
他の仮想マシンの CPU を奪われた(steal)割合 |
%idle |
アイドル状態の割合 |
Device tps kB_read/s kB_wrtn/s kB_dscd/s kB_read kB_wrtn kB_dscd
dm-0 6.58 23.20 146.25 242.12 638249 4022916 6660148
loop0 0.00 0.00 0.00 0.00 14 0 0
vda 4.51 31.05 152.19 327.21 854182 4186325 9000620
項目 | 意味 |
---|---|
Device |
デバイス名 |
tps |
transfer per second 1 秒あたりの I / O 転送要求回数(読み書きの合計数) |
kB_read/s |
デバイスからの 1 秒あたりの読み込み量(KB) |
kB_wrtn/s |
written デバイスへの 1 秒あたりの書き込み量(KB) |
kB_read |
デバイスからの読み込み量合計(KB) |
kB_wrtn |
written デバイスへの書き込み量合計(KB) |
$ netstat
$ sar
system activity reporter
総合的なシステムリソースの記録・監視・レポートツール。
$ top
や $ iostat
、$ vmstat
などが「リアルタイムの監視」に強いのに対し、$ sar
は 過去の情報を分析できる という点が特徴。
sysstat
パッケージから提供される(パッケージ管理)。
/var/log/sysstat/
ディレクトリ配下には定期的に $ sadc
によって収集されたログが蓄積されていて、$ sar
によってこのログを確認することができる。
$ sar
$ sar
Linux 6.8.0-62-generic (ホスト名) 07/08/25 _aarch64_ (4 CPU)
00:12:00 CPU %user %nice %system %iowait %steal %idle
00:29:45 all 0.07 0.00 0.16 0.03 0.00 99.73
00:46:49 all 0.03 0.00 0.13 0.00 0.00 99.84
01:00:08 all 0.04 0.00 0.15 0.02 0.00 99.79
...
項目 | 意味 |
---|---|
%user |
ユーザプロセスの CPU 使用率 |
%nice |
nice 値が変更されたプロセスの CPU 使用率 |
%system |
カーネルの CPU 使用率 |
%iowait |
I / O 待ち時間の割合 |
%steal |
他の仮想マシンの CPU を奪われた(steal)割合 |
%idle |
アイドル状態の割合 |
$ sar -n DEV
Linux 6.8.0-62-generic (ホスト名) 07/08/25 _aarch64_ (4 CPU)
00:12:00 IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s %ifutil
00:29:45 lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
00:29:45 enp0s1 0.98 0.99 0.05 1.07 0.00 0.00 0.00 0.00
00:46:49 lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
...
項目 | 意味 |
---|---|
hh:mm:ss |
観測時刻 |
IFACE |
interface インターフェース名 |
rxpck/s |
receive package 受信パケット数(パケット / 秒) |
txpck/s |
transmit packet 送信パケット数(パケット / 秒) |
rxkB/s |
receive 受信パケット数(KB / 秒) |
txkB/s |
transmit 送信パケット数(KB / 秒) |
rxcmp/s |
rx compressed packet 圧縮された受信パケット数(パケット / 秒) |
txcmp/s |
tx compressed packet 圧縮された送信パケット数(パケット / 秒) |
rxmcst/s |
rx multiacst マルチキャスト受信パケット数(パケット / 秒) |
%ifuntil |
interface utilization ネットワークインターフェースの帯域使用率 使用できる帯域に占める割合 |
$ sar -n EDEV
Linux 6.8.0-62-generic (ホスト名) 07/08/25 _aarch64_ (4 CPU)
00:12:00 IFACE rxerr/s txerr/s coll/s rxdrop/s txdrop/s txcarr/s rxfram/s rxfifo/s txfifo/s
00:29:45 lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
00:29:45 enp0s1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
00:46:49 lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
...
項目 | 意味 |
---|---|
hh:mm:ss |
観測時刻 |
IFACE |
interface インターフェース名 |
rxerr/s |
receive error 受信時のエラー数(パケット / 秒) 発生時は、ネットワーク機器、ドライバの問題を疑う。 |
txerr/s |
transmit error 送信時のエラー数(パケット / 秒) 発生時は、ネットワーク機器、ドライバの問題を疑う。 |
coll/s |
collision パケット衝突数(パケット / 秒) |
rxdrop/s |
receive dropped バッファ不足により破棄(取りこぼし)された「受信」パケット数(パケット / 秒) |
txdrop/s |
transmit dropped バッファ不足により破棄(取りこぼし)された「送信」パケット数(パケット / 秒) |
txcarr/s |
transmit carrier error 送信時の キャリアエラー 数(パケット / 秒) 発生時には、NIC の物理層でエラーが発生している(ケーブル不良、スイッチポート接続誤り)。 |
txfram/s |
transmit frame error 送信時の フレームエラー 数(パケット / 秒) |
rxfifo/s |
receive FIFO 受信時 FIFO の オーバーラン 数(パケット / 秒) |
txfifo/s |
transmit FIFO 送信時 FIFO のオーバーラン数(パケット / 秒) |
$ sar 秒間隔 表示回数
$ sar -f ログファイル # `/var/log/sysstat/` ディレクトリ配下のファイル
$ sar -c # 私の環境では実行できませんでした
プロセスやスレッドは、システムコール の fork()
や clone()
によって生成される。
# sar -A
# sar -u
Linux 6.8.0-62-generic (ホスト名) 07/09/25 _aarch64_ (4 CPU)
00:00:05 CPU %user %nice %system %iowait %steal %idle
00:10:05 all 0.14 0.13 0.11 0.02 0.00 99.60
...
# sar -r
Linux 6.8.0-62-generic (ホスト名) 07/09/25 _aarch64_ (4 CPU)
00:00:05 kbmemfree kbavail kbmemused %memused kbbuffers kbcached kbcommit %commit kbactive kbinact kbdirty
00:10:05 1860116 3596964 138720 3.47 116868 1647552 257036 6.43 254648 1538084
...
# sar -b
Linux 6.8.0-62-generic (ホスト名) 07/09/25 _aarch64_ (4 CPU)
00:00:05 tps rtps wtps dtps bread/s bwrtn/s bdscd/s
00:10:05 1.51 0.00 1.51 0.00 0.00 999.63 0.00
...
# sar -d
Linux 6.8.0-62-generic (ホスト名) 07/09/25 _aarch64_ (4 CPU)
00:00:05 DEV tps rkB/s wkB/s dkB/s areq-sz aqu-sz await %util
00:10:05 loop0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
00:10:05 vda 1.51 0.00 499.82 0.00 330.28 0.01 3.22 0.05
...
# sar -w
Linux 6.8.0-62-generic (ホスト名) 07/09/25 _aarch64_ (4 CPU)
00:00:05 proc/s cswch/s
00:10:05 0.88 64.68
00:20:15 0.02 48.92
...
# sar -s hh:mm:ss -e hh:mm:ss
# sar -n DEV
$ sadf
system activity data format
$ sar
で確認できるログを CSV や JSON 形式で出力することができる。
$ sadf -d
$ sadf -c
$ sadf -j
$ sadf -x
$ sadf [sadf のオプション] -- [sar のオプション]
$ ps
$ df
ツール
Nagios
ナギオス
【できること】
- サーバ・ネットワーク機器の死活監視ができる(
$ ping
) - Web サーバの応答が監視できる(HTTP ステータスを確認)
- プロセスやサービスの稼働状態を監視できる
- 障害検出時にメールやスクリプトで通知してくれる
【特徴】
- オープンソース(Nagios Core)
- 拡張性が高い(プラグインが豊富)
- ブラウザにグラフを表示することができる
- 異常発生時にメールでお知らせ
【利用場面】
- サーバの稼働監視(死活、CPU 負荷、ディスク使用率)
- 異常検出時の通知(例:Web サイトの停止、DB サーバ過負荷の検知)
MRTG
multi router traffic grapher
【できること】
- SNMP を使ってネットワーク機器のトラフィック量を定期的に収集できる
- 帯域使用量の推移を グラフ画像(PNG)として生成できる
【特徴】
- Web サーバを介してグラフを HTML ページに自動出力できる
【利用場面】
- 定期的にネットワーク機器の HTTP ポート、TCPポートにアクセスして応答をチェック
Cacti
カクティ
【できること】
- SNMP 経由でネットワーク機器のトラフィックや稼働状況を監視できる
- RRD(round robin database)形式のデータを介してブラウザにグラフ表示できる
【特徴】
- Web UI が見やすくて、設定、管理がしやすい
【利用場面】
- ルータやスイッチのインターフェース帯域使用量を可視化する
- 日々の上り / 下り帯域の使用状況をグラフで確認する
lcinga2
アイシンガ2
ネットワークモニタリングツール
【できること】
- ホストやサービスの死活監視ができる
- システムリソース(CPU、メモリ、ディスク)の監視ができる
【特徴】
- オープンソース
- REST API による外部連携ができる
collected
コレクテッド
【できること】
- CPU、メモリ、ディスク I / O、ネットワークなどの統計情報を定期的に収集できる
- RRD(round robin database)や CSV などに保存、Grafana などと連携して可視化できる
【特徴】
- 軽量なデーモンとして稼働
- C 言語で作られている
【利用場面】
- サーバの負荷状況を収集して、時系列のグラフを作成、Grafana で表示する