Apache がクラッシュしました。「システム内で開いているファイルが多すぎます」

Apache がクラッシュしました。「システム内で開いているファイルが多すぎます」

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」を実行してみてください。おそらく、最大オープン ファイル制限に達している可能性があります。

関連情報