質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Squid

Squidは、TCP/IPネットワークでのユーザーとサーバの通信を中継するオープンソースのプロキシサーバソフト。リバースプロキシやキャッシュサーバとして使用することも可能です。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Q&A

解決済

1回答

7507閲覧

WindowsServerでSquid運用時のmax_filedescriptorsについて

maple0703

総合スコア1

Squid

Squidは、TCP/IPネットワークでのユーザーとサーバの通信を中継するオープンソースのプロキシサーバソフト。リバースプロキシやキャッシュサーバとして使用することも可能です。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

0グッド

0クリップ

投稿2020/06/30 09:52

編集2020/06/30 14:02

前提・実現したいこと

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といじってみましたが、
改善は見られませんでした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ご質問の投稿から数日経ってしまいましたが、なかなか回答が付かないようだったのと、少し興味を覚えましたので現存する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では使い終わったソケットが再び使えるようになるのにUN
Xとは違った部分があったはずで、少し不利です。(この点はちょっと記憶が不確かです。「ポートの枯渇問題」だったか、TCPのTIME_WAITの時間だったか。Windows Server 2008 R2等、バージョン特有の事情もあるかもしれません)

上記のようなことをふまえ、squidのソースを質問者さんご自身でWindows用に更に改良すればお困りの問題をある程度まで改善できる気がしますが、現状では残念ながら限界のように思います。尚、squid-2.7 は脆弱性の報告もされていて新たに利用することはお勧めできないのですが、その点は本質問の主旨と異なると思いますので注意のみに留めます。

投稿2020/07/06 10:35

dodox86

総合スコア9256

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maple0703

2020/07/07 16:14

ご回答ありがとうございました。 ご丁寧な解説で、理由を理解することができました。 現環境での速度改善は諦め、Linux系での環境更新を検討してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問