LoginSignup
14
11

More than 3 years have passed since last update.

システムリソースの制限(ulimit)

Last updated at Posted at 2020-05-15

はじめに

このあたりで、システムのリソースを制限したりすることが今後あるだろうと思って、ulimitについて調べてみた

制限の対象

システム全体

システム全体で利用可能なプロセス数やファイルすうなどのリソース制限は、sysctlコマンド

ユーザーやグループ単位 デーモンではない

  • ulimitコマンド
    • そのユーザーでログインして、ulimitコマンドを使う
  • /etc/security/limits.conf
    • ユーザーを記入して制限値を書く
    • ログインシェルを介した制限

デーモンプロセス

  • Cent7の場合、systemdの設定ファイルに制限値を記載する必要あり

↓ apcheのプロセス数の変更があるが、一時的に有効になっているだけで、OS再起動などしたら無効になる
https://takeshiyako.blogspot.com/2013/01/httpdulimit.html

ulimitコマンド

bashなどに含まれている内部コマンドで各プロセスが利用できるリソースに制限をかけることができる

以下-Sor-Hがない場合、ソフトリミット、ハードリミット両方に対して指定値が反映

//ソフトを4000
ulimit -Sn 4000
// ソフトもハードもどっちも4000
ulimit -n 4000

ソフトリミット -S

  • 現在有効なユーザーの利用可能なリソースの制限。ハードリミットまで増やすことができる

ハードリミット -H

  • 一般ユーザーはハードリミットの値は減らすことはできるが、増やすことはできない
  • rootユーザーは増やすことができる

書き方

ulimit -Sn 4000
ulimit -Sm 4000

ユーザーから実行したプロセスのリソースへの制限値確認

このログインしたユーザーからプロセスを実行すると下記制限がかかる(デフォルト)

# ulimit -Sa
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 15234
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) 10240
cpu time               (seconds, -t) unlimited
max user processes              (-u) 15234
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
root@web2:~
# ulimit -Ha
core file size          (blocks, -c) unlimited
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 15234
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 4096
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) unlimited
cpu time               (seconds, -t) unlimited
max user processes              (-u) 15234
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

プロセスのulimitの確認 apacheの場合

# ps auxf | grep httpd
root     17733  0.0  0.0 103320   872 pts/0    S+   04:07   0:00          \_ grep httpd
root     19585  0.0  0.6 431068 25856 ?        Ss   Mar02   6:53 /usr/sbin/httpd
apache   15562  0.0  1.1 456336 46312 ?        S    03:16   0:01  \_ /usr/sbin/httpd
apache   15563  0.0  1.4 471072 60616 ?        S    03:16   0:02  \_ /usr/sbin/httpd
apache   15564  0.0  1.3 464788 55224 ?        S    03:16   0:02  \_ /usr/sbin/httpd
apache   15565  0.0  1.2 467252 49708 ?        S    03:16   0:02  \_ /usr/sbin/httpd
apache   15566  0.0  0.6 435212 24552 ?        S    03:16   0:00  \_ /usr/sbin/httpd
apache   15567  0.0  0.7 439356 28732 ?        S    03:16   0:00  \_ /usr/sbin/httpd
apache   15572  0.0  1.5 474280 63620 ?        S    03:16   0:01  \_ /usr/sbin/httpd
apache   15573  0.0  0.7 439336 28892 ?        S    03:16   0:01  \_ /usr/sbin/httpd
apache   15593  0.0  0.7 446508 29296 ?        S    03:16   0:01  \_ /usr/sbin/httpd
apache   15594  0.0  0.7 441316 30808 ?        S    03:16   0:00  \_ /usr/sbin/httpd
apache   15595  0.0  0.8 452592 34920 ?        S    03:16   0:01  \_ /usr/sbin/httpd
apache   17697  0.0  0.4 431068 19140 ?        S    04:06   0:00  \_ /usr/sbin/httpd

制限の確認


# cat /proc/19585/limits 
Limit                     Soft Limit           Hard Limit           Units     
Max cpu time              unlimited            unlimited            seconds   
Max file size             unlimited            unlimited            bytes     
Max data size             unlimited            unlimited            bytes     
Max stack size            10485760             unlimited            bytes     
Max core file size        0                    unlimited            bytes     
Max resident set          unlimited            unlimited            bytes     
Max processes             15234                15234                processes 
Max open files            1024                 4096                 files     
Max locked memory         65536                65536                bytes     
Max address space         unlimited            unlimited            bytes     
Max file locks            unlimited            unlimited            locks     
Max pending signals       15234                15234                signals   
Max msgqueue size         819200               819200               bytes     
Max nice priority         0                    0                    
Max realtime priority     0                    0                    
Max realtime timeout      unlimited            unlimited            us        

デーモンプロセスに対してlimit制限の変更

PAM 認証

「/etc/security/limits.conf」で設定した値はログインしない「デーモンプロセス」には効果がありません。
細かく説明すると、理由はログイン時や su コマンド実行時に PAM 認証されたタイミングで /etc/security/limits.conf の設定が適用されるため、デーモンプロセスには効かないということになります。

daemon系プロセスのファイルディスクリプタ数上限を設定する際、/etc/security/limits.conf は使えません。状況によっては一見設定されたように見えますが、大きな落とし穴にはまることになります。
面倒ですが、必要なプロセス毎にulimitを用いて適切に設定しましょう。

一時的にlimits.confの設定内容が有効になるだけ

つまり、手動で再起動した場合は一時的にlimits.confの設定内容が有効になるだけなのです。
当然、マシン自体が再起動した場合はinitが各daemonを起動し、PAM認証が入らないため、OS規定の上限値である1024に戻ってしまいます。

結局、リミット値を上げるには、ulimit -n の記述を

daemontoolsであれば、/service/<サービス名>/runファイルに追加
rcスクリプトであれば、/etc/init.d/<サービス名>ファイルに追加
しないといけません。

ただしapacheの場合、apachectl経由での制御を行うとrcスクリプトを介さないため、apachectlにも追加しておかないといけないことに注意してください。

Cent7の場合

systemdの設定ファイルに設定値を書く

14
11
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
11