Web sunucum neden yüksek yükte TCP sıfırlamasıyla bağlantı kesiyor?


10

Nginx ile küçük bir VPS kurulumum var. Mümkün olduğunca fazla performans elde etmek istiyorum, bu yüzden optimizasyon ve yük testi ile denemeler yapıyorum.

Küçük bir statik metin dosyası alarak yük testi yapmak için Blitz.io kullanıyorum ve aynı anda bağlantı sayısı kabaca 2000 ulaştığında sunucu TCP sıfırlama gönderme gibi görünüyor garip bir sorunla karşılaşıyorum. Bu çok olduğunu biliyorum büyük miktarda, ancak htop kullanarak sunucu hala CPU zaman ve bellek yedeklemek için bol var, bu yüzden daha da itebilir miyim görmek için bu sorunun kaynağını bulmak istiyorum.

2 GB Linode VPS'de Ubuntu 14.04 LTS (64 bit) kullanıyorum.

Bu grafiği doğrudan yayınlamak için yeterli itibarım yok, bu yüzden Blitz.io grafiğine bir bağlantı:

resim açıklamasını buraya girin

Sorunun kaynağını bulmaya çalışmak için yaptığım şeyler:

  • Nginx yapılandırma değeri worker_rlimit_nofile8192 olarak ayarlandı
  • gelmiş nofilehem sert ve yumuşak sınırları için 64000 ayarlı rootve www-datakullanıcı (olarak çalışır nginx neyi) içinde/etc/security/limits.conf
  • herhangi bir şeyin yanlış gittiğine dair hiçbir belirti yoktur /var/log/nginx.d/error.log(genellikle, dosya tanımlayıcı sınırlarına giriyorsanız, nginx hata mesajlarını yazdırır)

  • Ben ufw kurulum var, ama hiçbir hız sınırlama kuralları. Ufw günlüğü hiçbir şeyin engellenmediğini gösterir ve aynı sonuçla ufw'yi devre dışı bırakmayı denedim.

  • Hiçbir gösterge hatası yok /var/log/kern.log
  • Hiçbir gösterge hatası yok /var/log/syslog
  • Ben değerleri aşağıdaki eklemiş /etc/sysctl.confve bunları yüklü sysctl -phiçbir etkisi ile:

    net.ipv4.tcp_max_syn_backlog = 1024
    net.core.somaxconn = 1024
    net.core.netdev_max_backlog = 2000
    

Herhangi bir fikir?

EDIT: Ben çok küçük bir dosya (sadece 3 bayt) 3000 bağlantıya rampa yeni bir test yaptım. İşte Blitz.io grafiği:

Blitz.io grafiği

Yine, Blitz'e göre bu hataların tümü "TCP Bağlantısı sıfırlama" hatalarıdır.

İşte Linode bant genişliği grafiği. Bunun 5 dakikalık bir ortalama olduğunu unutmayın, bu yüzden düşük geçiş biraz filtrelenmiştir (anlık bant genişliği muhtemelen çok daha yüksektir), ancak yine de, bu hiçbir şey değildir:

resim açıklamasını buraya girin

İŞLEMCİ:

resim açıklamasını buraya girin

I / O:

resim açıklamasını buraya girin

İşte htoptestin sonuna yaklaştık: htop

Ayrıca, hataların gelmeye başladığı zaman yakalamaya başlayarak, farklı (ama benzer görünümlü) bir testte tcpdump kullanarak bazı trafiği yakaladım: sudo tcpdump -nSi eth0 -w /tmp/loadtest.pcap -s0 port 80

Birisi ona bakmak isterse dosya şöyledir (~ 20MB): https://drive.google.com/file/d/0B1NXWZBKQN6ETmg2SEFOZUsxV28/view?usp=sharing

İşte Wireshark'tan bir bant genişliği grafiği:

resim açıklamasını buraya girin (Satır tüm paketler, mavi çubuklar TCP hatalarıdır)

Yakalama hakkındaki yorumumdan (ve ben uzman değilim), TCP RST bayrakları sunucudan değil yük test kaynağından geliyor gibi görünüyor. Bu nedenle, yük testi hizmeti tarafında bir şeylerin yanlış olduğunu varsayarsak, bunun yük testi hizmeti ile sunucum arasındaki bir tür ağ yönetiminin veya DDOS azaltmasının bir sonucu olduğunu varsaymak güvenli midir?

Teşekkürler!


Sağlayıcınız bir çeşit DDoS azaltma yapıyor mu? Bu, testinizi etkileyebilir.
Michael Hampton

@MichaelHampton Linode'un bunu yapmadığından oldukça eminim.
EEAA

Ağ grafiğini Linode kontrol panelinden gönderebilir misiniz? Bu test aslında ne kadar bant genişliği alıyor?
EEAA

Biraz daha araştırma yaptım ve orijinal yayını daha fazla bilgi ile güncelledim. Ayrıca, Linode ile DDOS azaltma işlemini gerçekleştirmediklerini doğruladım, ancak bu mutlaka yük testi hizmeti ile Linode arasındaki bir ağ sağlayıcısının herhangi bir şey yapmadığı anlamına gelmez. Teşekkürler!
Erik Swan

1
Yalnızca net.core.netdev_max_backlog2000'e kadar ayarlamanızın bir nedeni var mı ? Gördüğüm birkaç örnek, gigabit (ve 10Gig) bağlantıları için daha yüksek bir büyüklük sırasına sahip.
Moshe Katz

Yanıtlar:


1

Bağlantı sıfırlamalarının herhangi bir sayıda kaynağı olabilir. Yük test cihazı, bir bağlantı başlatmak için kullanılabilir geçici bağlantı noktalarının dışında olabilir, yol boyunca bir cihaz (NAT yapan bir güvenlik duvarı gibi) NAT havuzunun tükenmiş olabilir ve bağlantı için bir kaynak bağlantı noktası sağlayamayabilir mi? bağlantı sınırına ulaşmış olabilecek bir yük dengeleyici veya güvenlik duvarı? Ve gelen trafikte NAT kaynağı yapıyorsa, bu bağlantı noktası tükenmesine de neden olabilir.

Bir gerçekten her iki uçtan bir pcap dosyası gerekir. Aramak istediğiniz şey, bir bağlantı girişimi gönderilir ancak sunucuya asla ulaşmaz, ancak yine de sunucu tarafından sıfırlanmış gibi görünür. Bu durumda, hat boyunca bir şey bağlantıyı sıfırlamak zorunda kaldı. NAT havuzu tükenmesi bu tür sorunların ortak bir kaynağıdır.

Ayrıca, netstat -st size bazı ek bilgiler verebilir.


1

Son zamanlarda yaptığım benzer ayarlama deneyimlerime dayanarak denemek için bazı fikirler. Referanslarla:

Statik bir metin dosyası olduğunu söylüyorsunuz. Herhangi bir yukarı akış işleminin devam etmesi durumunda, görünüşe göre alan adı soketleri, TC bağlantı noktası tabanlı bir bağlantı üzerinden TCP verimini artırır:

https://rtcamp.com/tutorials/php/fpm-sysctl-tweaking/ https://engineering.gosquared.com/optimising-nginx-node-js-and-networking-for-heavy-workloads

Akış yukarı sonlandırmadan bağımsız olarak:

Multi_accept ve tcp_nodelay'i etkinleştir: http://tweaked.io/guide/nginx/

TCP Yavaş Başlatmayı devre dışı bırak: /programming/17015611/disable-tcp-slow-start http://www.cdnplanet.com/blog/tune-tcp-initcwnd-for-optimum-performance/

TCP Tıkanıklık Penceresini En İyileştir (initcwnd): http://www.nateware.com/linux-network-tuning-for-2013.html


1

Maksimum açık dosya sayısını ayarlamak için (bu, soruna neden oluyorsa) /etc/sysctl.conf dosyasına "fs.file-max = 64000" eklemeniz gerekir


0

Lütfen TIME_WAITkomutu kullanarak kaç bağlantı noktasının durumda olduğuna bakın netstat -patunl| grep TIME | wc -lve net.ipv4.tcp_tw_reuse1 olarak değiştirin .


TIME_WAITEyalette kaç tane port olduğuna nasıl bakarım ?
Erik Swan

netstatVeya tuşlarını kullanarak ss. Cevabımı tam komutla güncelledim!
fgbreel

Testi tekrar çalıştırdım watch -n 1 'sudo netstat -patunl | grep TIME | wc -l've tüm test boyunca 0 döndürür. Ben peri yük sıfırlama yük test ve benim sunucu arasında biri tarafından DDOS hafifletme sonucu, yukarıda yayınlanan PCAP dosyası analiz dayanarak geliyor eminim, ama birisi bu harika olacağını teyit eğer!
Erik Swan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.