apacheのworkerってホントに、意味あるのかな。
Tuesday, August 23, 2011
#今回は、めちゃくちゃコンピューターチックな話。
#苦手な人は、とばしてちょ。
家鯖のWEBを、ReverseProxy構成にしようと、目論んでます。
今は、Webサーバーだけで、そこにPHPをモジュールで動かしています。
特に、充電生中継というツールが、非常にメモリーを食うので、通常に、フロントのWebサーバーで、大量のpreforkをすると、ちと、メモリー的につらいかも、、、
というのがあり、今は、実は、preforkを7本で固定にしてます。
なんで、7本って中途半端な数字かといえば、画像がたくさんあるようなページだと、最近のブラウザは6本も同時接続しやがる、という関係で、一本ぐらいのこしてやろうか、、、なんて感じ。
#ま、あまり意味のない残し方ですが、、、
で、KeepAliveは1秒と、短くしてます。
ま、ここまで節約しなくても、、、という気はしますが、、、
ただ、それで十分はけるほどのリクエストしか、来ないんですけど。
で、計画としては、以下のような感じ。
1.フロントのサーバーは静的コンテンツを返す。
(1)つまり、リバースプロキシー
(2)workerを使って、50ぐらい、スレッドをうごかしてあげる。
(2)keepaliveは、5秒ぐらいに増やしてやるかな。
2.バックエンドにPHPやCGIのプログラムを流す。
(1)プロセス数は1とか2とかで固定。
(2)当然prefork
(3)keppaliveはしない。
3.1と2のプログラムのビルドは、同じものを使う。
(1)つまり、apache 2.3のloadable MPMを使う
(2)できるものはすべてDSOにして、実行時にリンク
まとめると、リバースプロキシーをメモリー節約のために使おうかと。で、あまったメモリーをkeepaliveに使ってやる、って感じ。(サーバーは1台で、フロントとバックエンドのApacheを動かします。)
とまあ、計画的には完璧なはずが、1(2)のworkerで、はまった感じかな。
いやあ、いろいろとベンチマークとかやったんですけどね、、、
どういう現象かといえば、同じリクエストをさばくための、メモリーが、結局preforkのほうが少なくて済む、、、
というもの。スピード(CPU使用時間)も、そう変わらん感じ。
なんでなんでしょうねー
メモリー量については、コード部分や定数部分は、もともと共有する機能が、OSにはついてるので、個別データ部分が違うかと思ったんですけど、、、、
まあ、よくよく考えてみれば、スレッドごとにプライベートにメモリーを使っちゃったら、一緒だし。
CPUについても、プロセスの切り替えが少ないWorkerのほうが有利かと思ったんですが、UNIXなんて、プロセスが軽いOSだと、プロセスの切り替えに負荷もほとんどないのかなあ、、、とかおもっちゃったり。
ということで、なんのこっちゃ、という感じです。
ま、本気でお仕事でやってるわけじゃないので、テストに失敗してる可能性もありますが。
ま、今、2.3はベーター版なので、リリース版が出たら、もっぺん試すかな、、、
で、翌日追記
ちゃんと、意図通り動きました。というか、正確には、動くと思います、が正しいけど。
意図というのは、workerにして、keepaliveをたくさん面倒を見たときに、preforkよりメモリー節約になる、ということ。
ただ、期待してたほど、メモリーの節約にはならなかったですけどね。
今回の反省:
apacheのabだけで、こんなテストをするのは、かなり難しい。
例えばswapされても、使わないモジュールが使ってるメモリーが追い出されるだけ。
酔っ払ってベンチマークをしても無駄だ。
で、最初に書いた、「動くと思います。」だけど、実際にレスポンスやスループット等の差に、現れるようなテストは、かなり大変なので、やりませんです。
というか、数秒に1回ぐらいしか、ユーザーがアクセスしない、このサイトを、数百、数千、数万ユーザー向けに、まじめにチューニングしてもなあ。
あ、嘘ついた。
誤: 数秒に1回ぐらいしか、ユーザーがアクセスしない、このサイト
正: 数秒に1回ぐらいしか、ユーザー(ロボットも含む)がアクセスしない、このサイト
以上
#苦手な人は、とばしてちょ。
家鯖のWEBを、ReverseProxy構成にしようと、目論んでます。
今は、Webサーバーだけで、そこにPHPをモジュールで動かしています。
特に、充電生中継というツールが、非常にメモリーを食うので、通常に、フロントのWebサーバーで、大量のpreforkをすると、ちと、メモリー的につらいかも、、、
というのがあり、今は、実は、preforkを7本で固定にしてます。
なんで、7本って中途半端な数字かといえば、画像がたくさんあるようなページだと、最近のブラウザは6本も同時接続しやがる、という関係で、一本ぐらいのこしてやろうか、、、なんて感じ。
#ま、あまり意味のない残し方ですが、、、
で、KeepAliveは1秒と、短くしてます。
ま、ここまで節約しなくても、、、という気はしますが、、、
ただ、それで十分はけるほどのリクエストしか、来ないんですけど。
で、計画としては、以下のような感じ。
1.フロントのサーバーは静的コンテンツを返す。
(1)つまり、リバースプロキシー
(2)workerを使って、50ぐらい、スレッドをうごかしてあげる。
(2)keepaliveは、5秒ぐらいに増やしてやるかな。
2.バックエンドにPHPやCGIのプログラムを流す。
(1)プロセス数は1とか2とかで固定。
(2)当然prefork
(3)keppaliveはしない。
3.1と2のプログラムのビルドは、同じものを使う。
(1)つまり、apache 2.3のloadable MPMを使う
(2)できるものはすべてDSOにして、実行時にリンク
まとめると、リバースプロキシーをメモリー節約のために使おうかと。で、あまったメモリーをkeepaliveに使ってやる、って感じ。(サーバーは1台で、フロントとバックエンドのApacheを動かします。)
とまあ、計画的には完璧なはずが、1(2)のworkerで、はまった感じかな。
いやあ、いろいろとベンチマークとかやったんですけどね、、、
どういう現象かといえば、同じリクエストをさばくための、メモリーが、結局preforkのほうが少なくて済む、、、
というもの。スピード(CPU使用時間)も、そう変わらん感じ。
なんでなんでしょうねー
メモリー量については、コード部分や定数部分は、もともと共有する機能が、OSにはついてるので、個別データ部分が違うかと思ったんですけど、、、、
まあ、よくよく考えてみれば、スレッドごとにプライベートにメモリーを使っちゃったら、一緒だし。
CPUについても、プロセスの切り替えが少ないWorkerのほうが有利かと思ったんですが、UNIXなんて、プロセスが軽いOSだと、プロセスの切り替えに負荷もほとんどないのかなあ、、、とかおもっちゃったり。
ということで、なんのこっちゃ、という感じです。
ま、本気でお仕事でやってるわけじゃないので、テストに失敗してる可能性もありますが。
ま、今、2.3はベーター版なので、リリース版が出たら、もっぺん試すかな、、、
で、翌日追記
ちゃんと、意図通り動きました。というか、正確には、動くと思います、が正しいけど。
意図というのは、workerにして、keepaliveをたくさん面倒を見たときに、preforkよりメモリー節約になる、ということ。
ただ、期待してたほど、メモリーの節約にはならなかったですけどね。
今回の反省:
apacheのabだけで、こんなテストをするのは、かなり難しい。
例えばswapされても、使わないモジュールが使ってるメモリーが追い出されるだけ。
酔っ払ってベンチマークをしても無駄だ。
で、最初に書いた、「動くと思います。」だけど、実際にレスポンスやスループット等の差に、現れるようなテストは、かなり大変なので、やりませんです。
というか、数秒に1回ぐらいしか、ユーザーがアクセスしない、このサイトを、数百、数千、数万ユーザー向けに、まじめにチューニングしてもなあ。
あ、嘘ついた。
誤: 数秒に1回ぐらいしか、ユーザーがアクセスしない、このサイト
正: 数秒に1回ぐらいしか、ユーザー(ロボットも含む)がアクセスしない、このサイト
以上
コメントする
トラックバック
この記事へのトラックバックURL:
これまでに受信したトラックバックはありません。