ナレッジベース

多数の開いた接続のためのカーネル設定

ボックスが数万のソケットを保持する場合に重要となるsysctl値とsystemd制限、および古いブログ記事からコピーされただけで何もしないものについて。

最初に測定する

ss -s
cat /proc/sys/fs/file-nr
nstat -az TcpExtListenOverflows TcpExtListenDrops

ListenOverflows が上昇している場合、accept キューが満杯で、カーネルが完了したハンドシェイクを破棄していることを意味します。これは、特定の問題であり、特定の修正策があります。他のほとんどの症状は sysctl ではまったく解決できません。プレッシャーのかかっていないマシンをチューニングしても、最終的な障害をより見つけにくい場所に移すだけです。

価値のある設定

# /etc/sysctl.d/90-connections.conf
fs.file-max = 2097152
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 32768
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.ip_local_port_range = 10240 65535
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_slow_start_after_idle = 0
net.ipv4.tcp_mtu_probing = 1
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
sysctl --system
sysctl net.ipv4.tcp_congestion_control

それぞれの設定の役割:

  • somaxconn は listen バックログを制限しますが、アプリケーションがそれを要求する必要があります。nginx では listen ... backlog=65535、ほとんどの言語では listen() の2番目の引数です。
  • ip_local_port_range はクライアント側で重要です。プロキシが1つの宛先への外向き接続を開くと、デフォルトの範囲では約28,000でエフェメラルポートを使い果たします。
  • tcp_tw_reuse は、カーネルが TIMEWAIT ソケットを新しい外向き接続に再利用できるようにします。安全です。そのいとこである `tcptw_recycle` は Linux 4.12 で削除されました。それを推奨するガイドはどれも2017年より前に書かれたものです。
  • fqbbr の組み合わせは、長いまたは損失の多い経路では実際の改善であり、短くてクリーンな経路では違いはありません。どちらも標準カーネルに含まれています。

コネクション・トラッキング

ステートフル・ファイアウォールは、すべての接続に conntrack エントリを与えます。テーブルには上限があります。それに達するとパケットがドロップされ、カーネルログに nf_conntrack: table full と書き込まれます。

sysctl net.netfilter.nf_conntrack_max net.netfilter.nf_conntrack_count

メモリがあれば引き上げてください。各エントリは数百バイトを消費します:

net.netfilter.nf_conntrack_max = 1048576

ワークロードがステートレスな公開サービスである場合、より良い答えはトラッキングしないことです:

table inet raw {
  chain prerouting {
    type filter hook prerouting priority raw;
    tcp dport 443 notrack
  }
}

systemd が無視する制限

/etc/security/limits.conf は PAM によるログインに適用されます。systemd が開始したサービスにはまったく影響しません。そのため、そこでの nofile を引き上げて nginx を再起動しても、何も変わりません。サービス・ユニットで設定してください:

mkdir -p /etc/systemd/system/nginx.service.d
cat > /etc/systemd/system/nginx.service.d/limits.conf <<EOF
[Service]
LimitNOFILE=1048576
EOF
systemctl daemon-reload
systemctl restart nginx

実行中のサービスに対して確認してください。書き込んだファイルではなく:

systemctl show nginx -p LimitNOFILE

やるべきでない3つのこと

  • フォーラムから50行の sysctl ファイルを貼り付けないでください。その半分は10年前に出荷されたカーネルを対象としており、ある1行はパス MTU 探索を静かに壊します。
  • 長い太いパスが正当化されない限り、tcp_rmemtcp_wmem を引き上げないでください。1ミリ秒のパスでは、バッファが大きいとレイテンシとメモリプレッシャーが増加します。
  • tcp_timestamps を無効にしないでください。ラウンドトリップ推定と PAWS を失い、パフォーマンスに関する噂を得るだけです。

各変更の後、一度に1つの変更を測定し、ファイルをバージョン管理に保持して、次の人が何をしたか、なぜしたかを確認できるようにしてください。

準備はできている

都市を選べ。サイズを選べ。コインで支払え。

あなたが誰かに関するフォームも、承認する人間を待つ必要も、確認のための電話もありません。請求が完了すれば、認証情報があなたの受信トレイに届きます。