web-dev-qa-db-ja.com

Debianで「Too many open files」を回避する方法

Apache2サーバーのすべての関連ログファイルを一度に表示したい場合は、

tail -f /var/kunden/logs/*log /var/kunden/logs/*log /var/log/Apache2/*log |grep -v robots|grep -v favicon

でも、今はファイルが多すぎるので、その制限を増やしていきたいと思います。

1つのSSHセッションでどのように増やすことができますか?そして、どうすればシステム全体でそれを増やすことができますか?

私のマシンでは、開いているファイルの制限が1024であることがわかります。

ulimit -n
1024
8
rubo77

2種類の制限があることを知っておくことが重要です。

  • ハード制限はrootだけが設定できます。これは、ソフト制限の可能な最大値(制限)です。
  • ソフト制限は、一般ユーザーが設定できます。これは実際に有効な制限です。

単一セッションのソリューション

シェルでソフト制限を設定します。

ulimit -Sn 2048

この例では、実際の制限を2048に上げますが、コマンドは、ハード制限(チェック:ulimit -Hn)が同じかそれ以上の場合にのみ成功します。より高い値が必要な場合は、以下のいずれかの方法を使用してハードリミットを引き上げます。制限はプロセスごとに設定され、新しく生成されたプロセスによって継承されるため、同じシェルでこのコマンドの後に実行するものにはすべて新しい制限があります。

単一セッションでハード制限を変更する

Rootだけがハード制限を変更でき、rootに切り替えた後、元のユーザーに切り替える必要があるため、これは簡単ではありません。これがSudoの解決策です:

Sudo sh -c "ulimit -Hn 9000 ; exec su \"$USER\""

システム全体のソリューション

Debianおよびpam_limitsを使用する他の多くのシステムでは、/etc/security/limits.conf/etc/security/limits.dのファイルにシステム全体の制限を設定できます。 confファイルには説明が含まれています。行の例:

@webadmins       hard     nofile     16384
@webadmins       soft     nofile      8192

これにより、ログイン後にグループwebadminsのユーザーにハード制限とデフォルトのソフト制限が設定されます。

その他の制限

ハード制限値は、/proc/sys/fs/file-maxのオープンファイル記述子のグローバル制限値によって制限されます。これは、最新のLinuxディストリビューションではデフォルトでかなり高い値です。この値は、カーネルのコンパイル中に使用されるNR_OPEN値によって制限されます。

より良い解決策はありませんか?

*logにフィードするすべてのtail -fファイルが、監視が必要な実際にアクティブなファイルであるかどうかを確認できます。それらの一部はログ記録のために既に閉じられている可能性があり、少数のファイルを開くことができます。

15
pabouk

私のApache error.logにPHP警告がありました:

failed to open stream: Too many open files in ...

ですから、Apacheは起動時にこの値を個別に設定します(私のUbuntu 14.04)。 /etc/Apache2/envvars。それは言う:

## If you need a higher file descriptor limit, uncomment and adjust the
## following line (default is 8192):
#Apache_ULIMIT_MAX_FILES='ulimit -n 65536'

そのため、3行目を調整する必要がありました。

0
Michael