概要
- 個々のプロセスのコアダンプを出力させるための設定メモ.
CentOS6.9
個々のプロセスのリソース制限
コアダンプ以外にもファイルディスクリプタの数などシステムのリソースをulimitによって制限できる。
コマンドとか用語
SoftLimit確認と変更
確認
ulimit -Sc
変更
ulimit -Sc 値
HardLimit確認と変更
確認
ulimit -Hc
変更
ulimit -Hc 値
SoftLimitとHardLimitの同時変更
ulimit -c 値
Soft Limit
- 実際の制限値(コアダンプのサイズ)
- Soft Limitが0だとコアダンプが出力されない
Hard Limit
- 個々のユーザーがulimitコマンドで変更する際の変更可能な上限値(変更可能上限値)
- rootユーザー以外はハードリミットの値を増加させることができない。
ulimitを使ってリソース制限を設定するタイミング
- コマンドラインから実行のプロセスに対して
- OS起動時に立上るデーモンプロセスに対して
コアダンプ出力先設定
- /etc/sysctl.confに
kernel.core_pattern = /tmp/core
を設定する - sysctl -p で有効にする
コマンドラインから実行のプロセスに対してコアダンプを出力する設定
プロセスのリソース制限の確認
- ログインシェルを起動した時の各リソースの確認
- core file sizeがコアダンプ出力設定。ここで出力されているのはSoftLimitの値。値が0だと出力されない。
# ulimit -a
core file size (blocks, -c) unlimited
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 3878
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) 3878
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
どうする
- コマンドラインからulimitコマンドでSoftLimit,HardLimtiを設定する。
- 恒久的に設定する場合は**/etc/security/limits.conf** に設定値を書く。下記参照
SoftLimit、HardLimitのデフォルト値
- /etc/security/limits.conf に設定値を書く。
- ログインシェル、対話シェル起動でこのファイルを読み込む。デーモンプロセスは読みこまない。
- ログインシェルとは
/etc/security/limits.conf
・
・
#<domain> <type> <item> <value>
#
#* soft core 0
#* hard rss 10000
#@student hard nproc 20
#@faculty soft nproc 20
#@faculty hard nproc 50
#ftp hard nproc 0
#@student - maxlogins 4
・
・
OS起動時に立上るデーモンプロセスに対して設定する場合
コアダンプ出力できる設定かどうかの確認
Max core file sizeの値が0なら出力されない。0の場合、Soft Limitを修正しなければいけない。
# cat /proc/29500/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 unlimited unlimited bytes
Max resident set unlimited unlimited bytes
Max processes 3878 3878 processes
Max open files 16384 16384 files
Max locked memory 65536 65536 bytes
Max address space unlimited unlimited bytes
Max file locks unlimited unlimited locks
Max pending signals 3878 3878 signals
Max msgqueue size 819200 819200 bytes
Max nice priority 0 0
Max realtime priority 0 0
Max realtime timeout unlimited unlimited us
SoftLimitの修正
- OSが起動して各デーモンを**/etc/rc.d/init.d/各スクリプト**から立ち上げる時にSoftLimitを設定している様子
- /etc/rc.d/init.d/funtcionsにてSoftLimitの設定を有効にしている
- DAEMON_COREFILE_LIMITは通常空なので通常SoftLimitは0(コアダンプ出力しない)設定になっている。functionsとは、起動スクリプトで利用する関数を定義した一覧、でよいのかな??
/etc/rc.d/funtcions
# -*-Shell-script-*-
#
# functions This file contains functions to be used by most or all
# shell scripts in the /etc/init.d directory.
#
・
・
414 ^ # make sure it doesn't core dump anywhere unless requested~
415 ^ corelimit="ulimit -S -c ${DAEMON_COREFILE_LIMIT:-0}"~
$ grep -r DAEMON_COREFILE_LIMIT /etc
/etc/rc.d/init.d/functions: corelimit="ulimit -S -c ${DAEMON_COREFILE_LIMIT:-0}"
httpdの場合
スクリプトの先頭で**/etc/rc.d/init.d/functions**を読み込んでいる
#!/bin/bash
#
# httpd Startup script for the Apache HTTP Server
#
# chkconfig: - 85 15
# description: The Apache HTTP Server is an efficient and extensible \
# server implementing the current HTTP standards.
# processname: httpd
# config: /etc/httpd/conf/httpd.conf
# config: /etc/sysconfig/httpd
# pidfile: /var/run/httpd/httpd.pid
#
### BEGIN INIT INFO
# Provides: httpd
# Required-Start: $local_fs $remote_fs $network $named
# Required-Stop: $local_fs $remote_fs $network
# Should-Start: distcache
# Short-Description: start and stop Apache HTTP Server
# Description: The Apache HTTP Server is an extensible server
# implementing the current HTTP standards.
### END INIT INFO
# Source function library.
. /etc/rc.d/init.d/functions
if [ -f /etc/sysconfig/httpd ]; then
. /etc/sysconfig/httpd
fi
どうするか
よってコアダンプを出力させるようにするためには例えばfunctionsの前でDAEMON_COREFILE_LIMIT=unlimitedのような設定を追加したり、各起動スクリプトで
**ulimit -S -c unlimited
**してSoftLimitの上書きをすれば良いはず。実際に前者の方法で上手くコアダンプを出力させることができた。
upstartの場合
upsatartを利用するlogstashの場合、limit のフォーマットがありこの箇所で設定すれば上手くコアダンプを出力してくれる。
/etc/init/logstash.conf
description "logstash"
start on filesystem or runlevel [2345]
stop on runlevel [!2345]
respawn
umask 022
nice 19
limit nofile 16384 16384
chroot /
chdir /
#limit core <softlimit> <hardlimit>
limit core unlimited unlimited
#limit cpu <softlimit> <hardlimit>
#limit data <softlimit> <hardlimit>
#limit fsize <softlimit> <hardlimit>
#limit memlock <softlimit> <hardlimit>
#limit msgqueue <softlimit> <hardlimit>
#limit nice <softlimit> <hardlimit>
#limit nofile <softlimit> <hardlimit>
#limit nproc <softlimit> <hardlimit>
#limit rss <softlimit> <hardlimit>
#limit rtprio <softlimit> <hardlimit>
#limit sigpending <softlimit> <hardlimit>
#limit stack <softlimit> <hardlimit>
script
[ -r "/etc/default/logstash" ] && . "/etc/default/logstash"
[ -r "/etc/sysconfig/logstash" ] && . "/etc/sysconfig/logstash"
exec chroot --userspec logstash:logstash / /usr/share/logstash/bin/logstash "--path.settings" "/etc/logstash" >> /var/log/logstash-stdout.log 2>> /var/log/logstash-stderr.log
end script
それ以外
- serviceコマンドやinitctlコマンドで起動しない場合、それ専用の起動シェルスクリプトにulimitコマンドを追加しないといけない。
他に
- 例えばmysqlだとmysqlの設定ファイルにコアダンプを出力させる設定があったような。各アプリケーションの設定ファイルで各種リソースを制限できるのかも。
参考
http://qiita.com/suzutsuki0220/items/aa84d7e2e8f37e867f3d
プロのためのLinuxシステム構築・運用技術