2007年1月22日月曜日

squid の coredump

先日より仕事でちらほらとSquidに関わってしまいました。今までおきていたのか、おきていなかったのかわかりませんがメモリの問題です。
AIX5.1/Squid2.5を利用しており、Cache_memが256Mとか128Mとか定義してる状態でSquidプロセスの process private (0x2セグメント)が256Mを超えてしまい、それと同時にCoreを吐いてお亡くなりになります。丁度Cache_memを256Mにしていた関係もあり原因が全然わかりませんでしたが設定としてはラージオブジェクトメモリモデルで使用しなければいけないみたいです。しかもFAQにもろに書いてあってショックです。
http://squid.robata.org/faq_14.html

しかしながらこの設定をしたとしても結局の所 work working storage (0x3セグメント)とかで稼働しているにすぎず結局の所問題を解決しているわけではないのが困りものです。
AIX におけるC および C++ アプリケーションの開発 および移植

実際には、memory_pools / memory_pools_limit がキチンと動いて行かなければいけないのだと思います。解決していないので参考になりませんが状況だけ載せておきます。

よくわからない事がたくさんのSquidです。
cache_memはディフォルトで8M、特に上限は定められていない模様です。メモリの割り当てに関するパラメータであることは間違いないのですが今一使い方がわかりません。
memory_pools_limitのパラメータはディフォルトはNoneで上限が50Mになっています。設定(memory_pools = on) の場合には有効になっていると思います。マニュアルを読むと、
http://sv1.robata.org/squid2.0-conf.html

もし0でない値にセットされたなら、Squidは、メモリー・プールで割り当てられたメモリーの指定された限界を保持し続けるでしょう。あなたのmallocライブラリによって、free()リクエストによってこの限界まで扱われるでしょう。
Squidはあらかじめメモリを割り付けません、
あなたのシステム構成がより少ないメモリーを使っている場合には、memory_pools_limiによって合理的な限界の値をセットするほうが安全でしょう。

もし何もセットしない(デフォルト)か0をセットした場合、Squidは可能な限りのメモリをすべて維持するでしょう。 すなわち、保管のために使用された合計の量のメモリに制限はありません


と記述されています。この場合、memory_pools_limitを設定した場合には cache_memの値の上限も50Mになるのでしょうか?よくわかりません。。
実際の所、解放されるタイミングがわからず少なくとも cache_mem = 128 ではprocess private が256MになりCoreすることから 無制限に動いている様に見受けられます。 malloc等で確保できない段階で解放してくれれば良いのに・・

0 コメント: