Bilgi tabanı

Çok sayıda açık bağlantı için çekirdek ayarları

Bir makinenin on binlerce soket tuttuğunda önemli olan sysctl değerleri ve systemd limitleri ile eski blog yazılarından kopyalanan ve hiçbir işe yaramayanlar.

Önce ölçün

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

ListenOverflows tırmanışı, kabul kuyruğunun dolu olduğu ve çekirdeğin tamamlanmış el sıkışmaları attığı anlamına gelir. Bu, belirli bir çözümü olan belirli bir sorundur. Diğer belirtilerin çoğu sysctl ile hiç çözülmez ve baskı altında olmayan bir makineyi ayarlamak, olası arızayı bulunması daha zor bir yere taşımaktan başka bir şey yapmaz.

Yerini hak eden ayarlar

# /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

Her birinin ne yaptığı:

  • somaxconn dinleme kuyruğunu sınırlar ve uygulamanız yine de bunu istemek zorundadır. nginx'te bu listen ... backlog=65535'tir; çoğu dilde listen()'in ikinci bağımsız değişkenidir.
  • ip_local_port_range istemci tarafında önemlidir. Tek bir hedefe dışa dönük bağlantılar açan bir proxy, varsayılan aralıkla yaklaşık yirmi sekiz binde geçici bağlantı noktalarını tüketir.
  • tcp_tw_reuse çekirdeğin TIMEWAIT yuvalarını yeni dışa dönük bağlantılar için yeniden kullanmasını sağlar. Güvenlidir. Kuzeni `tcptw_recycle` Linux 4.12'den kaldırıldı ve hâlâ bunu öneren herhangi bir rehber 2017'den önce yazılmıştır.
  • fq, bbr ile birlikte uzun veya kayıplı yollarda gerçek bir iyileştirmedir ve kısa temiz yollarda etkisizdir. Her ikisi de stok çekirdeklerde mevcuttur.

Bağlantı izleme

Durum bilgisi olan bir güvenlik duvarı, her bağlantıya bir conntrack kaydı verir ve tablonun bir tavanı vardır. Bu tavana ulaşmak paketleri düşürür ve çekirdek günlüğüne nf_conntrack: table full yazar.

sysctl net.netfilter.nf_conntrack_max net.netfilter.nf_conntrack_count

Belleğiniz varsa yükseltin — her kayıt birkaç yüz bayt tutar:

net.netfilter.nf_conntrack_max = 1048576

İş yükü durum bilgisi olmayan genel bir hizmet olduğunda, daha iyi cevap onu izlememektir:

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

systemd'nin yok saydığı sınırlar

/etc/security/limits.conf PAM üzerinden oturum açmalara uygulanır. systemd tarafından başlatılan bir hizmet üzerinde hiçbir etkisi yoktur; bu yüzden orada nofile'u yükseltip nginx'i yeniden başlatmak kesinlikle hiçbir şeyi değiştirmez. Birime bağlayın:

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

Az önce yazdığınız dosyaya değil, çalışan hizmete karşı doğrulayın:

systemctl show nginx -p LimitNOFILE

Yapılmaması gereken üç şey

  • Bir forumdan elli satırlık sysctl dosyası yapıştırmayın. Yarısı on yıldır gönderilmeyen bir çekirdeği hedefler ve bir satır yolu MTU keşfini sessizce bozar.
  • tcp_rmem ve tcp_wmem değerlerini haklı çıkaracak uzun yağlı bir yol olmadan yükseltmeyin. Bir milisaniyelik bir yolda, daha büyük tamponlar gecikme ve bellek baskısı satın alır.
  • tcp_timestamps'yi devre dışı bırakmayın. Gidiş-geliş kestirimini ve PAWS'u kaybedersiniz ve performans hakkında bir söylenti kazanırsınız.

Her değişiklikten sonra, tek seferde bir değişiklik yaparak tekrar ölçün ve dosyayı sürüm kontrolünde tutun ki sizden sonra gelen kişi ne yaptığınızı ve nedenini görebilsin.

Hazır olduğunda

Bir şehir seç. Bir boyut seç. Kripto ile öde.

Kim olduğunuzla ilgili formlar yok, onay için insan bekleme yok, doğrulama için telefon görüşmesi yok. Ödeme onaylanır ve kimlik bilgileri gelen kutunuza düşer.