最終更新日: 2014年1月13日
Squid Home / FAQトップ

8. メモリ

8.1 Squidはなぜそんなにメモリを必要とするのですか?

ディスからのアクセスよりメモリのアクセスの方か高速です。 Squidはパフォーマンスのために多くのメモリを使います。
キャッシュされたオブジェクトの為の少量のメタデータはメモリに保たれます。 これは StoreEntry データ構造といい、Squid2では56バイトのスモールポインターアーキテクチャ (Intel, Sparc, MIPS, etc)と、88バイトのラージポインターアーキテクチャ(Alpha)です。各 StoreEntry には16バイトのキャッシュキー(MD5 checksum)が関連付けられています。このことは、キャッシュされたオブジェクトのそれぞれのために、72バイトまたは104バイトのメタデータがあることを意味します。それゆえ、1,000,000のオブジェクトをもつキャッシュは72MBのメモリを要求します。 実際にはこれ以上のメモリを必要とします。 設定ファイルのcahce_memも参照してください。
Squidは次のような事にもメモリを使います。

8.2 Squidが使っているメモリはどう調べますか?

1つには、ps コマンドを使う方法があります。 BSD的なシステムでは -v オプションを ps で使うことで、VSZ RSS が表示されます。
% 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 というプログラムがあります。

% 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)が小さいなら、あなたのキャッシュのパフォーマンスはページングのために苦しい事でしょう。

8.3 私のSquidプロセスは限界なしで大きくなっています。

あなたは cache_mem パラメータをとても大きくしてませんか? "Squidのメモリの使い方を削減するにはどうしますか?"を参考にしてください。
プロセスが不安定であったりスピードが遅いとき、それはしばしばメモリリークを示しています。
メモリリークは現実的なプログラム(Squidのような)の問題で、過去、Squidにはメモリリークを本当に起こす問題がありました。 しかし、現在においては殆どメモリリークを起こす問題は解決したと信じています。

メモリリークは、libc.alibmalloc.a といったシステムライブラリに存在しているかも知れません。もしメモリーリークが増大するようなら、私たちは"代替の malloc ライブラリ"をお勧めします。

8.4 cache_memをxxにセットしました。しかしプロセスはそれを越えるようになります。

cache_mem パラメータはプロセスの最大メモリサイズを指定するものではありません。 それはキャッシュの為のエリアをいくつにするかというものです。 Squidではキャッシュされた情報をディスクからロードする際に、このcache_memのサイズに影響されます。 cache_mem を削減することで、プロセスのメモリサイズも減る事でしょう。しかし、他にもメモリを減らす方法はあります。 "Squidのメモリの使い方を削減するにはどうしますか?"を参照してください。

8.5 キャッシュマネージャの情報からどうやってメモリ分析をしますか?

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を小さくすることもできますが、この場合、オブジェクトがディスクに保存されることが頻繁になりパフォーマンスに影響を与えるかもしれません。

8.6 "Total memory accounted"の数値がSquidのプロセスのメモリサイズより小さいです。

私たちはSquidの使っているすべてのメモリを説明できません。 Squidのコードは過度のメモリを入手し、それを開放することがありません。 

また、malloc とその開放の機構には、それ自身のオーバーヘッドが存在します。 追加されたメモリは free によって開放されるまでの利用中はブロックメモリとして保たれています。 殆どのOSでは free によってメモリを圧縮することは可能としていせん。プロセスのトータルのメモリサイズは、 Squidが必要とした最大のメモリサイズを表しています。

8.7 xmalloc: Unable to allocate 4096 bytes!

by Henrik Nordstrom

"FATAL: xcalloc: Unable to allocate 4096 blocks of 1 bytes!"。このエラーメッセジはメモリのアロケーションに失敗したことを示します。 多分以下の2つの理由です。

  1. スワップエリアが無くなった。
  2. プロセスに対する最大セグメントサイズが指定されている。

最初のが原因なら、スワップ監視のツールで判ります。(SunOSのpstatや、BSDのpstata)

2番の原因の場合、カーネルの制限でなっている場合と、ulimitで制限されている場合があります。

このコマンドで、システムの制限がわかります。

        ulimit -aH

以下のコマンドでulimitで設定されたサイズが判ります。

        ulimit -HSd unlimited

BSD/OSの場合

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.

FreeBSD (2.2.X)での設定

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"を実行するのを忘れないこと。

OSF, Digital Unixでの設定

by Ong Beng Hui

Digital UNIXの場合には /etc/sysconfigtab を編集して以下のようなエントリを追加します。

        proc:
                per-proc-data-size=1073741824

あるいは、cshのコマンドで limit コマンドを

        > limit datasize 1024M

というように実行します。

8.8 fork: (12) Cannot allocate memory

Squid をリコンフィグ(SIGHUP)やログローテション(SIGUSR1)したとき、幾つかのヘルパープログラム(dnsserver)を kill し再スタートしなくてはなりません。 この際、システムに仮想メモリに十分なエリアがないとヘルパープログラムを fork によってスタートさせることができないかも知れません。 これを解決する簡単な方法はスワップを追加し仮想メモリを増やすことです。 あなたのシステムの swap, swapon, mkfile についてのマニュアルを参照してください。

8.9 Squidのメモリの使い方を削減するにはどうしますか?

あなたがメモリの制限によりキャッシュパフォーマンスで悩んでいるなら、より多くのメモリを増設すべきです。 
しかし増設を考えていないなら、試みることができる多くのことがあります。

8.10 代替の malloc ライブラリの使い方

私たちはパフォーマンスの改善の解決策として、標準以外のmallocライブラリを使う方法を発見しました。 私たちは GNU malloc または dlmalloc を推薦します。

Using GNU malloc

To make Squid use GNU malloc follow these simple steps:

  1. Download the GNU malloc source, available from one of The GNU FTP Mirror sites.
  2. Compile GNU malloc
            % gzip -dc malloc.tar.gz | tar xf -
            % cd malloc
            % vi Makefile     # edit as needed
            % make
    
  3. Copy libmalloc.a to your system's library directory and be sure to name it libgnumalloc.a.
            % su
            # cp malloc.a /usr/lib/libgnumalloc.a
    
  4. (Optional) Copy the GNU malloc.h to your system's include directory and be sure to name it gnumalloc.h. This step is not required, but if you do this, then Squid will be able to use the mstat() function to report memory usage statistics on the cachemgr info page.
            # cp malloc.h /usr/include/gnumalloc.h
    
  5. Reconfigure and recompile Squid
            % 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

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 ...

8.11 私のSquidはどのくらいメモリを必要とするのでしょう?

経験的に、すべてのcache_dirsで1GBある場合、10MBのRAMを使用します。 (64bitのAlphaの場合にには更に) プラス、あなたが指定した cache_mem のサイズも必要です。
推奨は、この量の更に2倍の物理メモリが望まれます。 Squidのメモリの使い方に関しては上記のセクションを参照してください。

Swapはパフォーマンスを悪化させるので、可能ならRAMを追加するようにしてください。

Squid Home / FAQトップ

参考: