『Ficia』インフラと Perl にまつわるエトセトラ
Apache 運用についてのノウハウ。
まとめる側の集中力に問題がでてきた。。。
ありがたいお言葉
推測するな。計測すべし。
ざっくり調べる
- ps
- top
fork は書き込みがあるまで親プロセスと同じページなので、メモリの使用量には注意が必要。
プロセスが太る原因
子プロセスがとにかく太る。
親とはモジュールが共有できるので必要なモジュールは親でロードしておくとコストが低く済む。
PerlPostConfigRequire startup.pl
して、ロードしておくモジュールの一覧は
PerlResponseHandler Apache2::Status LoadedModulesで一覧を確認
- もりもり太る例
- 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
- PerlSwitches は symlink だとみつからない
- ErrorLog をVHごとにしたい
- 設定が必要になる
- init.d/httpd
- stop
- stop しているのにリクエストがきちゃうと問題
- ロードバランサのヘルスチェックの間隔など設定
- start
- 起動直後にリクエストがきちゃう
- fork しまくっていて高負荷な状態にある
- 困っちゃう
- stop
解決方法ごにょごにょ # メモしきれず
カンタンに書くと、start / stop している間はアクセスがこないようにしてあげればいい。