性能に関係するTCP関連カーネルパラメータの設定
sysctlというカーネルパラメータの確認・変更ツールを使って設定する。 調べる: sysctl <カーネルパラメータの名前>
変更する: /etc/sysctl.d/99-sysctl.confに書き込む。sudo sysctl --systemで反映する。
カーネルパラメータ: net.core.somaxconn(資料1,2より)
Linuxカーネル5.4以降では4096に引き上げられている。
クライアントからのSYNに対してまだSYN/ACKを送信できていない接続のキューを「backlog」という。(資料3より)
backlogのサイズの上限を設定するカーネルパラメータ: net.core.netdev_max_backlog(資料1, 2より)
Ubuntu 22.04では1000だった。
カーネル全体の接続数には、backlogに含まれる接続数も含まれる。net.core.netdev_max_backlogにnet.core.somaxconnより大きい値を設定しても、実際のbacklogのサイズはnet.core.somaxconnより大きくなることはない。(資料3より)
エフェメラルポートの範囲
Linuxカーネルのエフェメラルポートの範囲のデフォルトは32768から60999までの28,232個。
カーネルパラメータ: net.ipv4.ip_local_port_range
outbound接続の数がエフェメラルポートの数を超えることはない。エフェメラルポートが枯渇するとoutbound接続できなくなる。 サーバーもoutbound接続するので無関係な話ではない。(資料4より)
リバースプロキシからバックエンドのアプリケーションサーバーへの接続はoutbound接続である。 バックエンドのアプリケーションサーバーからデータベース管理システムへの接続はoutbound接続である。
outbound接続を永続化する。(資料4より)
例えば、リバースプロキシからアプリケーションサーバーへの通信にKeep-Aliveヘッダを付ける。
TIME_WAIT状態の接続(同一接続先のoutbound接続に限る)を再利用する。(資料1より) カーネルパラメータ: net.ipv4.tcp_tw_reuse
(カーネルパラメータではないが)ファイルディスクリプタの上限数
プロセス毎にファイルディスクリプタの上限数が設定されているので、net.core.somaxconnなどを大きな数字にしていても、ファイルディスクリプタが枯渇するとinbound接続を受け付けられなくなる。 変更方法(資料5, 6より)
/etc/security/limits.conf
ulimitコマンド
systemd経由で起動するプロセスのファイルディスクリプタの数を変更したい場合は、systemdのサービスファイルに書く。 参考にした資料
https://gyazo.com/282a1306dd3d6514d5b39f000e4e885a