今回はLinuxのリソース制限について勉強してみます。
ulimitコマンドとlimit.confの概要を扱います。(コマンドの細かなオプションは扱いません。)
もくじ
1.リソース制限とは
5.余談
1.リソース制限とは
そもそもリソースとは、ハードウェア、ソフトウェアを動作させるために必要なディスク容量やCPUの処理速度、メモリ容量などのこと。
適切にリソースを利用しないと、コンピュータが止まったり、サービスが落ちたり、その他意図しない動きが起きたりと、様々な弊害が生じる。
パソコンで色々開きすぎてデスクトップが固まってしまう、
場合によって強制シャットダウンする、といったイメージ。
サービス稼働中のサーバでそんなことが起きてしまったらと思うと…とてもとても恐ろしい…(T_T)
そうした事態を防ぐため、特定のユーザが、限りあるリソースを使いすぎないよう、
Linuxではulimitという機能が存在する。
2.ulimitの概要
ulimitは、シェルまたはシェルで起動したプロセスにおいて、使用可能なリソースの上限を制御するための機能。使用可能リソースの上限値をあらかじめ設定しておくことで、リソースの使い過ぎを避けることが出来る。
実際、どのような設定になっているかを見てみると…
※環境:CentOS8、家庭用PCに乗っけたVMなのでそもそも使えるリソースは少なめ。
$ ulimit -a # "-a"オプションで、現在のulimit設定内容を確認できる
core file size (blocks, -c) unlimited
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 3033
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) 3033
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
一度に開くことのできるファイル数(open files)、CPU時間(cpu time)、ユーザプロセス最大値(max user processes)など、様々なリソースの制限を設定できることが分かる。
ちなみに、値がulimitedとなっているのは、無制限に使えるという意味。
3.ハード制限とソフト制限
ulimitで設定できるリソース上限は、大きく、ソフト制限とハード制限の2種類に分けられる。
ソフト制限とハード制限の違いは、一般ユーザが変更できるかどうか。
ソフトは一般ユーザが変更可能だが、ハードは変更不可である。(rootユーザはハードも変更できる)
ただし厳密に言うと、一般ユーザであっても、1回だけハード制限を変更できる。
その時、元の上限値よりは小さい値である必要がある。
1回変更した後は、元の値に戻すことや、変更した値よりもさらに小さい上限値とすることも含めて、変更できなくなる。
試しに、testuserという一般ユーザで、変更をかけてみる。
◎変更前
open filesの値は1024。
[testuser@localhost ~]$ ulimit -a
(前略)
open files (-n) 1024
(後略)
◎ハードを変更
open filesのハード値を500にする。(-nでopen filesの値を変更、-Hでハード制限を変更)
[testuser@localhost ~]$ ulimit -n 500 -H
[testuser@localhost ~]$ ulimit -a
(前略)
open files (-n) 1024
(後略)
見た目は変わっていないが、再度設定しようとすると…
[testuser@localhost ~]$ ulimit -n 500 -H
-bash: ulimit: open files: cannot modify limit: Invalid argument
怒られた(´・ω・`)
◎ソフトも変更
open filesのソフト値を500にする。(-nでopen filesの値を変更、-Sでソフト制限を変更)
[testuser@localhost ~]$ ulimit -n 500 -S
[testuser@localhost ~]$ ulimit -a
(前略)
open files (-n) 500
(後略)
変更できた。
-aで表示されるのはソフト制限の値の模様。
さらに変更をかけても、ソフト制限の場合は変更できる。
[testuser@localhost ~]$ ulimit -n 600 -S
[testuser@localhost ~]$ ulimit -a
(前略)
open files (-n) 600
(後略)
ただし、rootユーザで設定できるハード制限値(もともとのハード制限値、ここでは1024)を超えて、ソフト制限値を変更することはできない。
[testuser@localhost ~]$ ulimit -n 1025 -S
-bash: ulimit: open files: cannot modify limit: Invalid argument
ここまでの話をまとめると…
一般ユーザ | rootユーザ | |
---|---|---|
ソフト制限 | 何度でも変更可 | 何度でも変更可 |
ハード制限 | 一度だけ変更可 | 何度でも変更可 |
備考 | ソフト、ハードとも、 rootユーザの定めた制限値を 超える設定にはできない |
4.変更を永続化したい
さて、ここまででulimitコマンドによる、リソース制限の変更の概要を見てきた。
が、ulimitコマンド実行により設定される制限値の設定は、一時的なものである。
試しにtestuserユーザで、ulimitにより、open filesのソフト制限を600に設定したうえでシェルを抜ける。
[testuser@localhost ~]$ ulimit -n 600 -S
[testuser@localhost ~]$ ulimit -a
(前略)
open files (-n) 600
(後略)
[testuser@localhost ~]$ exit
もう一度ログインして、制限の状態を確認すると…
[testuser@localhost ~]$ ulimit -a
(前略)
open files (-n) 1024
(後略)
戻っている…(´・ω・`)
しかし多くの場合、一度設定した内容は永続化したいはず。
そんな時は、ulimitコマンドによる設定ではなく、/etc/security/limits.confに設定を記述すると良い。
このファイルにリソース制限を記載しておくと、ユーザのログイン時に、記載した内容でリソース制限を設定してくれるようになる。(ので、実質的に永続設定となる)
なお、/etc/security/limits.confの編集はrootユーザでしかできないので注意。
◎試してみた
/etc/security/limits.confをviなどで編集して保存すればOK。設定はすぐ反映される。
$ vi /etc/security/limits.conf
(前略)
testuser soft nofile 1025 # 追加
testuser hard nofile 1025 # 追加
(後略)
書式は、
制限を設定したいユーザ ソフト/ハード 設定する制限 制限値
となる。
今回はtestuserユーザについてのみ制限値を変更しているが、全ユーザに対して変更したい場合は、ユーザの部分を「*」とすれば良い。
なお、nofileというのが、open filesの設定を変えるよ、という意味になる。(分かりづらいから名称統一してほしい…)
続いて、testuserでログインし直してチェック。
[testuser@localhost ~]$ ulimit -a
(前略)
open files (-n) 1025
(後略)
無事に変更完了。
OSを再起動しても、この値は維持される。
5.余談
前に書いた、OracleDB構築の記事でも、
Oracleインストールの前準備として、/etc/security/limits.confを修正する手順をとってました。
実際、Linuxのリソース制限でググると、Oracleに関する記事もちょくちょくヒットします。
Oracleなどミドルウェアチューニングの一環で、OSのリソース制限の変更が必要になる場面が多いのかも。