読むだけでちょっと賢くなる、架空のまとめスレ

【疑問】Too many open files で落ちる。ulimit のソフトとハード、/etc/security/limits.conf【LPICレベル1】

20レスカテゴリ:Linux
1: 名無しさん

アプリが Too many open files ってエラーで止まった
ファイルを開ける数に上限があるん?

2: 名無しさん

前提のおさらい。ユーザーのアカウントには、パスワードやアカウントの期限のような制限を chage で付けられる。ログインしてからの資源の使い方にも制限がある

3: 名無しさん

>>1
ある。プロセスごとの資源の上限で、シェルの組み込みコマンド ulimit で見たり変えたりする。開けるファイルの数は ulimit -n
全部見るなら ulimit -a。試したマシンでは open files (-n) 524288、core file size (-c) 0、max user processes (-u) 63991、stack size (-s) 8192 などが並んだ

4: 名無しさん

>>3
ソフトとハードがあるって聞いた

5: 名無しさん

>>4
ソフトは今効いてる値、ハードはソフトを上げられる上限。ulimit -Sn と ulimit -Hn で別々に見られる
一般ユーザーはソフトをハードまでなら上げ下げできる。ハードは下げられるけど、上げられるのは root だけ

6: 名無しさん

>>5
試した。サブシェルの中で ulimit -n 256 にしたら、ソフトもハードも256になった(-S も -H も付けないと両方変わる)。そのあと ulimit -Hn 512 で上げようとしたら cannot modify limit: Operation not permitted

7: 名無しさん

>>6
一度下げたら戻せないから、試すときはサブシェルの中でやるのが安全やな

8: 名無しさん

>>3
ほかに試したのは?

9: 名無しさん

>>8
ulimit -f 1 でファイルの大きさを1ブロックにして2048バイト書いたら、File size limit exceeded で止まって、ファイルは1024バイトになった。bash の -f の単位は1024バイト
終了ステータスは153で、シグナル SIGXFSZ(25番)で止まった印

10: 名無しさん

>>9
ulimit -u 1 にしたら、ほかにもプロセスが動いてるから、次のコマンドを起動するところで fork: Resource temporarily unavailable になった。-u はそのユーザーのプロセス全体の数

11: 名無しさん

>>5
ulimit で変えた値はずっと残るん?

12: 名無しさん

>>11
そのシェルと、そこから起動したプロセスだけ。ログインのたびに決めるなら /etc/security/limits.conf(と /etc/security/limits.d/*.conf)に書く。ログインのときに PAM の pam_limits が読み込む

13: 名無しさん

>>12
limits.conf の書き方は?

14: 名無しさん

>>13
1行に「ドメイン タイプ 項目 値」(limits.conf の man)
ドメイン:ユーザー名、@グループ、* は全員
タイプ:soft、hard、- は両方
項目:nofile(開けるファイル数)、nproc(プロセス数)、core(コアファイルの大きさ、KB)、fsize、cpu、as、maxlogins(同時ログイン数、root には効かない)など

15: 名無しさん

>>14
ファイルに入ってた例は * soft core 0 や @student hard nproc 20。たとえば
user2 soft nofile 4096
user2 hard nofile 8192

16: 名無しさん

>>12
書いたのに、systemd で動かしてるサービスには効かへん

17: 名無しさん

>>16
limits.conf はログインのときの PAM の設定やから、systemd が起動するサービスには関係ない。サービスはユニットファイルの LimitNOFILE= などで決める

18: 名無しさん

>>3
core の0は?

19: 名無しさん

>>18
プログラムが落ちたときのメモリの中身(コアファイル)を作らない設定。調べるときだけ ulimit -c unlimited にする

20: 名無しさん

>>5
今は ulimit -n、ソフトはハードまで、ハードを上げるのは root、ずっとなら limits.conf、サービスは LimitNOFILE=。アプリは systemd のほうやったから LimitNOFILE= を見てみる

管理人のひとこと