yassy's note

なんかかきます

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の設定値がカーネルパラメータの制限値に引っかかったため、ログインできなくなっていた。