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

14. OS(システム)に依存する問題(謎)

14.1 Solaris

■ TCPは非互換?

J.D. Bronson (jb at ktxg dot com) の報告によると、moneycentral.msn.com www.mbnanetaccess.com. といったソースサーバと通信が出来なかったそうです。 J.D は以下のようにして問題を回避できたそうです。

tcp_xmit_hiwat 49152
tcp_xmit_lowat 4096
tcp_recv_hiwat 49152

■ select()

select(3C)は、1024以上のファイル記述子を処理できません。 configureスクリプトは、デフォルトでpoll()を有効にする事でしょう。 poll()は多分、8192以上のファイル記述子使うことでしょう。 
古いSquidのバージョンを使っているなら、include/autoconf.h の中のHAVE_POLL か、src/Makefileの中に-DUSE_POLL=1を定義すると良いでしょう。

■ malloc

libmalloc.aはメモリリークを起こします。 configureの際に、-lmalloc を使用しないでください。

■ DNS lookups と nscd

David J N Begley. によると、DNSはnscdから呼ばれることで遅くなるというミステリアスな挙動をします。 /etc/nscd.confを編集して、

enable-cache hosts no

としてください。
どうやらnscdは、SquidがDNSに対する検索要求を行った際に、DNS要求を連続して発生させることで速度を落としている様子です。  もし注意深くログを観察すれば、多くのDNS要求を発生させていることに気づくと思います。

■ DNS lookups と /etc/nsswitch.conf

Jason Armistead. によると /etc/nsswitch.conf は名前解決の順を決定します。 DNSでの検索を有効にする為に、このファイルに明示してください。

hosts: nis dns [NOTFOUND=return] files

■ DNS lookups and NIS

Chris Tilbury. によると、ローカルでNISサーバ(ypserv)を動かし、etc/nsswitch.conf のhostエントリで、NISを指定している場合、NISはNISによって発見できなかった名前をDNSのリゾルバを使って発見しようと試みる為にDNS検索が遅くなる可能性があります。

対策は、

■ チューニング

・disk write error: (28) No space left on deviceが出た場合
ディスクのスペースもiノードも十分なのにこのメッセージが出た場合、/var/adm/messagesに記録されたsyslogをチェックしてください。
ここで、
NOTICE: realloccg /proxy/cache: file system full
NOTICE: alloc: /proxy/cache: file system full
というようなメッセージを見つけたなら、このSolaris のUFSファイルシステムは、Squidのワークロードの能力に足りません。 
このUFSは断片化が進みすぎてSquidの必要とする連続した領域を確保できなくなっています。
対策としては2つの方法があります。
1つは、VeritasのVxFSを導入する事(有償です)。 
もう一つは、UFSのパラメータを変える方法で、キャッシュのファイルシステムをアンマウント後、tunefs を使い"space"を最適化(change optimization)し、かつ"minfree"の値を3-5%程下げてください。 これによって3%程度のフラグメンテーションを下げる効果があります。
・Solaris X86 と IPFilter
Solaris X86と IPFilterの組み合わせにはメモリーリークを起こさせるようです。
・Changing the directory lookup cache size
by Mike Batchelor

Solarisでは、(DNSの)nameのlookupのためキャッシュサイズは/etc/systemの中のカーネル変数の ncsize で変えられます。 あなたは、次のような値(またはそれ以上の値)にするかも知れません。
set ncsize = 8192
カーネル変数の ufs_inode は、ncsize とともにSolaris2.5.1以上のi-nodeのキャッシュに影響する変数です。 以前のSolarisでは、両方を独立して調整しましたが現在では ufs_inode を直接調整することは推奨されていません。

あなたは ncsize の値を大きくする事ができますが、これはアプリケーションの数を考慮しないと結果としてlookupの検索時間が増大することがあります。

デフォルトでは:
Solaris 2.5.1 : (max_nprocs + 16 + maxusers) + 64
Solaris 2.6/Solaris 7 : 4 * (max_nprocs + maxusers) + 320
・The priority_paging algorithm
Mike Batchelor による情報の不完全訳

Solaris 2.5.1, 2.6 or Solaris 7では、priority_paging という新しい調整ができるようになっています。 これはSolarisの仮想メモリシステムの完全な書き直しになっています。 この調整は、/etc/system で priority_paging = 1をセットすることで有効になり、(筆者:Solarisのことは良く判りませんが)これによってアプリケーションが使うメモリがページアウトされる事が少なくなって性能が上がるようです。
しかし、この調整を行うためには、Solaris 2.5.1ではパッチ 103640-25以上の適用、Solaris 2.6では105181-10以上を適用が必要です。 Solaris 7ではパッチは不要です。

14.2 FreeBSD

■ T/TCPのバグ

FreeBSD-2.2.2-RELEASEにはT/TCPのバグがあります。 sysinstallの際に、"TCP Extensions "を無効にするか、あるいは/etc/rc.confでTCP Extensionsを無効にし

tcp_extensions="NO" # Allow RFC1323 & RFC1544 extensions (or NO).
かつ、/etc/rc で
sysctl -w net.inet.tcp.rfc1644=0

として下さい。

■ mbuf size

私たちはSqudiのプロセス間通信で奇妙なことに気付きました。 たびたび、dnsserverプログラムからの情報がはき出されるようで、これをデバックしてみた。

1998/04/02 15:18:48| comm_select: FD 46 ready for reading
1998/04/02 15:18:48| ipcache_dnsHandleRead: Result from DNS ID 2 (100 bytes)
1998/04/02 15:18:48| ipcache_dnsHandleRead: Incomplete reply
....other processing occurs...
1998/04/02 15:18:48| comm_select: FD 46 ready for reading
1998/04/02 15:18:48| ipcache_dnsHandleRead: Result from DNS ID 2 (9 bytes)
1998/04/02 15:18:48| ipcache_parsebuffer: parsing:
$name www.karup.com
$h_name www.karup.inter.net
$h_len 4
$ipcount 2
38.15.68.128
38.15.67.128
$ttl 2348
$end

おもしろい事に、最小のは一般的な100バイトのリードです。 2番目の読み込みでは、要求に対して追加の待ち時間が加えられる筈です。 デジタルUNIXでは0.01秒、FreeBSDでは0.10秒です。

このバグを修正する為のパッチは以下の通りです。

===================================================================
RCS file: /home/ncvs/src/sys/kern/uipc_socket.c,v
retrieving revision 1.40
retrieving revision 1.41
diff -p -u -r1.40 -r1.41
--- src/sys/kern/uipc_socket.c  1998/05/15 20:11:30     1.40
+++ /home/ncvs/src/sys/kern/uipc_socket.c       1998/07/06 19:27:14     1.41
@@ -31,7 +31,7 @@
  * SUCH DAMAGE.
  *
  *     @(#)uipc_socket.c       8.3 (Berkeley) 4/15/94
- *     $Id: FAQ.sgml,v 1.213 2004/01/16 23:12:55 hno Exp $
+ *     $Id: FAQ.sgml,v 1.213 2004/01/16 23:12:55 hno Exp $
  */

 #include <sys/param.h>
@@ -491,6 +491,7 @@ restart:
                                mlen = MCLBYTES;
                                len = min(min(mlen, resid), space);
                        } else {
+                               atomic = 1;
 nopages:
                                len = min(min(mlen, resid), space);
                                /*

----
バグを直さず、別の方法を取るならカーネルのMSIZEを増やす方法があります。 これは、/usr/include/machine/param.h の中で定義されており、デフォルトでは128になっています。これを

options MSIZE="256"
としてカーネルを再構築します。

■ NISの扱い

/var/yp/Makefile に以下のセクションがあります。

# The following line encodes the YP_INTERDOMAIN key into the hosts.byname
# and hosts.byaddr maps so that ypserv(8) will do DNS lookups to resolve
# hosts not in the current domain. Commenting this line out will disable
# the DNS lookups.
B=-b
ypがDNSを検索しないように、B=-bの部分をコメントアウトしてください。

■ FreeBSD 3.3: lo0(ループバック)がスタート時に構成されません。

Squidの起動には lo0 のインターフェースが必要でこれが無いとcommBind. というエラーになります。

FreeBSD 3.3 Errata Notes: (FreeBSD3.3のバグノートから)
問題: /etc/rc.confの中のネットワークデバイスの値は、本来であれば自動的に編集されて、ループバックデバイスは「auto」から「lo0」に書き換えられる筈ですがそうはなりません。というわけでエディタ(viで)、rc.confを手動で編集してs/auto/lo0/としてネットワークインターフェースのデバイスを編集してください。

Thanks to Robert Lister.

■ jail環境下での内部DNS

jail環境下におけるSquidの実行の問題を何人か報告しています。 Squidは次のようなメッセージをはき出します。

2001/10/12 02:08:49| comm_udp_sendto: FD 4, 192.168.1.3, port 53: (22) Invalid argument
2001/10/12 02:08:49| idnsSendQuery: FD 4: sendto: (22) Invalid argument

jail環境でのSquid.confで、'udp_outgoing_addr' にてネットワークインターフェースを明示的に指定する事で問題を解決できます。

14.3 OSF1/3.2

もし、Squidを libgnumalloc とccを使ってコンパイルしたなら、mstats() には間違った値が戻ります。 libgnumalloc とgccを組み合わせれば正しい結果を戻します。

14.4 BSD/OS

■ gcc/yacc

BSD/OS上でSquidをコンパイルすると障害を発生するという報告があります。

14.5 Linux

■ Cannot bind socket FD 5 to 127.0.0.1:0: (49) Can't assign requested address

Linux2.0.30を使っているなら、バグだと思われますので別のバージョンで試してみてください。

■ FATAL: Don't run Squid as root, set 'cache_effective_user'!

cache_effective_usernobodyをセットしたら動作しなかったという報告がありました。 nobody以外では正常だったということです。 解決策の1つは、nobody以外のユーザIDを仕様することです。 

別の問題として、RedHat5.0のsetresuid() には問題がありそうです。 この対策には、以下の2つ方法が考えられるます。1つはSquidのConfigure前であれば、

# setenv ac_cv_func_setresuid no
# ./configure ...
# make clean
# make install

という方法で、もう1つは include/autoconf.h のHAVE_SETRESUID をコメントにする方法です。

#define HAVE_SETRESUID 0

また、何人かのユーザーは、このエラーがNIS構成による結果であると報告してます。/etc/nsswitch.confの中のpasswdとgroupの行に、compat を加えることによって問題は解決します。

Russ Mellon によるとこれらの問題はカーネル2.2で解決しているとの事です。

■ 長いACLにするとSquidが遅くなります。

Linuxの正規表現ライブラリは遅い事が報告されています。 解決には、GNUregexライブラリを使ってください。 Squid2からは、configureのオプションで --enable-gnuregex として指定できるようになっています。

■ gethostbyname()はglibc 2.1.1のRedHat 6.0でメモリリークを起こします。

Radu Greab によると、gethostbyname()はglibc 2.1.1のRedHat 6.0でメモリリークを起こします。 応急対応としては、/etc/nsswitch.conf の中でnisplusサービスの部分を削除してください。
RedHat bug id 3919. を参照してください。

■ assertion failed: StatHist.c:91: `statHistBin(H, max) == H->capacity - 1' on Alpha system.

初期のLinuxのカーネルにはこれを引き起こすバグがあります。 別のバージョンのLinuxを使ってください。

■ tools.c:605: storage size of `rl' isn't known

これは、いくつかのバージョンのglibcのバグです。 幾つかのカーネルヘッダーの誤った内容によりglibcが破壊されました。
このglibcのバグは2.1(または2.0)以前のことだと思います。 2つの解決策があります。

  1. 対応できるカーネルのソースを入手して、glibcをこのカーネルのソースヘッダーを使ってコンパイルします。 コンパイルはglibcだけで、その際、ヘッダーの指定で-I/usr/src/linux/includeとして正しいカーネルヘッダーを指すようにします。
  2. 最新のLinuxにアップデートしてください。

■ 幾つかのサイトに接続する事ができません。

幾つかのサイトに接続すると、"(111) Connection refused"や"(110) Connection timed out'"といってつながらないかも知れません。
これは、Linuxに実装されたECN(Explicit Congestion Notification )に問題がありTCP/IPやファイヤーウォールに問題を起こすためです。  このような問題のあるサイトは、ECN Hall of Shameで報告されています。
解決には、問題のあるサイトに連絡して、問題のLinuxを変更してもらうか、あなたの方で以下のコマンドで無効にする方法があります。

# echo 0 > /proc/sys/net/ipv4/tcp_ecn

14.6 HP-UX

■ StatHist.c:74: failed assertion `statHistBin(H, min) == 0'

gccとHP-UXの組合わせにおいて、発生します。 Squid2.2で発生するようです。

14.7 IRIX

■ dnsserverが常に255.255.255.255を返します。

Irix6とGCCの2.8.1以上の組合せの問題です。  GCCではなく通常のCを使ってください。

14.8 SCO-UNIX

F.J. Bosscha によると:

■ SCO-UNIXでSquidを動かすには以下のことが必要です。

NOFILESNUMSP のカーネルパラメータの値を増やしてください。 またtcp-connections の数も増やしてください。にもかかわらずsquidのログファイルにファイルディスクリプタが3000、というようなになってファイルディスクリプタが不足したと報告されたなら、

残された1つの方法は、システムが処理するTCPコネクションの数です。 デフォルトでは256です。 しかし接続するクライアントの数によって十分な数にしてください。

14.9 AIX

■ "shmat failed"エラーとなる

AIXは32ビットプロセスで動作しており、共有メモリセグメントが最大11までに制限されています。この制限はAIX4.2.1で外されましたがSquidを起動する際に環境変数でEXTSHM=ON を設定する必要があります。

■ Squidのメモリが256M以上になってコアダンプします

32ビットプロセスのデフォルトメモリモデルでは256MB以上のスタックやデータのメモリを使えません。 Squidで大きなメモリを使うには、

詳細についてはIBM's documentation をご覧になってください。


参考: