Ulimitファイル記述子の制限が特定のプロセスに適用されていない


14

私は最近、redisプロセスの1つを、適用される場所を制限するものにチェックしました:

cat /proc/<redis-pid>/limits

そして、それが低いデフォルト値であったことを知って驚いた:

Limit                     Soft Limit           Hard Limit           
Max open files            4016                 4016 

次の設定がされているので驚いた。

# /etc/sysctl.conf 
fs.file-max = 100000

# /etc/security/limits.conf
* soft nofile 100000
* hard nofile 100000

# /etc/ssh/sshd_config
UsePAM yes

# /etc/pam.d/sshd
session required pam_limits.so

増加したulimitが実行中のredisプロセスに適用されない理由を教えてください。

ユーザー「redis」としてredisプロセスが実行されており、制限が引き上げられてからサーバーが再起動されました。Debian Squeezeを使用しています。

回答:


19

Linuxでは、要件の種類に基づいてさまざまな場所でリソース制限を設定できます。

  1. /etc/security/limits.conf ファイル。
  2. /etc/sysctl.conf ファイル。
  3. ulimit コマンド

/etc/security/limits.confpam_limitsの一部であるため、このファイルに設定されている制限は、ログインセッション中にpam_limitsモジュールによって読み取られます。ログインセッションは、sshまたはを介して行うことができますterminal。また、pam_limitsは、ここで説明したデーモンプロセスには影響しません。

/etc/sysctl.confシステム全体のグローバル構成であるため、ここではユーザー固有の構成を設定できません。getherに配置されたすべてのユーザー/プロセスが使用できるリソースの最大量を設定します。

ulimitコマンドは、シェルの制限を設定するために使用されます。したがってulimit、シェルで制限が設定されている場合、シェルから生成されるプロセスもchild processparent processesプロパティを継承するルールのためにその値を取得します。

そして、あなたの場合、上記redisinitいずれにも含まれないものとして開始されるので、直接助けにはなりません。これを行う適切な方法はulimit、initスクリプト自体に新しい値を設定するコマンドを使用する必要があるということです。以下のスクリプトのように、

ulimit -n 100000
if start-stop-daemon --start --quiet --umask 007 --pidfile $PIDFILE --chuid redis:redis --exec $DAEMON -- $DAEMON_ARGS.

に機能を追加するバグがウィッシュリストにすでに登録さulimitれていstart-stop-daemon ます。

また、redis制限を提供する方法があるかどうか構成をチェックインします。


すばらしいまとめかんなん!これで先に進み、起動スクリプトにulimitを追加しました。(複数の起動スクリプトがあるので)デーモン化されたプロセスを操作するユーザーに制限を設定する方法がないのは残念ですが、これは機能します。ありがとうございました!
UpTheCreek 14年

素晴らしい答え。親プロセスのプロパティを継承する子プロセスは、私を驚かせました。制限はすべて、子プロセスを実行しているユーザーにとって正しいように見えましたが、使用されている親プロセスの所有者からの制限でした。
同期

2

sysctl fs.file-maxパラメーターは広いグローバルシステム制限です。同じ値をulimitに設定するのは良い考えではないと思います。

ulimit 100000およびsysctl.conf 100000にも設定すると、1人のユーザーがシステムをブロックできます

いずれにせよ、あなたの問題について話して、あなたは確実に必要です、あなたのシステムはpam_limitsを使用します

man pam_limits
grep -i limit /etc/pam.d/*

ありがとう-それからfs.file-max値を上げることを検討します。PAMについて-これを使用していると思います(質問に追加の設定を追加しました)。ただし、設定がこのユーザーによって使用されていないSSHに関連しているように見えるため、PAMを理解しているかどうかは本当にわかりません。設定する必要がある他のファイルはありますか?redisのinitスクリプトには常にulimit設定を入れることができますが、これを行う必要はありません。
UpTheCreek

2

sshdのpam_limitsを有効にしましたが、このコマンドはSSHセッションから実行されていますか?/etc/pam.d/loginおよび/または/etc/pam.d/suおよび/またはに同じ行を追加する必要がある場合があり/etc/pam.d/sudoます。


ありがとう。私はそれがまったく正しくなかったのではないかと疑っていました。プロセスはinit.dスクリプトのこの行で開始されています:if start-stop-daemon --start --quiet --umask 007 --pidfile $PIDFILE --chuid redis:redis --exec $DAEMON -- $DAEMON_ARGS。この場合、どのpamが適切でしょうか?
UpTheCreek

スクリプトでは、ulimit -n 100000
c4f4t0r

init.dスクリプトはsu [user] -cコマンドを使用して別のユーザーとしてスクリプトを開始しますか、それともプログラムはrootとして実行されますか?を使用しているsu場合は、に入れます/etc/pam.d/su。として実行しているroot場合は、c4f4t0rのulimitinitスクリプトにコマンドを追加することをお勧めします。rootは必要な制限を設定できるため、その場合にPAMを心配する必要はありません。
-Omnipresence

1
ありがとう。で使用--chuid redis:redisstart-stop-daemonます。スタートアップスクリプトにulimitを追加しました。
UpTheCreek 14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.