システムリソースの制限(ulimit)

# はじめに
https://qiita.com/hot_study_man/items/24ba3e00fc936abab58b

このあたりで、システムのリソースを制限したりすることが今後あるだろうと思って、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ユーザーは増やすことができる

## 書き方

```bash
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
```

制限の確認

```bash

# 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制限の変更
https://staffblog.yumemi.jp/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%83%87%E3%82%A3%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%82%BF%E6%95%B0%E3%81%AE%E4%B8%8A%E9%99%90%E5%A4%89%E6%9B%B4%E3%81%A8limits-conf%E3%81%AE%E7%BD%A0-2/

https://go-journey.club/archives/4823

## 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の設定ファイルに設定値を書く