私は最近、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を使用しています。
Linuxでは、リソースの制限は、要件のタイプに基づいてさまざまな場所に設定できます。
/etc/security/limits.conf
ファイル。/etc/sysctl.conf
ファイル。ulimit
コマンド/etc/security/limits.conf
は pam_limits の一部であるため、このファイルに設定されている制限は、ログインセッション中にpam_limitsモジュールによって読み取られます。ログインセッションは、ssh
またはterminal
を介して行うことができます。そして、pam_limitsは here のようにデーモンプロセスに影響を与えません。
/etc/sysctl.conf
はシステム全体のグローバル構成です。ここではユーザー固有の構成を設定できません。取得するすべてのユーザー/プロセスが使用できるリソースの最大量を設定します。
ulimit
コマンドは、シェルの制限を設定するために使用されます。したがって、シェルでulimit
を使用して制限を設定すると、child process
がparent processes
プロパティを継承するというルールにより、シェルから生成されたプロセスもその値を取得します。
そして、あなたのケースでは、redis
はinit
の一部として開始されるので、上記のどれもあなたを直接助けません。これを行う適切な方法は、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
構成で制限を設ける方法があるかどうかも確認してください。
Sysctl fs.file-maxパラメータは広いグローバルシステム制限です。同じ値をulimitに設定することはお勧めしません。
Ulimit 100000とsysctl.conf 100000にも設定した場合、1人のユーザーがシステムをブロックできます
とにかく、あなたの問題について話している、あなたは確かにニートです、あなたのシステムはpam_limitsを使います
man pam_limits
grep -i limit /etc/pam.d/*
Sshdのpam_limitsを有効にしましたが、このコマンドはSSHセッションから実行されていますか? /etc/pam.d/login
や/etc/pam.d/su
や/etc/pam.d/Sudo
にも同じ行を追加する必要がある場合があります。