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頻度を軽減する