Linuxの負荷考察
負荷の種類にはこんなのがあるんだ
①CPU負荷 ②I/O負荷
①CPU負荷
なんらかのプロセスがCPUを占有している(CPUが計算している)状態 ・ディスクやメモリ容量などのボトルネックが泣ければ理想的な状態 ・プログラムが暴走(無限ループ等)してるかも・・・
②I/O負荷
ディスクの読み書きが発生している状態 ・プログラムからの入出力が多くて負荷が高い ・スワップが発生してディスクアクセスが発生している
◆負荷計測のコマンド
①top ・ある瞬間のOSの状態のスナップショットを表示 ②sar ・OSが報告する各種指標を表示 ③ps ・プロセスが持つ情報を表示 ④vmstat ・仮想メモリ関連情報を表示
ボトルネック検査のための手順
①システム全体の負荷状態を把握する
TOPコマンドでロードアベレージを見る
※ロードアベレージ? 単位時間当たりにどの程度のタスクが待ち状態にあったかを報告する数値 CPUに割り当てられるプロセスの状態遷移(psのSTAT項目) ・TASK_RUNNING(実行中or実行待ち) ・・・R ・TASK_INTERRUPTIBLE(割り込み可能状態)・・・S ・TASK_UNINTERRUPTIBLE(割り込み不可状態)・・・D ※これらの状態をごく短時間のうちに切り替えることでマルチタスクを実現している
◆ロードアベレージはこれらのうち
・TASK_RUNNING(実行待ち) CPUが空きさえすればいつでも実行可能な状態 ・TASK_UNINTERRUPTIBLE(割り込み不可状態) ディスクI/Oなどの短時間処理の完了を待っている状態を換算した (複数CPUの場合は値を搭載CPU数で割る) ・CPUを使いたいけど他のプロセスがCPUを使っていて待たされているプロセス ・処理を続けたいがディスクI/Oが終了するまで待たなければならないプロセス
②ロードアベレージが高い=システムへの負荷が高いのでそれがCPU負荷、I/O負荷のどちらのボトルネックによるのかを探る
sarコマンドでCPU使用率、I/O待ち率を見る
・%user ユーザモード:通常のアプリが動作するモード ・%system システムモード:カーネルが動作するモード ・%iowait I/O待ちの割合 マルチコア対策としてsar -P ALLで各CPUの状態を 個別に把握すべき ・マルチCPUが搭載されていてもディスクは1つしかない場合、 CPU負荷は他のCPUに分散できてもI/Oは分散できないから
③負荷原因が判明したらどのプロセスが悪さをしているのかを把握
psコマンドでプロセス情報を見る
・%CPU プロセスのCPU使用率 ・%MEM プロセスの物理メモリ ・VSZ(RSS) プロセスが確保している仮想(物理)メモリ領域 ・STAT プロセスの状態 ・TIME プロセスがCPUを占有した時間
◆スワップが発生している場合
④物理メモリ不足が原因だからRSSのサイズを見て極端に大きな
プロセスがないか確認する
ブロッキングとビジーループの違い(TIME) ・無限ループ(TASK_RUNNING)の場合はTIMEが増加し続ける ・キーボード入力待ち(TASK_INTERRUPTIBLE)の場合はTIMEは 増加しない どの程度I/Oが発生しているのか? topやsarはシステム全体でI/O待ちが発生した「割合」が判明 では、絶対値は? vmstatの「bi(ブロック/秒)」「bo (ブロック/秒) 」項目から ブロック単位での読み書きがわかる ・Linuxのブロックサイズは1kb ・vmstat 1 100 のようにインターバルを指定すべし
◆手順まとめ
①topでロードアベレージを見る ②sarでCPUとI/O負荷どちらが高いかを見る ③psで各プロセスの情報を見る ↓ ④悪さをしているプロセスをkillしたり再起動したり・・・
◆対策まとめ
【CPU負荷が高い場合】 ①サーバ増設やプログラムのロジック、アルゴリズムの改善 【I/O負荷が高い場合】 ①メモリ増設でキャッシュ領域を拡大する ②メモリ増設不可なら、データの分散やキャッシュサーバ の導入を検討 ③プログラムの改善でI/O頻度を軽減する