
MediaTemple (dv) サーバーで mpm_prefork を使用して Apache2 を実行しています。最近、サーバー構成に大きな変更は加えられていません。httpd.conf は現在、次のように設定されています。
MaxKeepAliveRequests 200
KeepAliveTimeout 15
<IfModule prefork.c>
StartServers 10
MinSpareServers 10
MaxSpareServers 10
MaxClients 200
MaxRequestsPerChild 4000
</IfModule>
しかし、Apache が完全にクラッシュする直前に次のエラーが発生します。
[Thu Jun 04 18:30:24 2009] [warn-phpd] mmap cache can't open /var/www/vhosts/mydomain.com/httpdocs/filename.php - Too many open files in system (pid 19873)
Apache がクラッシュしたときにこのサーバーを再起動するように監視することにうんざりしています。助けてください。
答え1
次のような行を追加してみることをお勧めしますulimit -n 16384ファイルの先頭へ /デフォルトそして再起動します。
こちらもご覧くださいリンク。
答え2
'man proc' より:
/proc/sys/fs/ファイル最大 このファイルは、すべてのプロセスで開いているファイルの数のシステム全体の制限を定義します。(setrlimit(2) も参照してください。これは、プロセスが開くことができるファイルの数のプロセスごとの制限 RLIMIT_NOFILE を設定するために使用できます。) ファイル ハンドルが不足しているというエラー メッセージが多数表示される場合は、この値を増やしてみてください。
echo 100000 > /proc/sys/fs/file-max The kernel constant NR_OPEN imposes an upper limit on the
file-max に配置できる値。
If you increase /proc/sys/fs/file-max, be sure to
/proc/sys/fs/inode-max を /proc/sys/fs/file-max の新しい値の 3 ~ 4 倍に増やします。そうしないと、inode が不足します。
**/proc/sys/fs/file-nr** This (read-only) file gives the number of files
現在開かれているファイル ハンドルの数。割り当てられたファイル ハンドルの数、空きファイル ハンドルの数、およびファイル ハンドルの最大数の 3 つの数値が含まれます。カーネルはファイル ハンドルを動的に割り当てますが、再度解放することはありません。割り当てられたファイル数が最大値に近い場合は、最大値を増やすことを検討する必要があります。空きファイル ハンドルの数が多い場合は、ファイル ハンドルの使用量がピークに達したため、最大値を増やす必要はないと考えられます。
2 番目の数字は、最初の数字を増やす必要があるかどうかを確認するために確認する価値があります。必要な場合は、/etc/sysctl.conf で次のように設定できます。
fs.file-max=512000
これにより、システム制限; ユーザーごとの制限は、すでにご存知であると示されている「ulimit」で設定されます。
答え3
実際に何が起こっているかを確認するには、lsof をチェックしてください。不当に高い制限を超えるのは、多くの場合、リークやその他のバグが原因です。
答え4
Apache を起動する前に、「ulimit -n 8192」を実行してみてください。おそらく、最大オープン ファイル制限に達している可能性があります。