【Squid FAQ】 最終更新日:2003-05-06
【D-netプランページへ】【Squid Homeへ】 【FAQトップへ】
ディスからのアクセスよりメモリのアクセスの方か高速です。 Squidはパフォーマンスのために多くのメモリを使います。
キャッシュされたオブジェクトの為の少量のメタデータはメモリに保たれます。 これはStoreEntryデータ構造といい、Squid-2では56バイトのスモールポインターアーキテクチャ (Intel, Sparc, MIPS, etc)と、88バイトのラージポインターアーキテクチャ(Alpha)です。各StoreEntryには16バイトのキャッシュキー(MD5 checksum)が関連付けられています。このことは、キャッシュされたオブジェクトのそれぞれのために、72バイトまたは104バイトのメタデータがあることを意味します。それゆえ、1,000,000のオブジェクトをもつキャッシュは72MBのメモリを要求します。 実際にはこれ以上のメモリを必要とします。 設定ファイルのcahce_memも参照してください。
Squidは次のような事にもメモリを使います。
1つには、ps コマンドを使う方法があります。 BSD的なシステムでは -v オプションを ps で使うことで、VSZとRSSが表示されます。
wessels ~ 236% ps -axuhm
USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND
squid 9631 4.6 26.4 141204 137852 ?? S 10:13PM 78:22.80 squid -NCYs
SYS-V系のシステムでは ps で -l オプションを使うことで使用メモリが表示されますが、この際の表示されるサイズはページサイズです。ページサイズの単位はマニュアルを参照してしてください。(一般的には4KB)
メモリを調べるもっと良い方法に top というプログラムがあります。
last pid: 20128; load averages: 0.06, 0.12, 0.11 14:10:58
46 processes: 1 running, 45 sleeping
CPU states: % user, % nice, % system, % interrupt, % idle
Mem: 187M Active, 1884K Inact, 45M Wired, 268M Cache, 8351K Buf, 1296K Free
Swap: 1024M Total, 256K Used, 1024M Free
PID USERNAME PRI NICE SIZE RES STATE TIME WCPU CPU COMMAND
9631 squid 2 0 138M 135M select 78:45 3.93% 3.93% squid
最後は、Squid自身に表示するように依頼する方法で、これはキャッシュマネージャを使うことで可能です。以下は表示例ですが、表示内容はOSやSquidのバージョンによって違ってきます。
Resource usage for squid:
Maximum Resident Size: 137892 KB
Memory usage for squid via mstats():
Total space in arena: 140144 KB
Total free: 8153 KB 6%
もし、プロセスのサイズより常住しているサイズ(RSS)が小さいなら、あなたのキャッシュのパフォーマンスはページングのために苦しい事でしょう。
あなたはcache_mem パラメータをとても大きくしてませんか? "Squidのメモリの使い方を削減するにはどうしますか?"を参考にしてください。
プロセスが不安定であったりスピードが遅いとき、それはしばしばメモリリークを示しています。
メモリリークは現実的なプログラム(Squidのような)の問題で、過去、Squidにはメモリリークを本当に起こす問題がありました。 しかし、現在においては殆どメモリリークを起こす問題は解決したと信じています。
メモリリークは、libc.a や libmalloc.a といったシステムライブラリに存在しているかも知れません。もしメモリーリークが増大するようなら、私たちは"代替の malloc ライブラリ"をお勧めします。
cache_mem パラメータはプロセスの最大メモリサイズを指定するものではありません。 それはキャッシュの為のエリアをいくつにするかというものです。 Squidではキャッシュされた情報をディスクからロードする際に、このcache_memのサイズに影響されます。 cache_mem を削減することで、プロセスのメモリサイズも減る事でしょう。しかし、他にもメモリを減らす方法はあります。 "Squidのメモリの使い方を削減するにはどうしますか?"を参照してください。
Note: 以下の情報はSquid-1.1バージョン特有です。
cachemgr.cgi のキャッシュインフォメーションの例
Memory usage for squid via mallinfo():
Total space in arena: 94687 KB
Ordinary blocks: 32019 KB 210034 blks
Small blocks: 44364 KB 569500 blks
Holding blocks: 0 KB 5695 blks
Free Small blocks: 6650 KB
Free Ordinary blocks: 11652 KB
Total in use: 76384 KB 81%
Total free: 18302 KB 19%
Meta Data:
StoreEntry 246043 x 64 bytes = 15377 KB
IPCacheEntry 971 x 88 bytes = 83 KB
Hash link 2 x 24 bytes = 0 KB
URL strings = 11422 KB
Pool MemObject structures 514 x 144 bytes = 72 KB ( 70 free)
Pool for Request structur 516 x 4380 bytes = 2207 KB ( 2121 free)
Pool for in-memory object 6200 x 4096 bytes = 24800 KB ( 22888 free)
Pool for disk I/O 242 x 8192 bytes = 1936 KB ( 1888 free)
Miscellaneous = 2600 KB
total Accounted = 58499 KB
mallinfo()情報の最初の"arena"として表示される情報は、活動中のメモリ(94MB)を報告します。
94MBのうちの81%(76MB)は現在使われています。 残りはmalloc(3)によって割り当て済みですがまだ使っていません。
使っている76MBの内の58.5MB(76%)については説明できます。がそれ以外のmalloc(3)の結果は説明できません。それらは、メタデータリストとして使われたメモリの明細として考えられます。残りの42%については、StoreEntryとURLがVMの中のオブジェクトのフェッチのバッファとして使われたでしょう。(メモリの中にプールされたオブジェクト)
もしあなたがあなたのプロセス・サイズを低くする必要があれば、私たちは、「HTTP」、「ftp」と「gopher」の設定で、max_objectのサイズを小さくすることを勧めます。また、あなたの必要性を満たすために、cache_memを小さくすることもできますが、この場合、オブジェクトがディスクに保存されることが頻繁になりパフォーマンスに影響を与えるかもしれません。
私たちはSquidの使っているすべてのメモリを説明できません。 Squidのコードは過度のメモリを入手し、それを開放することがありません。
また、malloc とその開放の機構には、それ自身のオーバーヘッドが存在します。 追加されたメモリはfreeによって開放されるまでの利用中はブロックメモリとして保たれています。 殆どのOSではfreeによってメモリを圧縮することは可能としていせん。プロセスのトータルのメモリサイズは、 Squidが必要とした最大のメモリサイズを表しています。
"FATAL: xcalloc: Unable to allocate 4096 blocks of 1 bytes!"。このエラーメッセジはメモリのアロケーションに失敗したことを示します。 多分以下の2つの理由です。
最初のが原因なら、スワップ監視のツールで判ります。(SunOSのpstatや、BSDのpstata)
2番の原因の場合、カーネルの制限でなっている場合と、ulimitで制限されている場合があります。
このコマンドで、システムの制限がわかります。
ulimit -aH
以下のコマンドでulimitで設定されたサイズが判ります。
ulimit -HSd unlimited
by Arjan de Vet
BSD/OSのカーネルのデフォルトのサイズは64MBです(3.0の場合)
より大きなサイズでカーネルを再コンパイルしてください。
maxusers 128
# Support for large inpcb hash tables, e.g. busy WEB servers.
options INET_SERVER
# support for large routing tables, e.g. gated with full Internet routing:
options "KMEMSIZE=\(16*1024*1024\)"
options "DFLDSIZ=\(128*1024*1024\)"
options "DFLSSIZ=\(8*1024*1024\)"
options "SOMAXCONN=128"
options "MAXDSIZ=\(256*1024*1024\)"
/usr/share/doc/bsdi/config.n 参照のこと。
/etc/login.conf で設定したこと:
default:\
:path=/bin /usr/bin /usr/contrib/bin:\
:datasize-cur=256M:\
:openfiles-cur=1024:\
:openfiles-max=1024:\
:maxproc-cur=1024:\
:stacksize-cur=64M:\
:radius-challenge-styles=activ,crypto,skey,snk,token:\
:tc=auth-bsdi-defaults:\
:tc=auth-ftp-bsdi-defaults:
#
# Settings used by /etc/rc and root
# This must be set properly for daemons started as root by inetd as well.
# Be sure reset these values back to system defaults in the default class!
#
daemon:\
:path=/bin /usr/bin /sbin /usr/sbin:\
:widepasswords:\
:tc=default:
# :datasize-cur=128M:\
# :openfiles-cur=256:\
# :maxproc-cur=256:\
This should give enough space for a 256MB squid process.
by Duane Wessels
上記のBSD/OSの手順と殆ど同じです。 /sys/conf/param.cの数値を増やします:
int maxfiles = 4096;
int maxfilesperproc = 1024;
カーネルのconfigファイルでデフォルトのデータセグメントサイズを増やします。例えば. /sys/conf/i386/CONFIG:
options "MAXDSIZ=(512*1024*1024)"
options "DFLDSIZ=(128*1024*1024)"
mbuf の値も増やします。:
options "NMBCLUSTERS=10240"
もしあなたのマシンが256MB以上の物理メモリを持っているなら、BOUNCE_BUFFERSを無効にするためにコメントアウトすべきでしょう。
#options BOUNCE_BUFFERS #include support for DMA bounce buffers
また、以下のように /etc/login.conf で制限します。
# Settings used by /etc/rc
#
daemon:\
:coredumpsize=infinity:\
:datasize=infinity:\
:maxproc=256:\
:maxproc-cur@:\
:memoryuse-cur=64M:\
:memorylocked-cur=64M:\
:openfiles=4096:\
:openfiles-cur@:\
:stacksize=64M:\
:tc=default:
/etc/login.conf を編集した後では、"ap_mkdb /etc/login.conf"を実行するのを忘れないこと。
by Ong Beng Hui
Digital UNIXの場合には /etc/sysconfigtab を編集して以下のようなエントリを追加します。
proc:
per-proc-data-size=1073741824
あるいは、cshのコマンドで limit コマンドを
> limit datasize 1024M
というように実行します。
Squidをリコンフィグ(SIGHUP)やログローテション(SIGUSR1)したとき、幾つかのヘルパープログラム(dnsserver)を kill し再スタートしなくてはなりません。 この際、システムに仮想メモリに十分なエリアがないとヘルパープログラムを fork によってスタートさせることができないかも知れません。 これを解決する簡単な方法はスワップを追加し仮想メモリを増やすことです。 あなたのシステムのswap, swapon, mkfile.についてのマニュアルを参照してください。
あなたがメモリの制限によりキャッシュパフォーマンスで悩んでいるなら、より多くのメモリを増設すべきです。 しかし増設を考えていないなら、試みることができる多くのことがあります。
私たちはパフォーマンスの改善の解決策として、標準以外のmallocライブラリを使う方法を発見しました。 私たちは GNU malloc または dlmalloc を推薦します。
To make Squid use GNU malloc follow these simple steps:
% gzip -dc malloc.tar.gz | tar xf -
% cd malloc
% vi Makefile # edit as needed
% make
% su
# cp malloc.a /usr/lib/libgnumalloc.a
# cp malloc.h /usr/include/gnumalloc.h
% make realclean
% ./configure ...
% make
% make install
Note, In later distributions, 'realclean' has been changed to 'distclean'.
As the configure script runs, watch its output. You should find that it locates
libgnumalloc.a and optionally gnumalloc.h. dlmalloc has been written by Doug Lea. According to Doug:
This is not the fastest, most space-conserving, most portable, or most tunable malloc ever written. However it is among the fastest while also being among the most space-conserving, portable and tunable.
dlmalloc is included with the Squid-2 source distribution. To use this library, you simply give an option to the configure script:
% ./configure --enable-dlmalloc ...
経験的に、すべてのcache_dirsで1GBある場合、10MBのRAMを使用します。 (64bitのAlphaの場合にには更に) プラス、あなたが指定した cache_mem のサイズも必要です。
推奨は、この量の更に2倍の物理メモリが望まれます。 Squidのメモリの使い方に関しては上記のセクションを参照してください。
Swapはパフォーマンスを悪化させるので、可能ならRAMを追加するようにしてください。
【D-netプランページへ】【Squid Homeへ】 【FAQトップへ】
Copyright© 1998-2003 ROBATA.ORG