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

# 概要
* 個々のプロセスのコアダンプを出力させるための設定メモ.
* `CentOS6.9`


# 個々のプロセスのリソース制限
コアダンプ以外にもファイルディスクリプタの数などシステムのリソースを**ulimit**によって制限できる。

# コマンドとか用語
## SoftLimit確認と変更
確認

```bash
ulimit -Sc
```
変更

```bash
ulimit -Sc 値
```

## HardLimit確認と変更
確認

```bash

ulimit -Hc
```

変更

```bash

ulimit -Hc 値
```

## SoftLimitとHardLimitの同時変更

```bash

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だと出力されない。

```bash
# 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** に設定値を書く。
* **ログインシェル**、**対話シェル**起動でこのファイルを読み込む。デーモンプロセスは読みこまない。
* [ログインシェルとは](http://qiita.com/saikoro-steak/items/2e9b177fea202186bd2c)

```/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を修正しなければいけない。

```bash
# 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とは、起動スクリプトで利用する関数を定義した一覧、でよいのかな？？

```bash:/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}"~
```

```bash
$ 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**を読み込んでいる

```bash
#!/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 のフォーマットがありこの箇所で設定すれば上手くコアダンプを出力してくれる。

```bash:/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システム構築・運用技術](https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE-Linux%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E6%A7%8B%E7%AF%89%E3%83%BB%E9%81%8B%E7%94%A8%E6%8A%80%E8%A1%93-Software-Design-plus/dp/4774145017/ref=sr_1_2?s=books&ie=UTF8&qid=1494485482&sr=1-2&keywords=%E3%83%97%E3%83%AD%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AElinux%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E6%A7%8B%E7%AF%89+%E9%81%8B%E7%94%A8%E6%8A%80%E8%A1%93)