Linux パフォーマンス: 1分でできる簡単チェックリスト

IT

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/s1秒当たりに完了できた読み出し要求
w/s1秒当たりに完了できた書き込み要求
rkB/s1秒当たりの読み出しセクタ数
wkB/s1秒当たりの書き込みセクタ数
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分で簡単に確認できるツールを紹介してきました。

まずはこれらの基本ツールを利用し、システムのパフォーマンスについてヒントとなる情報を見つけてみてはいかがでしょうか。

その後、より詳細な情報を取得するために、その他のツールを使ってみるといいかもしれません。

コメント

タイトルとURLをコピーしました