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


8

私の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

ファイルの制限を超えることは、多くの場合、問題の兆候です。すでに述べたように、ログのローテーションに問題がある可能性があります。(回転したログはコマンドから削除される場合があります。)/ var / log / apache2の外では、Apacheサーバーに関連するログは多くありません。grepパターンに基づいて、アクセスログへのアクセスを制限したい場合があります。
BillThor 2013

ヒントをありがとう、しかし私のログローテーションはうまくいきます。私は非常に多くのログを持っているので、私のサーバー上のすべての1025ドメインには独自のログファイルがあります;)
rubo77

1
パターンは、アクセスログだけでなくエラーログも取得するように見えます。単一のエラーログがある場合、これは小さな問題になるはずです。これをシェルで実行したままにする場合は、-F代わりにを使用-fして、ローテーション時にログが再度開かれるようにすることができます。
BillThor 2013

回答:


15

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が、監視が必要な本当にアクティブなファイルであるかどうかを確認できます。それらのいくつかはログ記録のためにすでに閉じられている可能性があり、少数のファイルを開くことができます。


ulimit -Sn 4096 -bash:ulimit:open files:Kann die Grenze nichtändern:Das Argument istungültig-引数が無効であることを意味します
rubo77

@ rubo77:おそらく問題の原因であるハードリミットに関する情報を追加しました。
pabouk 2013

@ rubo77:シェルセッションでハードリミットを設定することも可能であるが、それはあなたが持っているとして、注意が必要ですsuルートとするsuユーザーに戻す:su -c "ulimit -Hn 6000 ; su $USER"
pabouk

OK、それで一時的に制限を変更するために、私はulimit -Hn 6000; ulimit -Sn 6000rootとして使用します
rubo77

1
@amenthes私はあなたがの設定ファイルを意味していると思います/etc/limits.*。これらの制限は、PAMモジュールpam_limits.soが呼び出されるたびに適用されます。通常、それはセッションの開始時です。:Ubuntuの14.04で例えば、それは、これらのツール/コマンドであるcronlogin(テキストコンソールログイン)、 lightdm、(GUI ログイン)su。でpam_limits使用される場所を設定でき/etc/pam.*ます。例えば参照:faqs.org/docs/securing/chap5sec44.html
pabouk

0

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行目を調整する必要がありました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.