はちゅにっき

こっちのブログはまったり更新

『Ficia』インフラと Perl にまつわるエトセトラ

Apache 運用についてのノウハウ。
まとめる側の集中力に問題がでてきた。。。

前提

Linux 2.6.29.x
Apacche 2.2X
mod_perl 2.0.4

ありがたいお言葉

推測するな。計測すべし。

ざっくり調べる

  • ps
  • top

fork は書き込みがあるまで親プロセスと同じページなので、メモリの使用量には注意が必要。

プロセスが太る原因

子プロセスがとにかく太る。
親とはモジュールが共有できるので必要なモジュールは親でロードしておくとコストが低く済む。

PerlPostConfigRequire startup.pl 

して、ロードしておくモジュールの一覧は

PerlResponseHandler Apache2::Status
LoadedModulesで一覧を確認

Perl内のメモリアロケーションはメモリプール的?

  • もりもり太る例
    • slurp 的な一気読みをするともりもり太る
    • File::Find も太る 再帰のせい?

パフォーマンス、利便性との兼ね合いがあるから、一概に悪いとはいえないけどね。
Apache2::Status + B::TerseSize で調べよう。

Apache のプロセス数

プロセス数の制御は smaps の結果と搭載メモリをみて計算することができるはず。
が、増減があるので様子をみて調整しましょう。
個人的には swap したら負けかなと思っている。


{Start,{Min,Max}Spare}Servers, MaxClinet は全部同じ値にしている。
なぜなら、fork はコストが高いため、最初から暇なやつを作っておいた方がいい。
メモリ食い過ぎ?アプリケーションサーバのメモリをアプリのために使うことは正しいことだ。
mod_status を使うといろいろな状態を知ることが出来るので便利。

MaxRequestsPerChild については。。。

  • そこそこ小さい値に
  • 早期刈り取り
    • 肥大化する前に
    • リークする前に

mod_perl のディレクティブには Clone と Parent がある。

VH ごとに

を分離できる。全体的なメモリ消費量は増えるけどね。

TIPS

  1. PerlSwitches は symlink だとみつからない
  2. ErrorLog をVHごとにしたい
    • 設定が必要になる
  3. init.d/httpd
    • stop
      • stop しているのにリクエストがきちゃうと問題
      • ロードバランサのヘルスチェックの間隔など設定
    • start
      • 起動直後にリクエストがきちゃう
      • fork しまくっていて高負荷な状態にある
      • 困っちゃう

解決方法ごにょごにょ # メモしきれず
カンタンに書くと、start / stop している間はアクセスがこないようにしてあげればいい。

そのた

運用支援ツールとしてのPerl
構成管理情報の一元管理。テキスト形式で人が読めて編集できればよい。
nagios さんが死ぬと誰も監視してくれる人がいない。

  • AnyEvent::FastPing 使ってカンタンな監視