web-dev-qa-db-ja.com

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

私は最近、redisプロセスの1つをチェックして、適用されたulimitを次のように適用しました:

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を使用しています。

14
UpTheCreek

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

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

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

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

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構成で制限を設ける方法があるかどうかも確認してください。

19
Kannan Mohan

Sysctl fs.file-maxパラメータは広いグローバルシステム制限です。同じ値をulimitに設定することはお勧めしません。

Ulimit 100000とsysctl.conf 100000にも設定した場合、1人のユーザーがシステムをブロックできます

とにかく、あなたの問題について話している、あなたは確かにニートです、あなたのシステムはpam_limitsを使います

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

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

2
Omnipresence