limits.conf に書いても ulimit に効いていない、というのはよくある話です。
ulimit が少なくて困ったことはあっても、多くし過ぎて困ったことはほとんどないでしょうから、ドーンと全条件下でulimit設定を効かせる方法を紹介します。
まだ知らない特殊な条件下があるかもしれませんし、もっとスマートな方法があるかもしれないので、参考までに・・・
ulimitが効かない問題
だいたいこんな内容だと思います。普通はデーモンに効けばよいので、本当に困ったら起動スクリプトに直接書いたりしますが、方法としてはイマイチなのでちょっと工夫をします。
その前に・・・
PAMについて
PAMというユーザー認証システムについてはググっていただくとして、よく出てくる /etc/security/limits.conf という設定ファイルは、PAMを通る条件下でしか有効になりません。ではPAMを通るとはどういうことかというと、/etc/pam.d/ のファイルを見るとなんとなくわかります。システムごとに認証の設定がされています。
そして、設定によって
1 |
session required pam_limits.so |
と書かれていたり、コメントアウトされてたりします。この設定が有効になっていれば limits.conf が適用されますし、無効ならば適用されません。
つまり、PAMを使うシステムかつ pam_limits.so が有効である場合にのみ limits.conf が適用されることになります。
limits.conf
ユーザ名に * を使うと怪しいのでちゃんと書いたほうがよさげです。/etc/security/limits.conf
1 2 |
root - nofile 65536 ... |
/etc/security/limits.d/
最近だと、/etc/security/limits.d/*.conf が有効だったりします。Hadoopパッケージは密かにここに入れてきてます。
limits.conf にも書いてある場合は、limits.d 配下の方が優先のようです。
SSHログイン時に効かせる
SSHは通常、/etc/pam.d/sshd の設定なので、有効にすればログイン時に limits.conf が適用されます。しかし、SSHログインは普通は一般ユーザで行い、デーモンの起動はそこから su – なり sudo なりで行うので、実はあまり重要ではなかったりします。
色々な時に効かせる
さらに suがー sudoがー コンソールのloginはー とめんどくさくなったら、Debianの場合 /etc/pam.d/common-session に session required pam_limits.so を書けば有効になります。CentOS5だと common-session は有効な設定ファイルじゃないようで、でも runuser に書かれているからか su – しても効いてくれます。(真実は知らない)
CentOS5 の pamバージョンが 0.99、Debian Squeezeが 1.1.1 となっているので、結構変わっているのでしょうか・・・が、あえて気にせず進みます。
OS起動時のデーモンに効かせる
これがやっかいで、PAMを通りません。起動スクリプトに書く以外になんかないかなーと調べてみてボツ案から。functions
Debianの /lib/lsb/init-functions CentOSの /etc/init.d/functionsの最後にulimitを直書きする手段。
起動スクリプトの中で読み込まれてたりするのですが、読んでいないモノもあるし、あまり編集したくないファイルなのでボツ。とはいえ、手動再起動とかで限定的に役立つかもしれないので覚えておく。
initscript
man initscript で出てきますが、OS起動時のみ使われる設定で、DebianでもCentOSでも有効です。/etc/initscript
1 2 |
ulimit -n 65536 eval exec "$4" |
こう書いて再起動するだけです。
実行権限とか1行目に #!/bin/sh とかも不要です。
プロセスの確認
起動スクリプト内でrootのulimitが変わったとはいえ、別ユーザで動くデーモンプロセスまでちゃんと変わったかは疑うべきです。これはプロセス番号から簡単に調べられます。
1 2 |
# cat /proc/13945/limits | grep "open files" Max open files 65536 65536 files |
まとめ
デーモンを手動で起動した場合と、OS起動時の自動起動の2パターンにおいて、ちゃんとプロセスまでulimitが効いてるかを確認して、できていなければ /etc/pam.d/ と /etc/initscript で解決しましょう!というお話でした。
多分まだなんか罠があるだろーなと思いつつ、おしまい。
ulimitが効かない不安を無くす設定 への1件のコメント