LoginSignup
12

More than 5 years have passed since last update.

プロセスのコアダンプ出力設定メモ

Last updated at Posted at 2017-05-11

概要

  • 個々のプロセスのコアダンプを出力させるための設定メモ.
  • 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システム構築・運用技術

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
12