Linuxのパフォーマンス関連の問題では、まずは全体像を把握することが大切になってきます。そこで、1分でできる簡単なチェックリストをもとに、どのような情報を把握しておくべきか、サンプルと一緒に確認してみましょう。
uptime
$ uptime
14:10:20 up 3:50, 4 users, load average: 0.10, 0.04, 0.00
uptimeは、システムがどのぐらい起動しているか確認するコマンドです。
また、システムのロードアベレージが、1分、5分、15分の間隔で表示されます。
この例では、システムのロードアベレージの増加が確認できます。
3番目(15分)に表示されるロードアベレージが高い数値で、1番目(1分)が小さい場合には、ログインした時点で、問題をリアルタイムに把握するには「時すでに遅し」という可能性が高いです。
理由は、直近1分のロードアベレージが低い値の場合には、すでに状況が改善しているからです。
dmesg|tail または journalctl -n 10
過去10のシステムメッセージを表示し、エラーなどがないか確認してみましょう。
RHEL8では、カーネルのリングバッファは、systemd-journaldによって収集されるので、journalctlコマンドでシステムのメッセージを表示することができます。
# journalctl -n 10
...
Mar 30 17:55:45 rhel8u2.localdomain systemd[1]: Starting Network Manager Script Dispatcher Service...
Mar 30 17:55:46 rhel8u2.localdomain dbus-daemon[932]: [system] Successfully activated service 'org.freedesktop.nm_dispatcher'
Mar 30 17:55:46 rhel8u2.localdomain systemd[1]: Started Network Manager Script Dispatcher Service.
Mar 30 18:01:01 rhel8u2.localdomain CROND[3252]: (root) CMD (run-parts /etc/cron.hourly)
Mar 30 18:01:01 rhel8u2.localdomain run-parts[3255]: (/etc/cron.hourly) starting 0anacron
Mar 30 18:01:01 rhel8u2.localdomain run-parts[3261]: (/etc/cron.hourly) finished 0anacron
Mar 30 18:12:47 rhel8u2.localdomain systemd[1852]: Started snap.stress-ng.stress-ng.3aab1ebc-aa66-4617-b917-70f25a8c7848.scope.
Mar 30 18:12:47 rhel8u2.localdomain stress-ng[3362]: invoked with '/snap/stress-ng/5624/usr/bin/stress-n' by user 0
Mar 30 18:12:47 rhel8u2.localdomain stress-ng[3362]: system: 'rhel8u2.localdomain' Linux 4.18.0-240.10.1.el8_3.x86_64 #1 SMP Wed Dec>
Mar 30 18:12:47 rhel8u2.localdomain stress-ng[3362]: memory (MB): total 1816.66, free 771.75, shared 10.54, buffer 7.06, swap 2048.0>
vmstat 1
vmstat 1では、1秒ごとに仮想メモリの統計を表示します。
$ vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 562160 7228 681000 0 0 38 3 22 29 0 0 99 0 0
0 0 0 562108 7228 681000 0 0 0 0 60 80 1 0 100 0 0
0 0 0 562108 7228 681000 0 0 0 0 47 57 0 1 99 0 0
0 0 0 561820 7228 681016 0 0 0 287 448 481 7 2 91 1 0
0 0 0 561820 7228 681016 0 0 0 0 67 71 0 0 100 0 0
0 0 0 561852 7228 681016 0 0 0 0 94 112 0 1 100 0 0
2 0 0 555932 7228 687064 0 0 6040 0 183 143 3 1 94 3 0
0 0 0 555932 7228 687064 0 0 0 0 28 40 0 0 100 0 0
特に、確認するポイントは、次の項目です。
r は、ランタイム待ちのプロセス数です。
free は、空きメモリの量(Kbytes)です。
si so は、swap-inとswap-outの略です。これらの値がゼロでない場合は、メモリが不足しています。
スワップインとは、一時的にハードディスクに書き出した内容を再度メモリに読み込むことです。
スワップアウトとは、メモリの中身を一時的にハードディスクに書き出すことです。
メモリ内のどうでもいい内容をハードディスクに一時的にしまうことで(ハードディスクの一部をメモリっぽく使う)、プログラムに対して実際のメモリより大きなメモリがあると錯覚させることがあるのです。
us sy id wa st は、CPUの総時間に対する内訳です。 具体的には、次のようになります。
us: カーネルコード以外の実行に使用した時間 (ユーザー時間、nice 時間を含む)。
sy: カーネルコードの実行に使用した時間 (システム時間)。
id: アイドル時間。Linux 2.5.41 以前では、IO 待ち時間を含んでいる。
wa: IO 待ち時間。Linux 2.5.41 以前では、0 と表示される。
st: 仮想マシンから盗まれた時間。
ここで、usの値が大きい場合は、ユーザレベルのコードのプロファイルをして、解析することになります。
mpstat -P ALL 1
mpstatは、CPUごとに使用率や割り込みの統計情報を表示します。sysstatパッケージに収録されているので、インストールされていない場合は、事前にインストールしておきましょう。
$ mpstat -P ALL 1
...
04:19:34 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
04:19:35 PM all 47.50 0.00 1.50 1.00 0.00 0.00 0.00 0.00 0.00 50.00
04:19:35 PM 0 95.00 0.00 3.00 2.00 0.00 0.00 0.00 0.00 0.00 0.00
04:19:35 PM 1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
-P ALLで全てのCPUの統計を表示することができます。
1は、1秒ごとに結果を出力します。
このサンプルでは、CPU0が95%のユーザー時間を使用していることがわかります。
また、%sys時間が大きい場合は、システムコールやカーネルをトレースすることにより、より詳細な情報を取得することができます。
pidstat 1
pidstatは、プロセスごとのCPU使用率を表示します。topコマンドでも同様の結果を表示しますが、過去の結果をスクロールするには、pidstatを利用します。
$ pidstat 1
...
16:44:20 UID PID %usr %system %guest %wait %CPU CPU Command
16:44:21 81 927 1.00 0.00 0.00 0.00 1.00 1 dbus-daemon
16:44:21 1000 4403 0.00 1.00 0.00 0.00 1.00 1 pidstat
16:44:21 1000 4405 2.00 1.00 0.00 0.00 3.00 1 pk-command-not-
16:44:21 0 4410 58.00 8.00 0.00 0.00 66.00 1 packagekitd
16:44:21 UID PID %usr %system %guest %wait %CPU CPU Command
16:44:22 0 2315 1.00 0.00 0.00 0.00 1.00 1 sssd_kcm
16:44:22 1000 4403 2.00 2.00 0.00 0.00 4.00 1 pidstat
16:44:22 0 4410 41.00 2.00 0.00 0.00 43.00 0 packagekitd
16:44:22 UID PID %usr %system %guest %wait %CPU CPU Command
16:44:23 UID PID %usr %system %guest %wait %CPU CPU Command
16:44:24 1000 4403 2.00 2.00 0.00 0.00 4.00 1 pidstat
...
iostat -xz 1
iostatは、CPUの使用率とI/Oデバイスの使用状況を表示します。
$ iostat -xz 1
...
Device r/s w/s rkB/s wkB/s rrqm/s wrqm/s %rrqm %wrqm r_await w_await aqu-sz rareq-sz wareq-sz svctm %util
avg-cpu: %user %nice %system %iowait %steal %idle
6.53 0.00 13.07 0.50 0.00 79.90
Device r/s w/s rkB/s wkB/s rrqm/s wrqm/s %rrqm %wrqm r_await w_await aqu-sz rareq-sz wareq-sz svctm %util
vda 76.00 0.00 7204.00 0.00 8.00 0.00 9.52 0.00 1.07 0.00 0.05 94.79 0.00 0.68 5.20
dm-0 37.00 0.00 7044.00 0.00 0.00 0.00 0.00 0.00 1.11 0.00 0.04 190.38 0.00 1.11 4.10
dm-1 40.00 0.00 160.00 0.00 0.00 0.00 0.00 0.00 0.40 0.00 0.02 4.00 0.00 0.42 1.70
avg-cpu: %user %nice %system %iowait %steal %idle
8.59 0.00 20.20 0.51 0.00 70.71
Device r/s w/s rkB/s wkB/s rrqm/s wrqm/s %rrqm %wrqm r_await w_await aqu-sz rareq-sz wareq-sz svctm %util
vda 1490.00 162.00 6604.00 2592.00 83.00 0.00 5.28 0.00 0.32 5.21 0.92 4.43 16.00 0.45 75.00
dm-0 1525.00 162.00 6412.00 5184.00 0.00 0.00 0.00 0.00 0.33 5.17 1.34 4.20 32.00 0.44 74.70
dm-1 48.00 0.00 192.00 0.00 0.00 0.00 0.00 0.00 0.04 0.00 0.00 4.00 0.00 0.12 0.60
loop1 13.00 0.00 13.00 0.00 0.00 0.00 0.00 0.00 0.08 0.00 0.00 1.00 0.00 0.38 0.50
-xでは拡張ディスク統計情報を出力し、-zでは表示対象の期間に使用されていないデバイス(入出力がゼロのデバイス)は表示しないオプションとなります。
確認する項目の内容は以下の通りです。
項目名 | デバイス使用状況の内訳 |
---|---|
r/s | 1秒当たりに完了できた読み出し要求 |
w/s | 1秒当たりに完了できた書き込み要求 |
rkB/s | 1秒当たりの読み出しセクタ数 |
wkB/s | 1秒当たりの書き込みセクタ数 |
rrqm/s | マージされた1秒当たりの読み出し要求 |
wrqm/s | マージされた1秒当たりの書き込み要求 |
r_await | 作成された読み出し要求が完了するまでの平均時間 |
w_await | 作成された書き込み要求が完了するまでの平均時間 |
svctm | デバイスに発行されたI/O要求の平均サービス時間 |
%util | デバイスの帯域幅使用率 |
free -m
freeは、システムの物理メモリと空き容量を表示します。
$ free -m
total used free shared buff/cache available
Mem: 1816 1044 153 7 618 581
Swap: 2047 212 1835
-mは、Mbyte単位で表示するオプションです。
sharedは、tmpfsで利用されているメモリです。
buff/cacheは、buffers(カーネルバッファで使用されるメモリ) と cache(ページキャッシュとスラブで使用されるメモリ) の合計です。
availableの値が0に近づいていないことを確認しましょう。
sar
sarを使うと、CPU・メモリなどのパフォーマンスに関わる様々なリソースの情報を得ることができますが、ここでは、-n DEVオプションで受信/送信パケットを1秒ごとに確認してみましょう。
$ sar -n DEV 1
...
11:04:44 IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s %ifutil
11:04:45 lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
11:04:45 enp1s0 108.00 101.00 504.62 7.61 0.00 0.00 0.00 0.00
11:04:45 virbr0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
11:04:45 virbr0-nic 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
rxpck/s:1秒間あたりの受信パケット数
txpck/s:1秒間あたりの送信パケット数
rxkB/s:1秒間あたりの受信kB数
txkB/s:1秒間あたりの送信kB数
特に、rxkB/sとtxkB/sの変化を確認してみましょう。
次に、-n TCP,ETCPオプションでTCPとネットワークエラーを1秒ごとに表示してみましょう。
$ sar -n TCP,ETCP 1
...
11:29:54 active/s passive/s iseg/s oseg/s
11:29:55 0.00 0.00 1.00 1.00
11:29:54 atmptf/s estres/s retrans/s isegerr/s orsts/s
11:29:55 0.00 0.00 0.00 0.00 0.00
11:29:55 active/s passive/s iseg/s oseg/s
11:29:56 1.00 0.00 13.00 13.00
11:29:55 atmptf/s estres/s retrans/s isegerr/s orsts/s
11:29:56 0.00 0.00 0.00 0.00 0.00
active/s:1秒間あたりのアクティブなTCP新規接続数
passive/s:1秒間あたりのパッシブなTCP新規接続数
retrans/s: 1秒間あたりのTCPの再送信数
注意する点は、activeとpassiveの接続数を確認することによりワークロードの傾向を把握することができます。
また、retransの再送信数を確認することでネットワークやリモートホストの問題を疑うこともできます。
top
topにより、現在実行中のプロセスをCPU利用率が高い順にリアルタイムに表示します。
$ top
top - 11:46:52 up 19:36, 3 users, load average: 0.04, 0.12, 0.08
Tasks: 271 total, 1 running, 268 sleeping, 2 stopped, 0 zombie
%Cpu(s): 0.5 us, 0.0 sy, 0.0 ni, 99.3 id, 0.0 wa, 0.2 hi, 0.0 si, 0.0 st
MiB Mem : 1816.7 total, 388.5 free, 909.6 used, 518.6 buff/cache
MiB Swap: 2048.0 total, 1736.7 free, 311.2 used. 734.6 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
619 root 20 0 0 0 0 S 0.3 0.0 0:03.55 xfsaild/dm-0
2315 root 20 0 204936 25248 4812 S 0.3 1.4 2:10.08 sssd_kcm
15893 user1 20 0 61712 4616 3740 R 0.3 0.2 0:00.89 top
1 root 20 0 246180 8860 4704 S 0.0 0.5 0:03.73 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.03 kthreadd
3 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_gp
4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_par_gp
6 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker/0:0H-kblockd
9 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 mm_percpu_wq
10 root 20 0 0 0 0 S 0.0 0.0 0:00.11 ksoftirqd/0
11 root 20 0 0 0 0 I 0.0 0.0 0:01.88 rcu_sched
12 root rt 0 0 0 0 S 0.0 0.0 0:00.00 migration/0
13 root rt 0 0 0 0 S 0.0 0.0 0:00.05 watchdog/0
...
また、-u user_nameで特定のユーザーのプロセスのみ表示することもできます。
$ top -u user1
top - 11:53:02 up 19:42, 3 users, load average: 0.00, 0.03, 0.05
Tasks: 269 total, 1 running, 266 sleeping, 2 stopped, 0 zombie
%Cpu(s): 2.9 us, 2.9 sy, 0.0 ni, 94.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 1816.7 total, 388.8 free, 909.3 used, 518.6 buff/cache
MiB Swap: 2048.0 total, 1736.7 free, 311.2 used. 734.9 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
15982 user1 20 0 61712 4560 3688 R 13.3 0.2 0:00.02 top
2056 user1 20 0 93968 4424 3772 S 0.0 0.2 0:00.16 systemd
2062 user1 20 0 171756 400 0 S 0.0 0.0 0:00.00 (sd-pam)
2074 user1 9 -11 987600 2520 1876 S 0.0 0.1 0:00.10 pulseaudio
2080 user1 20 0 306988 2712 2260 S 0.0 0.1 0:00.02 gnome-keyring-d
2086 user1 20 0 149080 3824 2644 S 0.0 0.2 0:00.21 dbus-daemon
2091 user1 20 0 340112 3892 3892 S 0.0 0.2 0:00.01 gdm-wayland-ses
2101 user1 20 0 732444 7056 3956 S 0.0 0.4 0:00.18 gnome-session-b
2157 user1 20 0 3126576 160348 48520 S 0.0 8.6 0:47.56 gnome-shell
まとめ
ここでは1分で簡単に確認できるツールを紹介してきました。
まずはこれらの基本ツールを利用し、システムのパフォーマンスについてヒントとなる情報を見つけてみてはいかがでしょうか。
その後、より詳細な情報を取得するために、その他のツールを使ってみるといいかもしれません。
コメント