【Linux】ユーザのリソース制限 | 若手エンジニアのブログ

若手エンジニアのブログ

文系出身の若手女子エンジニアによる技術ブログ。
日々の経験や学びをアウトプットするためにブログを書いています。
バックエンド(Java+SpringFramework)を経てインフラエンジニアになりました。
今は育休中につき、本で勉強したことを中心にアウトプットしています。

今回はLinuxのリソース制限について勉強してみます。

ulimitコマンドとlimit.confの概要を扱います。(コマンドの細かなオプションは扱いません。)

 

もくじ

1.リソース制限とは

2.ulimitの概要

3.ハード制限とソフト制限

4.設定を永続化したい

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のリソース制限の変更が必要になる場面が多いのかも。