ご質問の投稿から数日経ってしまいましたが、なかなか回答が付かないようだったのと、少し興味を覚えましたので現存するsquid-2.7.STABLE8 - squid-cache.orgのソースコードをもとに調べてみました。結論から書くと、残念ながら
Windows版squid-2.7ではmax_filedescriptors
は使えません。
尚、squid-2.7のリリースは10年以上前と古く、私の方ではWindows上でのビルド環境が整えられなかったため、ソースコードを読んだことのみでのご報告となります。
質問文中にご提示の警告メッセージ「WARNING!Your cache is running out of filedescriptors」は、ソースコード src/client_side.c の以下の関数にて報告されるものです。
C
1/* http://www.squid-cache.org/Versions/v2/2.7/squid-2.7.STABLE9-20110824.tar.gz
2 * src/client_side.c より
3 */
4static int
5httpAcceptDefer(int fd, void *dataunused)
6{
7 static time_t last_warn = 0;
8 if (fdNFree() >= RESERVED_FD)
9 return 0;
10 if (last_warn + 15 < squid_curtime) {
11 debug(33, 0) ("WARNING! Your cache is running out of filedescriptors\n");
12 last_warn = squid_curtime;
13 }
14 commDeferFD(fd);
15 return 1;
16}
17
いきなりコードを見ても分かりませんが、全体の動作としてはsquidに接続可能なクライアントの数に余裕が無くなったときにこの警告を出すようです。一定の期間をおいてまた余裕が無くなると再度、警告を出すようになっています。頻繁に報告を出さないようようにする工夫と考えられます。
このコードにあるfd
、つまりfiledescriptor(ファイルディスクリプタ)はsquidとクライアントを接続するソケットの識別子を示すものですが、Linux OSではulimit
コマンドと関連するsetrlimit
システムコール(言うなればAPI)を利用することで使用可能なソケットの数を増減することができます。
getrlimit/setrlimit - Linux man(2)
この変更値をセットする項目が、設定ファイルsquid.conf
における「max_filedescriptors
」です。Windowsにはsetrlimit
に相当するAPIは存在しないので、この設定項目に対する操作は無効になっています。squidは各種UN*X、Windows OSで動作可能なクロスプラットフォームなオープンソースプログラムですが、そのソースコードからのビルドの過程でGNU Autoconfと言うプログラムを利用し、setrlimit
がC言語ソースコードで使用可能かを判定し、実行ファイルを作り上げていきます。Windowsではその判定結果により、max_filedescriptors
の操作が結果的に無効になる、と言うことになります。
ではWindows版squid-2.7.STABLE8の実行ファイルでは実質どれだけのソケットが使えるかと言うと、Windowsがいちプロセス(=squid)に使用可能として割り当てる既定のソケット数、です。さらに事情が複雑なことにソースコードのビルドの過程においてコードに埋め込まれる最大利用可能ソケット数が定義され、さらにUNX系 OSとは異なるWindowsでのソケットの管理方法も相まって、せいぜい数千個である可能性が高いです。Windows 10 で可能なところまでビルドしてみたところ、2048個でした。
加えてWindowsでは使い終わったソケットが再び使えるようになるのにUNXとは違った部分があったはずで、少し不利です。(この点はちょっと記憶が不確かです。「ポートの枯渇問題」だったか、TCPのTIME_WAIT
の時間だったか。Windows Server 2008 R2等、バージョン特有の事情もあるかもしれません)
上記のようなことをふまえ、squidのソースを質問者さんご自身でWindows用に更に改良すればお困りの問題をある程度まで改善できる気がしますが、現状では残念ながら限界のように思います。尚、squid-2.7 は脆弱性の報告もされていて新たに利用することはお勧めできないのですが、その点は本質問の主旨と異なると思いますので注意のみに留めます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/07 16:14