ulimitが効かない不安を無くす設定

limits.conf に書いても ulimit に効いていない、というのはよくある話です。

ulimit が少なくて困ったことはあっても、多くし過ぎて困ったことはほとんどないでしょうから、ドーンと全条件下でulimit設定を効かせる方法を紹介します。



まだ知らない特殊な条件下があるかもしれませんし、もっとスマートな方法があるかもしれないので、参考までに・・・


ulimitが効かない問題

だいたいこんな内容だと思います。

  • SSHログインだと効かない
  • su すると効かない
  • OS起動時に自動起動したデーモンに効かない

  • 普通はデーモンに効けばよいので、本当に困ったら起動スクリプトに直接書いたりしますが、方法としてはイマイチなのでちょっと工夫をします。

    その前に・・・

    PAMについて

    PAMというユーザー認証システムについてはググっていただくとして、よく出てくる /etc/security/limits.conf という設定ファイルは、PAMを通る条件下でしか有効になりません。

    ではPAMを通るとはどういうことかというと、/etc/pam.d/ のファイルを見るとなんとなくわかります。システムごとに認証の設定がされています。

    そして、設定によって

    と書かれていたり、コメントアウトされてたりします。この設定が有効になっていれば limits.conf が適用されますし、無効ならば適用されません。

    つまり、PAMを使うシステムかつ pam_limits.so が有効である場合にのみ limits.conf が適用されることになります。

    limits.conf

    ユーザ名に * を使うと怪しいのでちゃんと書いたほうがよさげです。

    /etc/security/limits.conf

    /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-sessionsession 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行目に #!/bin/sh とかも不要です。

    プロセスの確認

    起動スクリプト内でrootのulimitが変わったとはいえ、別ユーザで動くデーモンプロセスまでちゃんと変わったかは疑うべきです。これはプロセス番号から簡単に調べられます。


    まとめ

    デーモンを手動で起動した場合と、OS起動時の自動起動の2パターンにおいて、ちゃんとプロセスまでulimitが効いてるかを確認して、できていなければ /etc/pam.d//etc/initscript で解決しましょう!

    というお話でした。
    多分まだなんか罠があるだろーなと思いつつ、おしまい。