アプリが Too many open files ってエラーで止まった
ファイルを開ける数に上限があるん?
【疑問】Too many open files で落ちる。ulimit のソフトとハード、/etc/security/limits.conf【LPICレベル1】
前提のおさらい。ユーザーのアカウントには、パスワードやアカウントの期限のような制限を chage で付けられる。ログインしてからの資源の使い方にも制限がある
>>1
ある。プロセスごとの資源の上限で、シェルの組み込みコマンド ulimit で見たり変えたりする。開けるファイルの数は ulimit -n
全部見るなら ulimit -a。試したマシンでは open files (-n) 524288、core file size (-c) 0、max user processes (-u) 63991、stack size (-s) 8192 などが並んだ
>>3
ソフトとハードがあるって聞いた
>>4
ソフトは今効いてる値、ハードはソフトを上げられる上限。ulimit -Sn と ulimit -Hn で別々に見られる
一般ユーザーはソフトをハードまでなら上げ下げできる。ハードは下げられるけど、上げられるのは root だけ
>>5
試した。サブシェルの中で ulimit -n 256 にしたら、ソフトもハードも256になった(-S も -H も付けないと両方変わる)。そのあと ulimit -Hn 512 で上げようとしたら cannot modify limit: Operation not permitted
>>6
一度下げたら戻せないから、試すときはサブシェルの中でやるのが安全やな
>>3
ほかに試したのは?
>>8ulimit -f 1 でファイルの大きさを1ブロックにして2048バイト書いたら、File size limit exceeded で止まって、ファイルは1024バイトになった。bash の -f の単位は1024バイト
終了ステータスは153で、シグナル SIGXFSZ(25番)で止まった印
>>9ulimit -u 1 にしたら、ほかにもプロセスが動いてるから、次のコマンドを起動するところで fork: Resource temporarily unavailable になった。-u はそのユーザーのプロセス全体の数
>>5
ulimit で変えた値はずっと残るん?
>>11
そのシェルと、そこから起動したプロセスだけ。ログインのたびに決めるなら /etc/security/limits.conf(と /etc/security/limits.d/*.conf)に書く。ログインのときに PAM の pam_limits が読み込む
>>12
limits.conf の書き方は?
>>13
1行に「ドメイン タイプ 項目 値」(limits.conf の man)
ドメイン:ユーザー名、@グループ、* は全員
タイプ:soft、hard、- は両方
項目:nofile(開けるファイル数)、nproc(プロセス数)、core(コアファイルの大きさ、KB)、fsize、cpu、as、maxlogins(同時ログイン数、root には効かない)など
>>14
ファイルに入ってた例は * soft core 0 や @student hard nproc 20。たとえばuser2 soft nofile 4096user2 hard nofile 8192
>>12
書いたのに、systemd で動かしてるサービスには効かへん
>>16
limits.conf はログインのときの PAM の設定やから、systemd が起動するサービスには関係ない。サービスはユニットファイルの LimitNOFILE= などで決める
>>3
core の0は?
>>18
プログラムが落ちたときのメモリの中身(コアファイル)を作らない設定。調べるときだけ ulimit -c unlimited にする
>>5
今は ulimit -n、ソフトはハードまで、ハードを上げるのは root、ずっとなら limits.conf、サービスは LimitNOFILE=。アプリは systemd のほうやったから LimitNOFILE= を見てみる
管理人のひとこと
- ulimit はプロセスごとの資源の上限(シェルの組み込み)。-a 全部、-n 開けるファイル数、-u プロセス数、-c コアファイル、-f ファイルの大きさ(bash は1024バイト単位)、-s スタック、-v 仮想メモリ、-t CPU 時間。
- -S ソフト(今の値)と -H ハード(ソフトの上限)。指定しないと両方変わる。一般ユーザーはハードを下げられるが上げられない(root のみ)。変更はそのシェルと子プロセスだけ。
- /etc/security/limits.conf(と limits.d/)は「ドメイン(ユーザー・@グループ・*) タイプ(soft・hard・-) 項目(nofile・nproc・core・fsize・maxlogins など) 値」。ログイン時に pam_limits が適用する。
- systemd のサービスには効かず、ユニットの LimitNOFILE= などで決める。