最初に測定する
ss -s
cat /proc/sys/fs/file-nr
nstat -az TcpExtListenOverflows TcpExtListenDropsListenOverflows が上昇している場合、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 = bbrsysctl --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年より前に書かれたものです。fqとbbrの組み合わせは、長いまたは損失の多い経路では実際の改善であり、短くてクリーンな経路では違いはありません。どちらも標準カーネルに含まれています。
コネクション・トラッキング
ステートフル・ファイアウォールは、すべての接続に 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_rmemとtcp_wmemを引き上げないでください。1ミリ秒のパスでは、バッファが大きいとレイテンシとメモリプレッシャーが増加します。 tcp_timestampsを無効にしないでください。ラウンドトリップ推定と PAWS を失い、パフォーマンスに関する噂を得るだけです。
各変更の後、一度に1つの変更を測定し、ファイルをバージョン管理に保持して、次の人が何をしたか、なぜしたかを確認できるようにしてください。