ディスからのアクセスよりメモリのアクセスの方か高速です。 Squidはパフォーマンスのために多くのメモリを使います。
キャッシュされたオブジェクトの為の少量のメタデータはメモリに保たれます。 これは StoreEntry データ構造といい、Squid2では56バイトのスモールポインターアーキテクチャ
(Intel, Sparc, MIPS, etc)と、88バイトのラージポインターアーキテクチャ(Alpha)です。各 StoreEntry には16バイトのキャッシュキー(MD5 checksum)が関連付けられています。このことは、キャッシュされたオブジェクトのそれぞれのために、72バイトまたは104バイトのメタデータがあることを意味します。それゆえ、1,000,000のオブジェクトをもつキャッシュは72MBのメモリを要求します。 実際にはこれ以上のメモリを必要とします。 設定ファイルのcahce_memも参照してください。
Squidは次のような事にもメモリを使います。
% 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
メモリを調べるもっと良い方法に top というプログラムがあります。
% 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
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%
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
94MBのうちの81%(76MB)は現在使われています。 残りはmalloc(3)によって割り当て済みですがまだ使っていません。
使っている76MBの内の58.5MB(76%)については説明できます。がそれ以外のmalloc(3)の結果は説明できません。それらは、メタデータリストとして使われたメモリの明細として考えられます。残りの42%については、StoreEntryとURLがVMの中のオブジェクトのフェッチのバッファとして使われたでしょう。(メモリの中にプールされたオブジェクト)もしあなたがあなたのプロセス・サイズを低くする必要があれば、私たちは、「HTTP」、「ftp」と「gopher」の設定で、max_objectのサイズを小さくすることを勧めます。また、あなたの必要性を満たすために、cache_memを小さくすることもできますが、この場合、オブジェクトがディスクに保存されることが頻繁になりパフォーマンスに影響を与えるかもしれません。
また、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
というように実行します。
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 installNote, 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 ...
Swapはパフォーマンスを悪化させるので、可能ならRAMを追加するようにしてください。
参考: