KUSANAGI環境で、サーバのトラブル対応を行うときに、よく使うコマンドと、その結果に対する指標などを紹介していきたいと思います。実行結果の項目の意味については、より詳しく解説されているサイトなどもあり、改めて解説する意味も薄いので、そちらを参照してもらえればと思います。
今回紹介する sar コマンドは、サーバでの処理が重くなったときに、まず最初にサーバ全体の状況を把握するのに適切なコマンドです。
オプションなしで実行した場合、当日10分間隔での CPUの使用率 ≒ CPUの負荷状況を表すものとなっていますが、%iowait の値で、ディスク負荷を見て取ることもできます。
08時00分01秒 CPU %user %nice %system %iowait %steal %idle
08時10分01秒 all 3.09 0.00 1.20 0.08 0.00 95.64
08時20分01秒 all 1.54 0.00 0.82 0.00 0.00 97.64
08時30分01秒 all 1.62 0.00 0.84 0.01 0.00 97.54
08時40分01秒 all 2.41 0.34 1.00 0.03 0.00 96.22
08時50分01秒 all 1.56 0.00 0.81 0.01 0.00 97.62
%user 値は、平時において高くて30、できれば20以下に抑えておくくらいが望ましいです。これを上回っていると、処理遅延を起こしやすくなり、ポータルサイトで紹介された際など、アクセススパイクを処理できず機会損失を生みやすくなってしまいます。
%user 値が高い場合は、アプリケーション(サイトを運用しているWordPress等のCMSやフレームワークなど)に起因していることが多いです。サーバの処理能力に比して、アプリケーションが要求する処理が多いことが原因なのですが、これに陥るのは、アプリケーション自体の設計が悪く1アクセスに多数の処理が必要になっている、Webサイトへのリクエスト数に対しサーバスペック自体が低い、また、これらが複合している場合に発生します。
対策としては、簡易な解決法はサーバスペックを上げる方法ですが、当然ながらサーバの費用も上がってしまうため、順序としては、アプリケーション自体のボトルネック有無を洗い出し、ボトルネックへの対処を行った後に、それでも負荷が高い場合はサーバスペックを上げるのが望ましいと言えます。もちろん、ボトルネックの調査・対処には時間がかかりますし、喫緊の場合は、一時的にサーバスペックをあげて暫定対処を行い、その後にボトルネックへの対処を行う方法を取ることも有効です。
%system 値は、通常は1桁値になりますが、データベースへの要求が高い場合にも、この値が上がる場合があります。恒常的に10を超えるような場合は、データベースのスローログを確認し、時間がかかってしまっているSQLがないか確認してみてください。
%iowait 値も平時は1桁となります。恒常的に5を超えているような場合は、メモリ搭載量が不十分で swap が発生していたり、データベースへのリクエストが不適切で一時ファイルを作成している等が考えられます。前者の場合への対処は、サーバスペックを上げてメモリの搭載量を増やす必要があります。後者の場合は、データベースのテーブル構造、インデックスの見直し、SQLの見直し等が有効な対策となります。
%steal 値も平時は1桁値となることが多いです。この数値が20を恒常的に超える場合は、対処を検討した方が良いといえます。原因は2つ考えられ、1つは同じ物理サーバ上で動作している他の仮想マシンの負荷が大きくサーバの処理が遅延している場合、もう1つはAWSのt系インスタンスでCPUクレジットを使い切っている場合です。CPUクレジットの残量は、AWSのWebコンソール上で確認できます。
他の仮想マシンにより影響を受けている場合は、仮想マシンが別の物理サーバで動作するように変更するように、仮想マシンを一旦停止し(再起動では仮想マシンが移動されないためNG)、その後、開始する必要があります。
AWSのt系インスタンスで、CPUをクレジットを使い切っている場合、%user 値も高くなっているはずで、基本的には同様の対処が求められます。ただし、このケースにおいては、t系インスタンスのCPUクレジットモードを無制限モードとすることで回避することが可能です。もちろん、無制限モードにした場合は、追加の利用料金が発生しますので、一時的な対処と捉えてください。
sar コマンドのオプション
sar コマンドには、ざまざまなオプション指定があり、特によく使っているオプションをいくつか紹介しておきたいと思います。
リアルタイム更新
数値のオプションを指定することで、指定秒間ごとに最新値が表示されます。リアルタイムに負荷状況をモニタリングしたいときに便利です。
sar 1
15時14分25秒 CPU %user %nice %system %iowait %steal %idle
15時14分26秒 all 0.50 0.00 0.50 0.00 0.00 99.00
15時14分27秒 all 1.49 0.00 1.00 0.00 0.00 97.51
15時14分28秒 all 1.51 0.00 0.00 0.00 0.00 98.49
15時14分29秒 all 1.49 0.00 1.00 0.00 0.00 97.51
15時14分30秒 all 1.01 0.00 0.50 0.00 0.00 98.49
過去の状況
fオプションを指定することで、過去1ヶ月の結果を日毎に見ることができます。fオプションで指定する値は、/var/log/sa/sann となり nn に日付の数値を指定します。
sar -f /var/log/sa/sa30
00時00分01秒 CPU %user %nice %system %iowait %steal %idle
00時10分01秒 all 2.38 0.03 1.13 0.06 0.00 96.41
00時20分01秒 all 2.56 0.00 1.01 0.89 0.00 95.54
00時30分01秒 all 1.43 0.00 0.80 0.00 0.00 97.77
00時40分01秒 all 1.79 0.34 0.89 0.01 0.00 96.98
00時50分01秒 all 1.56 0.00 0.83 0.00 0.00 97.61
01時00分01秒 all 1.55 0.00 0.83 0.00 0.00 97.62
メモリの状況
rオプションの指定で、メモリの使用状況、Sオプションで、メモリとスワップの状況を見ることができます。
ただし、現時点の状況を見たいのであれば、free コマンドの方が、簡潔であり必要十分です。r、Sオプションは、状況推移を見るのに用います。
sar -r
08時00分01秒 kbmemfree kbavail kbmemused %memused kbbuffers kbcached kbcommit %commit kbactive kbinact kbdirty
08時10分01秒 1690596 4036520 6456100 79.25 716 3133492 13293264 107.72 3668232 2072892 4
08時20分01秒 1688792 4034828 6457904 79.27 716 3133604 13304260 107.81 3699712 2043616 4
08時30分01秒 1661132 4007224 6485564 79.61 716 3133660 13315640 107.90 3699716 2071108 8
08時40分01秒 1670720 4016968 6475976 79.49 716 3133816 13321136 107.94 3699772 2061636 0
08時50分01秒 1683836 4030148 6462860 79.33 716 3133880 13308484 107.84 3699816 2048480 4
sar -S
08時00分01秒 kbswpfree kbswpused %swpused kbswpcad %swpcad
08時10分01秒 2448280 1746020 41.63 70808 4.06
08時20分01秒 2448280 1746020 41.63 70808 4.06
08時30分01秒 2448280 1746020 41.63 70808 4.06
08時40分01秒 2449816 1744484 41.59 71080 4.07
08時50分01秒 2449816 1744484 41.59 71080 4.07
ロードアベレージ
qオプションでは、ロードアベレージを表示することができます。topコマンドでもロードアベレージを表示することができますが、topコマンドではリアルタイムに表示が更新され、プロセスごとのCPU、メモリ使用率も合わせて見ることができるのに対し、qオプションでは、ロードアベレージを推移として見ることができるようになっており、プロセスごとの使用率は見ることができません。現時点の状況把握には、topコマンド、現時点までの状況推移の把握には、qオプションを使うのが妥当と言えます。
sar -q
08時00分01秒 runq-sz plist-sz ldavg-1 ldavg-5 ldavg-15 blocked
08時10分01秒 4 491 0.09 0.06 0.07 0
08時20分01秒 5 489 0.00 0.04 0.06 0
08時30分01秒 6 495 0.02 0.03 0.04 0
08時40分01秒 10 490 0.16 0.06 0.03 0
08時50分01秒 8 487 0.00 0.02 0.00 0
sar コマンドでは、大きなボトルネック切り分けと状況確認はできますが、どのプロセスが負荷になっているのかまでは見て取ることはできません。次回は、今回言及した top、free コマンドなどについても紹介していきたいと思います。