ulimit設定について
はじめに
ulimitについてよく分かっていなかったので調べた。
ulimitとは
ユーザが使用できるリソースを制限するコマンド。
作成できるファイルの最大サイズや、実行できるプロセスの最大値を指定できる。
使い方
- ulimit -aで設定内容を表示できる。
[root@localhost ~]# ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 1889 max locked memory (kbytes, -l) 64 max memory size (kbytes, -m) unlimited open files (-n) 1024 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 real-time priority (-r) 0 stack size (kbytes, -s) 8192 cpu time (seconds, -t) unlimited max user processes (-u) 1889 virtual memory (kbytes, -v) unlimited file locks (-x) unlimited
- ulimitの後に制限変更リソースを指定すると、リソース値を変更できる。
[root@localhost ~]# ulimit -f 50 [root@localhost ~]# [root@localhost ~]# [root@localhost ~]# ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) 50 pending signals (-i) 1889 max locked memory (kbytes, -l) 64 max memory size (kbytes, -m) unlimited open files (-n) 1024 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 real-time priority (-r) 0 stack size (kbytes, -s) 8192 cpu time (seconds, -t) unlimited max user processes (-u) 1889 virtual memory (kbytes, -v) unlimited file locks (-x) unlimited
ちなみに、ulimitのリソース制限方法は2種類存在する。
1つはrootユーザが指定するハードリミット。
もう1つは一般ユーザが指定可能な最大値であるソフトリミット。
一般ユーザに影響するのはソフトリミットであり、ソフトリミットはハードリミットの値までは大きくすることができる。
逆に言うと、一般ユーザはハードリミット以上にリソース値を上げることはできない。
以下の例は、一般ユーザがハードリミットの範囲でソフトリミットを変更した場合と、
ハードリミットを超えるソフトリミットを設定しようとした場合の動き。
(ulimit -Sでソフトリミット値が確認可能)
[vagrant@localhost ~]$ ulimit -Hn 4096 [vagrant@localhost ~]$ ulimit -Sn 1024 [vagrant@localhost ~]$ ulimit -Sn 1025 ★ソフトリミットの値を1025に変更(ハードリミット以下) [vagrant@localhost ~]$ ulimit -Sn 1025 [vagrant@localhost ~]$ ulimit -Sn 4097 ★ソフトリミットの値を4097に変更(ハードリミットを超過) -bash: ulimit: open files: cannot modify limit: Invalid argument
ulimit値を恒久的に設定する
ulimitコマンドは実行中のプロセスに対しての設定値であるため、ログインし直すと設定が戻ってしまう。
ulimitを恒久的に設定するためには、/etc/security/limits.conf内に設定を書く必要がある。
書式は以下の通り。
<ユーザ名・グループ> <hard/soft/-> <設定対象> <設定値>
例えば、vagrantユーザが作成する最大ファイルサイズ値を、1024KBにしたい場合の設定は以下となる。
vagrant - fsize 1024
-はhardとsoft両方に対する設定。
設定後、vagrantユーザでログインし直すと、file sizeが1024と表示される。
[vagrant@localhost ~]$ ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) 1024 pending signals (-i) 1889 max locked memory (kbytes, -l) 64 max memory size (kbytes, -m) unlimited open files (-n) 1024 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 real-time priority (-r) 0 stack size (kbytes, -s) 8192 cpu time (seconds, -t) unlimited max user processes (-u) 1889 virtual memory (kbytes, -v) unlimited file locks (-x) unlimited [vagrant@localhost ~]$
また、ユーザだけでなく、グループを対象とする場合は@<グループ名>とすれば良い。
おまけ
limits.confにてopen filesをunlimitedに設定した場合、ログインできなくなる問題が発生した。
これは、OS全体の設定としてのopen filesがカーネルパラメータ「fs.nr_open」で設定されているためである。
[root@localhost ~]# sysctl fs.nr_open fs.nr_open = 1048576
limits.confのunlimitedが指す値は、環境にもよるが、自分の64ビットマシンでは18446744073709551614(264 - 1)が最大値となっていた。
参考
https://teratail.com/questions/16782
[root@localhost ~]# ulimit -u 18446744073709551614 [root@localhost ~]# ulimit -u 18446744073709551614 [root@localhost ~]# [root@localhost ~]# ulimit -u 18446744073709551615 [root@localhost ~]# ulimit -u unlimited
以上の通り、limits.confの設定値がカーネルパラメータの制限値に引っかかったため、ログインできなくなっていた。