4章 性能向上、チューニング

4-1 Linux単一ホストの負荷を見極める

  • あくまでチューニングは渋滞を取り除く作業。できること以上のことはできない。
アプローチ
  • Webアプリの負荷分散⇒ディスクI/Oの分散、軽減作業
  • OS自体がキャッシュを持ってる。それをどれだけ使えるかが大事。
  • OSの動作原理、負荷の計測方法がわかれば根本対応ができる。
  • ボトルネックを見極めるための基本戦略
  • まずはOS⇒そしてWebサバ⇒DB
推測するな!計測せよ!
  • サーバリソースの利用状況を正確に把握する。
  • 必要な情報は結局はカーネルが持ってるんだから。
  • ps, top, sar
ボトルネック見極めの流れ
  1. Load avgをみる!
    1. Load avg低いのに重い
    2. Load avg高い
      • sar, vmstat cpu利用率、I/O推移をみる
  2. CPU負荷高い
  • top, sar でuserかsysをみて、ユーザのプログラムか、OS(カーネル)が原因か見極める
  • psのプロセス状態、cpu使用時間から原因のプロセスを特定する
  • straceでトレース、oprofileでプロファイリング
  • しかしながら、一般的にはcpu負荷がかかっている状態が正常な状態
  1. I/O負荷が高い
  • 原因
    1. PGの入出力が多すぎ。
      • そっかー。プログラムでもあんまりファイルとかで入出力頻繁にするとI/O発生しまくるよな。そのイメージ大事。
    2. swapでディスクアクセスしている。
  • 対応
    1. 特性プロセスが極端にメモリ消費してないかい?psで確認
    2. PG不具合
    3. メモリ増設
      • swap発生なし。だけどディスク入出力頻繁。とにかく入出力の回数が多い。
      • キャッシュに必要なメモリ不足。サバのデータ量, メモリ量つけ合せる
    4. データ分散、キャッシュサバの導入、PG改善、I/O頻度軽減
そもそも負荷ってなんなんだっけ??
  • CPU負荷
    • 科学計算とか。演算とか。cpuバウンドな負荷。webサーバなんかは完全にcpuバウンドな負荷になる。
  • I/O負荷
    • ディスクの大量データから任意のドキュメント探すとか。ディスクへの読み出し速度で変わる。入出力速度。
    • DBサバはI/Oバウンドな負荷だよね。
  • topコマンドの解析
    • Load avgは左から1分/5分/15分の単位あたりの待ちタスク
    • 実はLoad avgだけだとcpu負荷なのかI/O負荷なのかわからない!
    • Load avgの正体はプロセスごとのプロセスディスクリプタ⇒各種実行情報を保存する
      • それをLoad avgに換算している
  • プロセスが待つということは?
    • CPU使いたいけど、他のプロセスがCPUを使って待たされてる
    • 処理続けたいけど、ディスク入出力完了まで待つ
      • 実行したいけど、どうしても待たなければならないということ
じゃ負荷の正体はなんなんだい
    • topやsarのデータはタイマ割り込みで4mmごとにOSが取得している
  • PSしたときのSTATUS
    • この区別は王道だけど絶対に覚えとかないと!!
    1. TASK_RUNNING⇒vmstatだとR
      • 実行可能
    2. TASK_INTERRUPTIBLE(中断可能な、割り込み可能な)⇒vmstatだとS
      • 割り込み可能状態、スリープ、ユーザ入力待ち
    3. TASK_UNINTERRUPTIBLE⇒vmstatだとD
      • 割り込み不可能待ち状態、これがI/O負荷なわけです。
    4. TASK_ZONBIE⇒vmstatだとZ
      • ゾンビ
  • Load avgで換算しているのはこの2つなんです!!
    1. TASK_RUNNNING
      • これがCPU負荷!
    2. TASK_UNINNTRRPTBL
      • これがI/O負荷!
      • 割り込みができない、待ち状態
やべ、topもこんな使い方あったんだー。。知らなかっためっちゃつかえるじゃん
  • このURL

http://www.atmarkit.co.jp/flinux/rensai/root07/root07b.html

sarで分析する
  1. CPUバウンドなsar
  • %userがあがってるぞー
    • ユーザのアプリケーションが動作するときの負荷
    • 負荷が高いプログラムがあればこの%userがあがる
  • %systemがあがってるぞー
    • カーネルが動作しまっくっちゃってるcpuモード。
    • 大量プロセス/スレッド切り替えをしてる。カーネルの負荷があがる。
  1. I/Oバウンドなsar
  • %iowaitをみるですよ
    • Load avg高くて%iowaitが高かったらI/O負荷
  • マルチコア環境では『sar -P』で各cpuごとの負荷を見てゆくべき
プロセス、スレッド
  • 1プログラムを1プロセスで対応するか、1スレッドで対応するか。
  • ユーザ側からの視点で説明するとプロセスの中でいくつもあるのがマルチスレッド
  • OS側からの視点では同じロジックでスケジューリングはされている
  • マルチスレッドの場合
    1. メモリを共有して使うときはメモリの使用効率はいいよ
    2. コンテクストスイッチと言われる、プロセス切替えのときに生じるコストがかからない。
    3. 大量の実行ではマルチスレッドに一定の有利性がある

4-2 Apacheチューニング

  • Apacheの動作にはマルチプロセスかマルチスレッドが選ぶことができるよ。
prefork
  • マルチプロセスモデル
  • マルチプロセスはメモリの使用がプロセスごとで独立してるので安全
  • 安全志向、後方互換性高いprefork
worker
  • マルチスレッド、マルチプロセスのハイブリッド
  • マルチスレッドは『スタック』を共有。スレッドセーフな実装が必要になり、プログラムも複雑になる。
  • スケーラビリティをより高めた動作にするならworker
  • メモリは共有するから、情報量少なく済む
  • コンテキストスイッチにコストがかからない
prefork, workderでパフォーマンス考えるとき、このへんは注意点
  • ひとつのクライアント(PG)への応答時間が変わるわけじゃない
  • メモリが十分にあるんだったら、差はほとんど出ない
  • 大量のコンテキストスイッチ(大量アクセス)がないとあんまり意味がない
httpd.confの設定をあらためて見直す
  • MaxClinetがなんだかんだ一番大事
  • じゃ、実際preforkでMaxClinetはいくつにすればいいのよって話
  • サバの物理メモリ / Apacheでの1プロセスあたりの平均メモリ
    • これを出せば数がわかるはずじゃん。
    • /proc/<プロセスID>/statusのVmHWMが使用してる値になるよ
コピーオンライト!これ大事!
  • preforkで子プロセスを作るときにほんとに使われるまでは親プロセスとメモリを共有するというアーキテクチャ
  • 要は書き込みがおきるまでリードしてる間は親プロセスと共有しましょうってハナシ
  • コピーオンライトのサイズを見るには/proc/<プロセスID>/swapsをみることでわかる。だけどファイルが大量にあってわかりずらいよ。ここではperlで実装して取得してる。
  • ざっくり結論を出すとVmHWMの70%はコピーとみれる。それが本当に使ってる量ってことになる。
  • ただし、DBがボトルネックでMaxClinetこえちゃうようなエラーも起こりうるから、このメモリばっかみててもだめだよ。