質問: ### 前提・実現したいこと WindowsServer2008R2とSquid2.7で構築されたプロキシサーバを運用しています。 朝昼夕と、利用者が増える時間帯にはインターネットアクセスが遅くなることがあり、改善方法を探っています。 max_filedescriptorsの値を増加させて改善したという例がWeb上で多く見られたため、 値を0から3200まで調整してみたのですが、体感速度も変化はなく、エラーが減少した感じもありません。 Linuxでの設定例等はWeb上に多く情報があるのですが、Windowsでの例はあまり見当たらず......。 max_filedescriptorsの値については、Windows版では設定しても意味がないものなのでしょうか。 ### エラーメッセージ・試したこと cache.logを確認したところ、 ``` WARNING!Your cache is running out of filedescriptors ``` というエラーが多く見つかったため、そのままGoogle検索し、 max_filedescriptorsの調整で改善するという情報を見つけ、設定を0,1024,2400,3200といじってみましたが、 改善は見られませんでした。
回答: ご質問の投稿から数日経ってしまいましたが、なかなか回答が付かないようだったのと、少し興味を覚えましたので現存する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 の以下の関数にて報告されるものです。 ``` /* http://www.squid-cache.org/Versions/v2/2.7/squid-2.7.STABLE9-20110824.tar.gz * src/client_side.c より */ static int httpAcceptDefer(int fd, void *dataunused) { static time_t last_warn = 0; if (fdNFree() >= RESERVED_FD) return 0; if (last_warn + 15 < squid_curtime) { debug(33, 0) ("WARNING! Your cache is running out of filedescriptors\n"); last_warn = squid_curtime; } commDeferFD(fd); return 1; } ``` いきなりコードを見ても分かりませんが、全体の動作としては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)に使用可能として割り当てる**既定のソケット数**、です。さらに事情が複雑なことにソースコードのビルドの過程においてコードに埋め込まれる最大利用可能ソケット数が定義され、さらにUN*X系 OSとは異なるWindowsでのソケットの管理方法も相まって、せいぜい数千個である可能性が高いです。Windows 10 で可能なところまでビルドしてみたところ、2048個でした。 加えてWindowsでは使い終わったソケットが再び使えるようになるのにUN*Xとは違った部分があったはずで、少し不利です。(この点はちょっと記憶が不確かです。「ポートの枯渇問題」だったか、TCPの`TIME_WAIT`の時間だったか。Windows Server 2008 R2等、バージョン特有の事情もあるかもしれません) 上記のようなことをふまえ、squidのソースを質問者さんご自身でWindows用に更に改良すればお困りの問題をある程度まで改善できる気がしますが、現状では残念ながら限界のように思います。尚、squid-2.7 は脆弱性の報告もされていて新たに利用することはお勧めできないのですが、その点は本質問の主旨と異なると思いますので注意のみに留めます。