2020/08/08

パフォーマンスの問題判別

サーバの基本情報を確認する主なコマンド

コマンド 説明
# uname -a カーネルのバージョンとアーキテクチャを表示する
# df マウント中のファイルシステムと使用量を表示する
# free メモリのswap領域の使用量を表示する
# ps -ef 稼働中のプロセスを表示する。wwオプションを追加すると、行を折り返して、すべての内容が表示される
# ps aux
# ifconfig -a ネットワーク・インターフェースの構成を表示する
# netstat -an ネットワークの接続状態を表示する。
ssはsocket statisticsの略
netstatの後継
# ss -tulnp
# ethtool ethX ネットワーク・インターフェース[ethX]の通信モード(通信速度、全二重/半二重など)を表示する
# cat /proc/net/bonding/bondX Bondingデバイス[bondX]の稼働状況を表示する
# uptime サーバの連続稼働時間などを表示する
# last サーバにログインしたユーザの履歴を表示する。サーバ再起動の記録も確認可能
# w サーバにログイン中のユーザを表示する
# lsof 各プロセスが使用しているファイルを表示する
# lsof -i 各プロセスが使用しているTCP/UDPポートを表示する
# fuser -v <ファイルパス> 該当のファイルをオープンしているプロセスを表示する
# fuser -vm <マウントポイント> マウント中のファイルシステム内のファイルをオープンしているプロセスを表示する

接続デバイスを確認する主なコマンド

コマンド 説明
# lspci PCI接続デバイスの情報を表示する。-vオプションでより詳細な情報が表示される
# lsusb USB接続デバイスの情報を表示する。-vオプションでより詳細な情報が表示される
# cat /proc/scsi/scsi SCSI接続デバイスの情報を表示する
# cat /proc/interrupts 各デバイスのCPU割り込み回数を表示する
# lsmod デバイス・ドライバなど、カーネルに読み込まれているカーネル・モジュールを表示する


パフォーマンスの問題判別で使用する主なコマンド

コマンド 説明
# vmstat <計測間隔(秒)> <回数> メモリ、I/O、平均CPU使用率などの情報を表示する
# mpstat -P ALL <計測間隔(秒)> <回数> 各CPUコアの使用率を表示する
# iostat -xd <計測間隔(秒)> <回数> 各ディスクデバイスのI/O量を表示する
# ifconfig <ネットワーク・デバイス名> NICのデータ転送量を表示する
# netstat -i

実行例

vmstat、mpstat、iostatの各コマンドは、指定した時間間隔ごとの平均値を表示するが、vmstatとiostatの1回目の出力値は、サーバ起動時からの平均値になるので注意する。

vmstatコマンドの実行例

mpstatコマンドの実行例

iostatコマンドの実行例

ifconfigの実行例

netstatの実行例

CPUのボトルネックの判別

vmstatのCPU使用率の項目
項目 説明
us CPUがユーザ・プロセスのコードを実行している時間(%)
sy CPUがカーネル、および、デバイス・ドライバのコードを実行している時間(%)
id CPUが何もしておらず、I/O待ちのプロセスも存在しない時間(%)
wa CPUが何もしておらず、I/O待ちのプロセスが存在する時間(%)

 CPUが実際に処理を行っている時間の割合(us+sy)が、継続的に80%~90%程度を超える場合は、CPUがボトルネックになっている可能性がある。この時、ユーザ・プロセスの処理時間(us)が高い場合は、CPU負荷の高いアプリケーションが原因の可能性がある。特に実行待ちのプロセス数(procs r)が、CPUコア数の2~4倍程度以上ある場合は、CPU負荷の高いプロセス数が多いと考えられる。カーネルの処理時間(sy)が高い場合は、ディスクI/Oやネットワーク通信に伴うデバイス・ドライバの処理の負荷が高い可能性が考えられる。
 なお、vmstatで表示されるCPU使用率は、すべてのCPUコア使用率の平均値となる。平均値が小さくても、特定のCPUコアに負荷が集中している場合がある。

 それぞれのCPUコアの使用率は、mpstatで確認する。mpstatの特定のCPUコアの使用率(%user+%nice+%sys+%irq+%soft)が高い場合、特定の1つのプロセスが、CPUコアを占有している場合がある。また、特定のCPUコアのハードウェア割込み処理時間(%irq)が高い場合、CPUコアの負荷分散ができないタイプの割込みが多数発生している可能性がある。それぞれのデバイスから各CPUコアへの割込み数は、次のコマンドで確認できる。
# cat /proc/interrupts 

ディスクI/Oのボトルネックの判別

 vmstatのI/O待ち時間率(wa)が継続的に高い値を示して、I/O待ちプロセス数(procs b)が多い場合、ディスクI/Oがボトルネックの可能性がある。iostatの使用率(%util)の高いディスクに負荷がかかっている。
 通常は、ディスクのI/O処理に伴い、vmstatのカーネル処理時間(sy)の値も高くなる。I/O待ち時間率(wa)だけが単独で高い値を示す場合は、デバイス・ドライバの障害の可能性もある。たとえば、I/O処理の完了をデバイス・ドライバが正しく認識できていない場合などに発生する。
 vmstatの読み込みブロック数(io bi)と書き込みブロック数(io bo)から、サーバ全体のディスクI/O量(KB)が確認できる。デバイスごとのI/O量は、iostatのr/s、w/s、および、rkB/s、wkB/sで確認する。これらは、1秒あたりのI/Oリクエスト数(読み込みと書き込み)、および、1秒あたりの読み書きデータ量となる。「rkB/s ÷ r/s」、および「wkB/s ÷ w/s」の計算で、平均リクエストサイズ(1回のリクエストで転送されるデータ量)が算出できる。これから、小さなデータの読み書きが多いのか、あるいは、大きなデータの読み書きが多いのかを判断できる。

メモリ使用量の問題の判別

 vmstatのスワップイン(swap si)、スワップアウト(swap so)の発生状況を確認する。継続的にスワップインとスワップアウトが発生している場合は、メモリが不足している可能性がある。継続的なスワップイン、スワップアウトが発生していなければ、スワップ領域が使用されていても問題はない。メモリが不足していなくても、大量のファイルアクセスを行った場合などは、一時的にディスクキャッシュの容量を確保するために、スワップアウトが発生することがある。物理メモリの空き容量は、ディスクキャッシュを空き容量とみなして考える必要がある。ディスクキャッシュは必要に応じて解放されるためである。ただし、RAMディスクや共有メモリ領域として使用中のメモリもディスクキャッシュとして認識されるが、これらは自動的に解放されることはない。つまり、正確には、この領域は空き容量とみなすことはできない。
 次のコマンドで、解放可能なディスクキャッシュ部分を強制的に解放することができる。正確な空き容量を確認する場合は、これじ実行した直後にfreeコマンドを実行して、「Mem:」の行の値を見る。
# echo 3 > /proc/sys/vm/drop_caches 

ネットワーク通信速度の問題の判別

ネットワーク通信に伴うデータ転送量やパフォーマンスについては、基本的には、ネットワーク・スイッチなどのネットワーク機器の側で測定する。
 サーバ側で確認する場合は、ifconfig、netstatの送受信データ量、送受信パケット数を見る。これらは、サーバが起動してからの合計値になるので、一定期間の通信量を求める場合は、これらのコマンドを定期的に実行して、差分を計算する。
 ネットワークの通信速度に関する問題が発生した場合は、サーバ側では、NICn設定に異常がないか確認する。ethtoolコマンドで、正しい通信モード(Speed、Duplex、Auto-negotiation)が設定されていることを確認する。これらは接続先のネットワーク・スイッチの設定と合わせる必要がある。

プロセス情報の確認

CPU、メモリ、ディスクI/Oなどのボトルネックが発見された場合、それらのリソースを使用しているプロセスを特定することで、次のような問題を判別できる場合がある。
①プログラムの不具合で、動作異常を起こしたプロセスがCPUを占有している場合
②プログラムの不具合で、不必要にメモリを確保し続けるプロセスが存在する場合
③大量のディスクアクセスを発行して、長期間、ディスクI/O完了待ち状態にとどまっているプロセスが存在する場合

 ①について、CPU使用率の高いプロセスは、topコマンドで確認する。画面上部にCPU使用率の情報が表示され、「1」を押すと、全CPUコアの平均値と、各CPUコアの値の表示を切り替えることができる。topコマンドの結果をテキストファイルに書き出す場合は、-bオプションを使用する。次のコマンドは60秒間隔で、10回分の出力をファイル/tmp/output.txtに書き出す。
# top -b -n 10 -d 60 > /tmp/output.txt 
 ②について、各プロセスの実メモリの使用量は、psコマンドで確認する。デマンド・ページングの機能があるので、プロセスに対して、論理的に割り当てられたメモリ空間の大きさと、プロセスが実際に使用している物理メモリの量は一致いない。「ps aux」で表示される、RSSの値が、実際に使用している物理メモリ(KB)を表す。下図は、--sortオプションを利用して、RSSの降順でプロセスを表示している。なお、プロセスが不要になったメモリを解放せずに、新たなメモリを要求する現象を「メモリリーク」と呼ぶ。メモリリークが発生すると時間の経過と共にプロセスの使用メモリが増大していく。
 ③について、「ps aux」で表示される、STATの1文字目が「D」のプロセスは、ディスクI/O待ちであることがわかる。

0 件のコメント:

コメントを投稿

人気の投稿