
systemd のサービスとして起動したプロセスのリソース制限値(カーネルパラメタ:プロセス数、ファイルディスクリプタ等の制限値)には"/etc/security/limits.conf"内で設定している制限値が適用されない。(systemdサービスにはPAM Limitが適用されない)
systemd のサービスとして起動したプロセスのリソース制限値は.serviceファイル内で下記ディレクティブを設定する。
Directive ulimit equivalent Unit
-------------- ------------------ -------------
LimitCPU ulimit -t Seconds
LimitFSIZE ulimit -f Bytes
LimitDATA ulimit -d Bytes
LimitSTACK ulimit -s Bytes
LimitCORE ulimit -c Bytes
LimitRSS ulimit -m Bytes
LimitNOFILE ulimit -n Number of File Descriptors
LimitAS ulimit -v Bytes
LimitNPROC ulimit -u Number of Processes
LimitMEMLOCK ulimit -l Bytes
LimitLOCKS ulimit -x Number of Locks
LimitSIGPENDING ulimit -i Number of Queued Signals
LimitMSGQUEUE ulimit -q Bytes
LimitNICE ulimit -e Nice Level
LimitRTPRIO ulimit -r Realtime Priority
LimitRTTIME No equivalent -
(設定例)
環境:CentOS 7.4
==============================
systemd .serviceファイルのリソース制限設定
resource limitation on systemd .service file
==============================
以下の"/etc/security/limits.conf"と同等のリソース制限をsystemd serviceに設定する。
---/etc/security/limits.conf----------
usr1 soft nproc unlimited
usr1 hard nproc unlimited
usr1 soft nofile 65536
usr1 hard nofile 65536
---------------------------------------
--- /etc/systemd/system/testApp1.service ------------------------------
# /etc/systemd/system/testApp1.service
[Unit]
Description = Start / Stop test app1 service
#Requires=oracle-rdbms.service
#After=oracle-rdbms.service
[Service]
LimitMEMLOCK=infinity
LimitNOFILE=65536
LimitNPROC=infinity
TimeoutSec=300s
Type=forking
Restart=no
User=test1
ExecStartPre= /local0/test/app1/scripts/start-PreServe1.sh
ExecStart = /local0/test/app1/bin/app1control.sh start
ExecReload = /local0/test/app1/bin/app1control.sh restart
ExecStop = /local0/test/app1/bin/app1control.sh stop
[Install]
WantedBy = multi-user.target
--- end of /etc/systemd/system/testApp1.service ------------------------
上記の.serviceファイル内のディレクティブによるリソース制限値はsoft と hard どちらの limit も同時に設定される。
=====================
systemdサービスの反映、実行
=====================
# systemctl daemon-reload;
# systemctl restart testApp1.service;
========================
起動中のプロセスのulimit値の確認
confirm the running process ulimit
========================
# ps -ef | grep app1
test1 1604 1 0 Feb27 ? 00:18:08 /local0/test1/app1/jre/jre1.8.0_144/bin/java -Xmx39G -jar lib/boot.jar -app=lib/module1.jar
$ cat /proc/1604/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 8388608 unlimited bytes
Max core file size 0 unlimited bytes
Max resident set unlimited unlimited bytes
Max processes unlimited unlimited processes
Max open files 65536 65536 files
Max locked memory 65536 65536 bytes
Max address space unlimited unlimited bytes
Max file locks unlimited unlimited locks
Max pending signals 1032556 1032556 signals
Max msgqueue size 819200 819200 bytes
Max nice priority 0 0
Max realtime priority 0 0
Max realtime timeout unlimited unlimited us
$
リソース制限値が正常に設定されない場合は、"/etc/security/limits.conf" の上限値も同様に変更する。(環境により"/etc/security/limits.conf"の上限値が優先される時がある?よく理解していないです・・・。)
[END]