LinuxシステムにおけるTCP接続制限の確認と拡張手順

1. 現在のTCP接続ステータスの確認

システム全体のTCP接続状況を把握するために、以下のコマンドを使用して現在のセッション数をカウントします。

# 確立された接続(ESTABLISHED)のみをカウントする場合
ss -atn | grep -c "ESTAB"

# 全てのソケット状態の概要を表示
ss -s

接続数が後述するシステム制限値に近い場合、新規接続の拒否やレイテンシの増加が発生する可能性があります。

2. システムレベルのリソース制限を確認する

(1) バックログ・キュー(somaxconn)

リスニングソケットが受け入れ可能な未完了接続(SYNレシーブ)の最大キューサイズです。

sysctl net.core.somaxconn

この値が小さいと、高負荷時に接続リクエストがドロップされます。デフォルトは通常 128 または 4096 です。

(2) システム全体のファイル記述子(file-max)

Linuxではソケットもファイルとして扱われるため、システム全体で開けるファイル数の上限を確認する必要があります。

# 最大許容数
cat /proc/sys/fs/file-max

# 現在の使用状況(割り当て済み、未使用、最大数)
cat /proc/sys/fs/file-nr

3. プロセスごとの制限を確認する

特定のアプリケーション(Nginxやデータベースなど)が制限に達していないか確認します。

# 特定プロセスのソフト制限とハード制限を確認
PID=$(pgrep nginx)
grep "Max open files" /proc/$PID/limits

# 現在そのプロセスが使用しているファイル記述子数
lsof -p $PID | wc -l

4. 接続制限の拡張設定

(1) カーネルパラメータの一時的な変更

再起動するとリセットされますが、即座に反映させる場合に有効です。

# 接続待ちキューの拡張
sysctl -w net.core.somaxconn=65535

# 最大ファイル記述子の拡張
sysctl -w fs.file-max=2000000

(2) 恒久的な設定(/etc/sysctl.conf)

OS再起動後も設定を維持するために、設定ファイルに追記します。

# /etc/sysctl.conf への追記例
net.core.somaxconn = 65535
fs.file-max = 2000000
net.ipv4.ip_local_port_range = 1024 65535

# 設定の反映
sysctl -p

(3) ユーザー・プロセス制限の変更(/etc/security/limits.conf)

特定のユーザーが開けるファイル数を指定します。

# 全ユーザーに対して制限を緩和
* soft nofile 65535
* hard nofile 65535

(4) Systemd管理下のサービスへの適用

Systemdで動作するサービスの場合、個別のユニットファイルで制限を設定する必要があります。

# /etc/systemd/system/target.service.d/override.conf 等
[Service]
LimitNOFILE=65535

設定後、systemctl daemon-reload とサービスの再起動を行ってください。

5. ポート枯渇とTIME_WAITの最適化

接続数が多く、かつ短寿命の接続が大量にある場合、エフェメラルポートが枯渇することがあります。

# TIME_WAIT状態のソケットを再利用する設定
sysctl -w net.ipv4.tcp_tw_reuse=1

# 利用可能なポート範囲の確認
sysctl net.ipv4.ip_local_port_range

net.ipv4.tcp_tw_reuse を有効にすることで、同一IPからの頻繁な接続要求に対して効率的にポートを割り当てることが可能になります。

6. 設定変更後の検証

変更が正しく反映されているか、再度パラメータを確認します。

# プロセスの制限が更新されているか再確認
cat /proc/$(pgrep <プロセス名>)/limits | grep "Max open files"

タグ: linux TCP Networking sysadmin Kernel

6月7日 22:43 投稿