3月 252009
 

Proxy サーバ、何が一番良いのだろう?と、思い、まず、パッとひらめいたのが squid だったので、それを利用して Proxy サーバを構築してみた。ふむ。設定を施した後はちゃんと動作してキャッシュも溜まっていくねぇ。と言う感じだったのだけど・・。

ps で確認してみると squid は一個のプロセスでしか動作していない。でもってマルチスレッドにもなっていないので、ふと「これで同時にたくさんのアクセスがあった場合どうなるんだ?」とか思い調べてみると・・。あぁら。squid はファイルハンドラがボトルネックになって大規模な運用を行うのには向いてないのねぇ(そら、squid サーバを複数台立てれば大規模サイトの運用できるのは解るけど、全然現実的しゃないじゃん;-()。というのが発覚。

default で 1024 個のファイルハンドラしか無い状態で一個の接続に三つのファイルハンドラを利用するとなると同時に接続できるのは 300 個のクライアントじゃん。ダメだこら。と言うことで別の Proxy サーバを探し始めます。

続いてトライしたのが apache の 2.2.9 。まぁ、大規模環境において動けば良いのでねぇ。他にも色々あるみたいだけど、勝手知ったると言うか・・(^^;;。

Proxy サーバと、後、キャッシュサーバとしてのみ動作させるので要らない機能は落とします。configure 時のオプションはこんな感じ。–with-mpm=worker を付けたのでスレッドな httpd として動作します。

$ ./configure --enable-headers --enable-so
--with-mpm=worker
--disable-cgi --disable-cgid --disable-userdir
--enable-proxy --enable-proxy-ftp --enable-proxy-http --enable-proxy-connect
--enable-file-cache --enable-cache --enable-disk-cache --enable-mem-cache

 
さてと。インストールが終わっていよいよ設定ですが、今回は以下のようにします。

・192.168.1.200 で動作しているサーバの情報をキャッシュするための Proxy サーバを構築します。
・Proxy サーバに対して port:8080 でアクセスした場合はキャッシュしません。
・Proxy サーバに対して port:8081 でアクセスした場合はキャッシュして、その情報を利用するようにします。

オープン Proxy サーバとならないように 192.168.1.200 にのみアクセス可能なサーバとします。これでどこから接続があってもまるで利用できないものとなりますし;-)。

で、設定は大体こんな感じなのだけど、一番苦労した点が、port:8080 にアクセスした場合にキャッシュしないもしくはキャッシュ情報を利用しないで、port:8081にアクセスがあった場合はキャッシュを利用するもしくは新規に取ってきた情報をキャッシュするように動作する設定でした。

<IfModule mod_proxy.c>
    ProxyRequests Off
    ProxyVia On
    AllowCONNECT 8080 8081
<Proxy *:8080> Order deny,allow # Deny from all Allow from all </Proxy>
<Proxy *:8081> Order deny,allow # Deny from all Allow from all </Proxy>
<VirtualHost *:8080> ProxyPass / http://192.168.1.200/ <IfModule mod_cache.c> CacheDisable / </IfModule> </VirtualHost>
<VirtualHost *:8081> ProxyPass / http://192.168.1.200/ <IfModule mod_cache.c> <IfModule mod_disk_cache.c> CacheRoot /data/httpd/cache/ CacheEnable disk / CacheMaxExpire 5184000 CacheDefaultExpire 5184000 CacheDirLevels 3 CacheDirLength 5 </IfModule>
<IfModule mod_mem_cache.c> CacheEnable mem / MCacheSize 2048000 MCacheMaxObjectCount 100 MCacheMinObjectSize 1 MCacheMaxObjectSize 10240000 </IfModule> </IfModule> </VirtualHost> </IfModule>

 
Proxy ディレクティブはアクセス制限のためにしか書けないのねぇ。けっこう悲しい。僕的には <Proxy *:8080> の中に mod_cache の情報が書けるとすごーい嬉しいと思ったのだけど・・。

しょーがないので VirtualHost ディレクティブを記述して、そこで port をわけて、一個は CacheDisable、もう一個の 8081 では CacheEnable を記述すると言う、非常にややこしい設定となってしまいました。まぁ、それが apache の設定だぜぃ。と言われればその通りで、この設定をパッと思いついてしまう自分もすっかりと apache に染まっているのだなぁ(自慢か?;-P)と思ってしまうのだけど・・。

個別の設定については詳しい説明は書きませんので apache.orgのドキュメントを参照してください。

今回やりたかったのは、キャッシュを利用するポートとキャッシュを利用しないポートでサービスができる Proxy サーバが欲しかった。と言う感じでしょうか。

3月 192009
 

自宅サーバが安定しない。」と、ずっと書き続けてきたのだけど、昨日 csup したら 7.1-STABLE が 7.2-PRERELEASE になっていたので、サーバが凍り付く前にリブートしてバージョンアップでけた。

と、言うことで最近のサーバは uptime 12days を記録し、去年の 10 月以来最高の記録となりました;-)。

ちなみに さくらインターネット が自社のサーバを 7.1-RELEASE にアップグレードするってアナウンス出したので思わずサポートに「7.1-RELEASE はフリーズしてしまうけど、サービスにおいて大丈夫ですか?安定してくれないとイヤだなぁ。」と書いたら「検証の結果、凍りつくハードウェアも確かにあったけど、サービスに利用しているハードウェアは大丈夫なのでバージョンアップします。」との事でした。でもって回避策も考えているそうな。

で、うちのサーバがどうして安定したか。と言えば OS の改修とか色々考えられるのですが、現在のうちのサーバの稼働状況を見てみると以下のような感じです。

・DNS サーバ
・ウェブサーバ(httpd-2.2.9) port:80 最大プロセスが 140 個程度
・ウェブサーバ(httpd-2.2.9) port:8080 最大プロセスが 20 個程度
・メールサーバ(sendmail)
・POP3/IMAP4 サーバ(courier-imap-4.4.1)
・自宅網内用 SAMBA サーバ
・cvsupd
・IPv6 ルータ(dtcps,dtcpc)

こんな感じでしょうか。サーバ部分とルータ部分が存在しているのですが、PPPoE はブロードバンドルータにやらせています。

さて、安定させるために行ったことは大体以下です。

・IPv6 ルータを別のマシンで行うようにする
・ダメもとでスケジューラを SCHED_ULE から SCHED_4BSD に変更
・httpd を prefork から worker に変更

こんな感じでしょうか。ただ、これらの事象がサーバの安定に貢献できたのか、さだかではありません。

httpd をプロセス起動からスレッド起動に変更したおかげで ps -ax で見た感じはかなり少なくなりました。 ps -axH | wc -l すると大体 300 近い数が存在しているので、この状態を高負荷状態と行って良いのかもイマイチ不明です。

ただ、ロードアベレージはそんなに高くは無いし、CPU クロックもいつも最高速で回っている。と言うのでもありません。この辺りの情報は MRTG で取得しています。なのでやはり、プロセスやスレッド回りで OS 的に何かあったのかなぁ?と考えてしまうのでありました。

httpd を prefork から worker に変更したのが一番大きいのかなぁ?あ、きっと OS 側に修正が入ったのでしょうねぇ。csup するたんびに kern_ とかのソースが更新されていると嬉しくなっていましたし。< 僕;-)。

3月 062009
 

最近 csup した 7.1-STABLE は powerd の挙動が変わったねぇ。僕は CPU のロードアベレージと速度を MRTG で取得していて毎日見ているのだけど、それで powerd の挙動が一目瞭然;-)。

今までとどう変わったか?と、言われれば、多分 C7i や PhenomII など Core 毎に速度が変えられるようになったのに対応したのでしょうなぁ。

MRTG のグラフを見ていたら、今までは

CPU クロック抑えつつロードアベレージがちょっと高め

だったのだけど、最近の STABLE では

CPU クロック高めでロードアベレージはちょっと抑え気味

って感じかな。まぁ、どっちでも構わないのだけど、CPU クロックを低くしていれば消費電力が抑えられるわけでして。地球環境を考えたら、僕的には今までのほうが良いなぁ。と思ってしまうわけです。サーバであっても CPU ロードアベレージが低ければクロックも低くなっていて欲しい。裏を返すと、多少ロードアベレージが高くても CPU クロックは低くても良い。みたいな感じかしら。

で、powerd で調整できないものか man みましたよー。で、オプションで CPU クロックの変動を抑制することができる;-)。

現在、AthlonX2 なサーバに設定している powerd のオプションはこんな感じ。

/usr/sbin/powerd -a adaptive -i 80 -p 750

 
Atom N330 なサーバに設定しているオプションはこんな感じ。

/usr/sbin/powerd -a adaptive -i 80 -p 500

 
まず、-a で adaptive を指定して「適切なモード」を設定します。 -i で CPU アイドルのパーセントレベルを指定して、最後に -p でポーリング時間を設定します。

経験上、ポーリング時間を変更すると細かな CPU クロックの調整ができます。大きく変えたい時は -i オプションの値を変更すれば良いかと思われます。

後は二時間位ブン回して、その間に MRTG で情報取得して更にオブションの値を細かく調整すれば良いかと思います。

それにしても、温度とか、この手の値って MRTG で取れると知ると知りたくなるんだけど、知らなくても全然問題無いのよねぇ。その気分的な問題が中々面白いんだけど;-)。

それにしても、CentOS で CPU 速度を落とそうとしても、ややこしいのねぇ。カーネルモジュールをロードしてもエラー吐いてダメだしさ。そー考えると CPU クロックを可変にするのは FreeBSD のほうが圧倒的に楽だね。GENERIC カーネルだと powerd を起動すれば良いだけだし。

そー考えると地球環境を考える人は FreeBSD 使うのかぁ?;-P。

3月 042009
 

以前にも書いたかもしれないけど、僕はメールの読み書きに mew を使っている。けど、迷惑メールフィルタが貧弱なので、Thunderbird を起動して imap 上で、まず「迷惑メールフィルター」を実行した後で mew で POP してメールを保存したり、メールに対して返事を返したり、新規にメールを書いている。

Thunderbird の迷惑メールは僕個人的にはすごーく重宝しているのだけど、そもそも Thunderbird を起動するためには X が必要になる・・。

Thunderbird の「迷惑メールフィルタ」と「フォルダ振り分け」の部分のみを切り出してデーモンとして起動できないかなぁ・・。以下、仕様の独り言。実装してくれる人大募集;-)。

1. デスクトップで利用する Thunderbird で「迷惑メールフィルタ」を大いに育てる。
2. 「迷惑メールフィルタをエクスポート」でテキストベースのファイル「迷惑メールフィルタ.conf」に保存。
3. 迷惑メールフィルタデーモンは「迷惑メールフィルタ.conf」をルールファイルとしてメールサーバ(pop3/imap4 が動作しているサーバ)上で起動。
4. 迷惑メールフィルタデーモンは設定ファイル記載された pop3/imap4 を判断して迷惑メールを「迷惑メールフィルタ.conf」に従い特定のフォルダに振り分ける。
5. 迷惑メールの振り分けは設定ファイルに設定した時間間隔で定期的に振り分ける。

迷惑メールの振り分けのもとになる「迷惑メールフィルタ」は普段自分が利用している Thunderbird のものを使えば良いのでデーモン自体が育てる必要は無いので楽で良いと思うのだけどなぁ。もしくはコマンドラインで /usr/local/bin/hunderbird –spamfilter > spamfilter.conf みたいにできれば、それを定期的に迷惑メールフィルタデーモンに HUP シグナルで食わせれば良いのでラクチンなのになぁ。

Mozila-Japan とか もじら組 で 実装してくれないかなぁ。

もしくはこの記事読んだ方、実装してくださーい;-)。

以上、独り言でした。