はじめに
このあたりで、システムのリソースを制限したりすることが今後あるだろうと思って、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の設定ファイルに設定値を書く