4章 性能向上、チューニング
4-1 Linux単一ホストの負荷を見極める
- あくまでチューニングは渋滞を取り除く作業。できること以上のことはできない。
アプローチ
- Webアプリの負荷分散⇒ディスクI/Oの分散、軽減作業
- OS自体がキャッシュを持ってる。それをどれだけ使えるかが大事。
- OSの動作原理、負荷の計測方法がわかれば根本対応ができる。
- ボトルネックを見極めるための基本戦略
- まずはOS⇒そしてWebサバ⇒DB
推測するな!計測せよ!
- サーバリソースの利用状況を正確に把握する。
- 必要な情報は結局はカーネルが持ってるんだから。
- ps, top, sar
ボトルネック見極めの流れ
- Load avgをみる!
- CPU負荷高い
- top, sar でuserかsysをみて、ユーザのプログラムか、OS(カーネル)が原因か見極める
- psのプロセス状態、cpu使用時間から原因のプロセスを特定する
- straceでトレース、oprofileでプロファイリング
- しかしながら、一般的にはcpu負荷がかかっている状態が正常な状態
- I/O負荷が高い
そもそも負荷ってなんなんだっけ??
- CPU負荷
- 科学計算とか。演算とか。cpuバウンドな負荷。webサーバなんかは完全にcpuバウンドな負荷になる。
- I/O負荷
- ディスクの大量データから任意のドキュメント探すとか。ディスクへの読み出し速度で変わる。入出力速度。
- DBサバはI/Oバウンドな負荷だよね。
- topコマンドの解析
- プロセスが待つということは?
- CPU使いたいけど、他のプロセスがCPUを使って待たされてる
- 処理続けたいけど、ディスク入出力完了まで待つ
- 実行したいけど、どうしても待たなければならないということ
じゃ負荷の正体はなんなんだい
-
- topやsarのデータはタイマ割り込みで4mmごとにOSが取得している
- PSしたときのSTATUS
- この区別は王道だけど絶対に覚えとかないと!!
- TASK_RUNNING⇒vmstatだとR
- 実行可能
- TASK_INTERRUPTIBLE(中断可能な、割り込み可能な)⇒vmstatだとS
- 割り込み可能状態、スリープ、ユーザ入力待ち
- TASK_UNINTERRUPTIBLE⇒vmstatだとD
- 割り込み不可能待ち状態、これがI/O負荷なわけです。
- TASK_ZONBIE⇒vmstatだとZ
- ゾンビ
- Load avgで換算しているのはこの2つなんです!!
- TASK_RUNNNING
- これがCPU負荷!
- TASK_UNINNTRRPTBL
- これがI/O負荷!
- 割り込みができない、待ち状態
- TASK_RUNNNING
やべ、topもこんな使い方あったんだー。。知らなかっためっちゃつかえるじゃん
- このURL
sarで分析する
- CPUバウンドなsar
- %userがあがってるぞー
- ユーザのアプリケーションが動作するときの負荷
- 負荷が高いプログラムがあればこの%userがあがる
- %systemがあがってるぞー
- I/Oバウンドなsar
- %iowaitをみるですよ
- Load avg高くて%iowaitが高かったらI/O負荷
- マルチコア環境では『sar -P』で各cpuごとの負荷を見てゆくべき
プロセス、スレッド
- 1プログラムを1プロセスで対応するか、1スレッドで対応するか。
- ユーザ側からの視点で説明するとプロセスの中でいくつもあるのがマルチスレッド
- OS側からの視点では同じロジックでスケジューリングはされている
- マルチスレッドの場合
- メモリを共有して使うときはメモリの使用効率はいいよ
- コンテクストスイッチと言われる、プロセス切替えのときに生じるコストがかからない。
- 大量の実行ではマルチスレッドに一定の有利性がある
4-2 Apacheチューニング
- Apacheの動作にはマルチプロセスかマルチスレッドが選ぶことができるよ。
worker
- マルチスレッド、マルチプロセスのハイブリッド
- マルチスレッドは『スタック』を共有。スレッドセーフな実装が必要になり、プログラムも複雑になる。
- スケーラビリティをより高めた動作にするならworker
- メモリは共有するから、情報量少なく済む
- コンテキストスイッチにコストがかからない
- cpuのメモリキャッシュをそのまま使えるから、やっぱりコンテキストスイッチないほうが早い
prefork, workderでパフォーマンス考えるとき、このへんは注意点
- ひとつのクライアント(PG)への応答時間が変わるわけじゃない
- メモリが十分にあるんだったら、差はほとんど出ない
- 大量のコンテキストスイッチ(大量アクセス)がないとあんまり意味がない
httpd.confの設定をあらためて見直す
- MaxClinetがなんだかんだ一番大事
- じゃ、実際preforkでMaxClinetはいくつにすればいいのよって話
- サバの物理メモリ / Apacheでの1プロセスあたりの平均メモリ
- これを出せば数がわかるはずじゃん。
- /proc/<プロセスID>/statusのVmHWMが使用してる値になるよ