
以下の二つのファイルを編集してください:
/usr/include/sys/socket.h
/usr/src/sys/sys/socket.h
それぞれのファイルで次を捜してください:
/*
* Maximum queue length specifiable by listen.
*/
#define SOMAXCONN 5
"5"を動くと思われるものに変えてください。32 にして問題を生じた二つのマシンを bump してからは、問題を気にしていません。
編集した後、カーネルを再コンパイルして、Apache サーバを再コンパイルして、それからリブートしてください。
既に 32 に設定されている SOMAXCONN で、FreeBSD 2.1 は完全なようです。
非常にロードが重い BSD サーバのための追加
from Chuck Murcko <chuck@telebase.com>
もし、本当は頻繁な BSD の Apache サーバを走らせていないのにシステムが遅いなら、以下を行うといいです。:
maxusers 256Maxusers は、たくさんの他のカーネルパラメータを操作します:
# Network options. NMBCLUSTERS defines the number of mbuf clusters and # defaults to 256. This machine is a server that handles lots of traffic, # so we crank that value. options SOMAXCONN=256 # max pending connects options NMBCLUSTERS=4096 # mbuf clusters at 4096 # # Misc. options # options CHILD_MAX=512 # maximum number of child processes options OPEN_MAX=512 # maximum fds (breaks RPC svcs)SOMAXCONN は maxusers から派生したものではないので、常に増やす必要があります。現在、128 の listen() の Apache のデフォルトよりも大きいことを保証された値を使いました。
多くの場合、NMBCLUSTERS は最初の必然的な反射で現れるのより、大きく設定されなければなりません。その訳は、もしブラウザが mid-transfer で切断すると、その mbufs がまだフリーでない間の2、3 分に TIME_WAIT ステーツで特定の接続に関するソケット fd が終わるからです。他の理由としては、サーバのタイムアウトで、いくつかの接続が永遠に FIN_WAIT_2 ステーツで終わって、このステーツがサーバでタイムアウトにならないで、ブラウザが最後の FIN を送信しないからです。詳細については、FIN_WAIT_2 ページを見てください。
mbuf クラスタにはいくつかの情報があります(sys/mbuf.h からの):
/* * Mbufs are of a single size, MSIZE (machine/machparam.h), which * includes overhead. An mbuf may add a single "mbuf cluster" of size * MCLBYTES (also in machine/machparam.h), which has no additional overhead * and is used instead of the internal data area; this is done when * at least MINCLSIZE of data must be stored. */
CHILD_MAX と OPEN_MAX は 512 の子プロセス(ユーザ ID 毎のプロセスの最大値とは異なっています) とファイル descriptors の設定を許可します。これらの値は、特定のコンフィギュレーションのために代わるかもしれません(たくさんの接続やファイルを開くモジュールや CGI スクリプトを持っていれば、高い OPEN_MAX の値です)。もし同じマシンで httpd に加えてたくさんの他の稼動があれば、まだ NPROC を高く設定しなければなりません。この例では、maxusers から派生した NPROC 値はロードするのに十分であることを示しました。
警告
システムが、利用できるシステム RAM よりも多いリソースを使うためにコンフィギュアされているカーネルでは、ブートしないかもしれないことに気をつけてください。 この方法でシステムをチューニングしているときは、常に、知られている利用できるブート可能なカーネルを持っていて、もしチューニングする前にメモリを買う必要があれば、学ぶ前にシステムツールを使います。
RPC サービスは OPEN_MAX の値が 256 よりも大きくなると失敗するでしょう。これは、RPC ライブラリのオリジナル実行機能で、ファイル descriptors を持つバイト値を使っています。BSDI は、その 2.1 のリリースにこの制限を部分的にアドレスしています。
最後に、Apache にはコンフィギュアされた子プロセスのきつい制限があります。
1.0.5 より後の Apache のバージョンでは、httpd.h にある HARD_SERVER_LIMIT のための定義を変更して、もしデフォルトの httpd の 150 の例よりも多く走らせる必要があるなら、再コンパイルする必要があるでしょう。
From conf/httpd.conf-dist:
# Limit on total number of servers running, i.e., limit on the number # of clients who can simultaneously connect --- if this limit is ever # reached, clients will be LOCKED OUT, so it should NOT BE SET TOO LOW. # It is intended mainly as a brake to keep a runaway server from taking # Unix with it as it spirals down... MaxClients 150もしこの値を上げるなら、やっていることを知り、あらかじめシステムをモニターして RAM を拡張し、カーネルをチューニングしていることを確認してください。それから、本当のヒットを受け取る準備をします!
BSDI に関して有益な提案と情報をくれた Tony Sanders と Chris Torek に感謝します。
"M. Teterin" <mi@ALDAN.ziplink.net> :
もしカーネルと頻繁に使われるユーティリティが完全に最適化されていれば、本当に役立ちます。-m486 -fexpensive-optimizations -fomit-frame-pointer -O2
の AMD-133 (486-class CPU) ウェブサーバで FreeBSD カーネルを再構築することは
"unable"のエラーの数を減らそうとします。CPU がしばしばマックスアウトしたからです。
The English original manual is here.