Redhat7/CentOS7 でのulimitの設定

シェアする

ulimitは、Redhat7/CentOS7 までは/etc/security/limits.conf にて定義していましたが(わかりづらいので、私はいつも起動スクリプトにulimit -n xxxx を埋め込んでましたが。。w)Redhat7では設定場所が変わりましたので、以下にまとめます。

サービス単位の設定

対象となるサービス(本当は、サービスよりdaemonが正式なのでしょうが、慣れを重視しサービスでw)を確認しましょう。

# systemctl list-units --type=service
  UNIT                 LOAD   ACTIVE SUB     DESCRIPTION
  httpd.service        loaded active running The Apache HTTP Server
  mariadb.service      loaded active running MariaDB database server
  named.service        loaded active running Berkeley Internet Name Domain (DNS)
  sshd.service         loaded active running OpenSSH server daemon
 :
 (中略)
 :
  tuned.service        loaded active running Dynamic System Tuning Daemon

LOAD   = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB    = The low-level unit activation state, values depend on unit type.

対象を httpd.service にしましょうか。
今の値を確認です。

# for x in `pidof httpd`; do cat /proc/${x}/limits | grep "open files" ; done
Max open files            1024                 4096                 files
Max open files            1024                 4096                 files
Max open files            1024                 4096                 files
Max open files            1024                 4096                 files
Max open files            1024                 4096                 files
Max open files            1024                 4096                 files
Max open files            1024                 4096                 files
Max open files            1024                 4096                 files
Max open files            1024                 4096                 files
Max open files            1024                 4096                 files
Max open files            1024                 4096                 files

ま、デフォルトなのでopenfileは、Soft 1024 Hard 4096 ですよね。このままでは、数万人が利用するサイトになるとファイルディスクリプタが枯渇してしまいますね。

じゃ、httpdのみを強化します。

# cd /etc/systemd/system/
# mkdir httpd.service.d
# vi httpd.service.d/limit.conf
[Service]
LimitNOFILE=1006500

systemctl で、サービス調べた意味は、ディレクトリ作成のためとなります。

# systemctl restart httpd
Warning: httpd.service changed on disk. Run 'systemctl daemon-reload' to reload units.
# for x in `pidof httpd`; do cat /proc/${x}/limits | grep "open files" ; done
Max open files            1024                 4096                 files
Max open files            1024                 4096                 files
Max open files            1024                 4096                 files
Max open files            1024                 4096                 files
Max open files            1024                 4096                 files
Max open files            1024                 4096                 files

ん?変わってないや。Warningで出ているコマンドを実行。たぶん、systemdで読み込みが必要なんだろう。

# systemctl daemon-reload
# for x in `pidof httpd`; do cat /proc/${x}/limits | grep "open files" ; done
Max open files            1024                 4096                 files
Max open files            1024                 4096                 files
Max open files            1024                 4096                 files
Max open files            1024                 4096                 files
Max open files            1024                 4096                 files
Max open files            1024                 4096                 files
Max open files            1024                 4096                 files

ん?まだか。

# systemctl restart httpd
# for x in `pidof httpd`; do cat /proc/${x}/limits | grep "open files" ; done
Max open files            1006500              1006500              files
Max open files            1006500              1006500              files
Max open files            1006500              1006500              files
Max open files            1006500              1006500              files
Max open files            1006500              1006500              files
Max open files            1006500              1006500              files

お!反映しましたね。この方法だと、サーバを再起動してもOpen filesの値は、このままとなりますので安心ですね。

サーバ単位での設定

面倒なので、サーバ単位にて設定したい!という方は以下の通り。私的にはサービス単位で管理するほうがいいと思いますが。。人それぞれなので。

以下の通り

# vi /etc/systemd/system.conf
[Manager]
#LogLevel=info
 :
#DefaultLimitRTTIME=
DefaultLimitNOFILE=1006500

で、再起動します。

# shutdown -r now

サーバ起動してきましたので、Open files を確認します。

# for x in `pidof httpd`; do cat /proc/${x}/limits | grep "open files" ; done
Max open files            1006500              1006500              files
Max open files            1006500              1006500              files
Max open files            1006500              1006500              files
Max open files            1006500              1006500              files
Max open files            1006500              1006500              files
Max open files            1006500              1006500              files

変わってますね。良かった。じゃ、他のサービスも。。

# for x in `pidof rsyslogd`; do cat /proc/${x}/limits | grep "open files" ; done
Max open files            1006500              1006500              files

おー、rsyslogdも変わってる。これは、これで余りよろしくないような、、本当は提供するサービスのみに起動させる必リソースの割り当てが必要なのではと思ってます。私はサービス単位の定義をお勧めします。ではでは

トップへ戻る