それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

ユーザーのプロセス暴走やメモリ食いつぶし防ぐ

自分で自分に首輪をつけたかった。

バックグラウンドでリソース使い切って、他のことが出来なくなった。自分で自分に首輪をつけておこうと思った。

ITmedia エンタープライズ : Linux Tips「ユーザーごとに使用できるリソース制限をしたい」
/etc/security/limits.confに関するメモ - OpenGroove

プロセス数やメモリを制限するには

PAM  limits を使います。

pam_limits.so を使って各種の制限をすることが出来ます。PAMカッコイイですね。

設定ファイル

/etc/security/limits.conf

このほかにも/etc/limits.conf で同様設定できるようです。
limits.confはコマンド ulimit からも使えるそうです。

設定例*1

@student    hard    nproc        20 #プロセス数を20に限定
@faculty    soft    nproc        20 #プロセス数を20に限定 
@student    -       maxlogins    4  #最大ログイン数を4に限定

@student の @ は group を 示します。

書式の一般例

limtis.conf の書式は次のように定義されています。

       <domain> <type> <item> <value>
domain
ユーザー、グループを指定する。fooグループは@fooとかく。ワイルドカード "*"も可
type
制限の程度[soft,hadrd,-]から選ぶ
itme
何を制限するか
value
制限の閾値

最大ログイン数を1にする

kanae - maxlogns 1 

ユーザーkanae は最大1ログインしかできません。ただしroot から su kanae する場合は、制限されません。*2

全ユーザーはmaxlogins 1 ただしtakuyaさんは例外

例外を作るにはデフォルトと、有効化を組み合わせて使います。

*      - maxlogns 5     # 全ユーザーに設定
takuya - maxlogins 300  #takuya さんだけ上書き
root   -                #rootさんも全有効に上書き

soft,hard のどちら使えばいいの?

hardでいいです。soft はそこを超えると警告が出ます。

soft/hardの違いは、softが一般ユーザが変更できる上限値で、hardはrootが変更できる
上限値を意味する。

http://open-groove.net/linux/memo-etcsecuritylimits-conf/

と言うことなので、本人がulimitコマンドでhard上限まで変更可能。maxloginsの場合はsoft limitつけても意味なかった。
一応

soft 値 <= hard 値     # sotf=hardのときは"-"と書けばいい

という原則があるんだろう。

itemに使える制限種類

次のモノが使えます|

core コア・ファイルのサイズ(KB)を制限します
data 最大データ・サイズ(KB)
fsize 最大ファイル・サイズ(KB)
memlock 最大ロックイン・メモリー・アドレス空間(KB)
nofile 開いているファイルの最大数
rss 最大常駐セット・サイズ(KB)
stack 最大スタック・サイズ(KB)
cpu 最大CPU時間(分)
nproc 最大プロセス数
as アドレス空間限界
maxlogins このユーザーに許される最大ログイン数、ただしuid=0を除く
locks ロックできるファイル最大数(Linux 2.4 から)
sigpending pending signalsを作れる最大数 (Linux 2.6 以降)
msqqueue POSIX message queue の最大バイト数(Linux 2.6 以降)
nice ユーザが使えるnice値 (Linux 2.6.12 以降) 値域は (-20..19)まで
rtprio maximum realtime priority allowed for non-privileged processes (Linux 2.6.12 and higher)

コア・ファイルサイズとか、最大常駐セットとかイマイチ分からない。そこまでカーネルに詳しくないので。。

man limits.conf

manに載ってる。けど、/etc/security/limits.conf の例以上のことは書いてない。

ただし、limits.conf でサーバープロセスを制御するとハマりこむらしい。

簡単に言うと

  • sysvinitで起動時に上がるとき
  • sudo /etc/init.d/hogehgoe restart

でやることは同じでも実行もと、ユーザーが違うので適用されるlimit が違ってくる。

詳しくは次のエントリを参考にする。

つまり、「PAM認証を介さないようなdaemon系プログラムの制限には/etc/security/limits.confは使えない」ことになるのです。

ファイルディスクリプタ数の上限変更とlimits.confの罠 (ゆめ技:ゆめみスタッフブログ)

ApacheのWorkerなど、スレッドモデルのプロセスが開くファイルの上限数を上げることで安定運用が目指せることがあるそうだ。
ゆめみは細かいところまでキッチリ調べる時間と能力の両方を持つ良い組織ですね。

*1:manページから引用

*2:つまりloginの場合は、/etc/pam.d/loginが適用されsu の場合は/etc/pam.d/su が適用されるので。suも制限するなら/etc/pam.d/suを見直す。