行き先なし

Alpine Linuxでulimitの上限を引き上げる

Alpine Linuxでlimits.conf, PAM, デーモンのファイルディスクリプタの制限を引き上げる。

AlpineLinuxLinuxシステム管理

デフォルトのファイルオープン数上限は低い

$ ulimit -Hn
4096
$ ulimit -Sn
1024

やること

ulimit コマンドで上限を一時的に増やせるが永続化する。

対象環境は OpenRC, OpenSSH

シェルとデーモンそれぞれの方法を書く。
設定操作は root ユーザーで行う。

SSH ログイン先シェルで有効にする方法

  1. 上限設定を追加する

いずれかの方法で以下の設定を追加する。

*   soft nofile 65535
*   hard nofile 65535

(とりあえず個人環境なので全ユーザーに大きい値を設定する例)

  1. 無ければ openssh-server-pam パッケージをインストールする
apk add openssh-server-pam
  1. OpenSSH で PAM を使用する

/etc/ssh/sshd_configUsePAMを yes にする。

UsePAM yes
  1. OpenSSH を再起動
rc-service sshd restart

これで SSH ログインすると上限が引き上げられている。

$ ulimit -Hn
65536
$ ulimit -Sn
65536

デーモンで有効にする方法

このマシンでは OpenVPN を起動しているので例にする。

OpenRC デーモンの ulimit は先の PAM の設定とは独立しているので低いままだ。

$ cat /proc/$(pgrep openvpn)/limits
Limit                     Soft Limit           Hard Limit           Units
(省略)
Max open files            1024                 4096                 files
(省略)

2 つの方法でファイルオープン数上限を 10000 にする例を記す

方法

その 1 /etc/conf.d/サービス名 に書く

サービスごとのデーモンファイルに直接書く。
OpenVPN の場合は /etc/conf.d/openvpn

rc_ulimit="-n 10000"

その 2 /etc/rc.conf を書く

https://github.com/OpenRC/openrc/blob/master/user-guide.md#ulimit-and-cgroups

OpenRC のデフォルト値は rc.conf で書ける。

# Pass ulimit parameters
# If you are using bash in POSIX mode for your shell, note that the
# ulimit command uses a block size of 512 bytes for the -c and -f
# options
# rc_ulimit="-u 30"

# 追加
rc_ulimit="-n 10000"

いずれかの方法でサービスまたはマシン再起動後に確認すると設定した数になっている。

※ 明示的な設定値無しでサービス再起動を行うと操作シェルの ulimit が適用されるような動きに見えたのでマシン再起動が確実

# rc-service openvpn restart

# cat /proc/$(pgrep openvpn)/limits
Limit                     Soft Limit           Hard Limit           Units
(省略)
Max open files            10000                10000                files
(省略)

まとめ

OpenSSH + PAM のシェルとデーモンの ulimit 指定方法を書いた。

/bin/login から入る直接操作するシェルの ulimit は未解決

試して気づいたが、PAM 設定無しでも /etc/rc.conf または /etc/conf.d/sshd に rc_ulimit を設定することで sshd の子プロセスであるシェルもデフォルトで同じ ulimit を持つ。

 2268 ?        Ss     0:00 sshd: user [priv]
 2270 ?        S      0:00  \_ sshd: user@pts/0
 2271 pts/0    Ss     0:00      \_ -ash

正攻法ではなさそうだけれど、個人用壊れてもいい環境 で SSH 操作 がメインだったら /etc/rc.confrc_ulimit へ適当な大きな値の設定をするだけですみそう。

発端

Alpine Linux 3.17 を入れている環境に Podman で MariaDB を建てようとしたときにファイルディスクリプタ数の Warning が出てきたので、動かないわけではないがメッセージを消すための対処。

2023-01-08  9:51:14 0 [Warning] Could not increase number of max_open_files to more than 4096 (request: 32183)
2023-01-08  9:51:14 0 [Warning] Changed limits: max_open_files: 4096