ทำไมเว็บเซิร์ฟเวอร์ของฉันถึงปล่อยการเชื่อมต่อที่มีการรีเซ็ต TCP ที่โหลดสูง


10

ฉันมีการติดตั้ง VPS ขนาดเล็กพร้อม nginx ฉันต้องการบีบประสิทธิภาพให้ได้มากที่สุดเท่าที่จะเป็นไปได้ดังนั้นฉันจึงทำการทดลองเกี่ยวกับการเพิ่มประสิทธิภาพและการทดสอบโหลด

ฉันใช้ Blitz.io เพื่อทำการทดสอบการโหลดโดยการรับไฟล์ข้อความเล็ก ๆ แบบคงที่และทำงานเป็นปัญหาแปลกที่เซิร์ฟเวอร์ดูเหมือนจะส่ง TCP รีเซ็ตเมื่อจำนวนการเชื่อมต่อพร้อมกันถึง 2000 ประมาณฉันรู้ว่านี่เป็นสิ่งที่ดีมาก จำนวนมาก แต่จากการใช้ htop เซิร์ฟเวอร์ยังคงมีเวลาเหลือเฟือในการใช้งาน CPU และหน่วยความจำดังนั้นฉันจึงต้องการหาแหล่งที่มาของปัญหานี้เพื่อดูว่าฉันสามารถผลักดันมันต่อไปได้อีกหรือไม่

ฉันใช้ Ubuntu 14.04 LTS (64 บิต) ใน 2GB Linode VPS

ฉันไม่มีชื่อเสียงพอที่จะโพสต์กราฟนี้โดยตรงดังนั้นนี่คือลิงก์ไปยังกราฟ Blitz.io:

ป้อนคำอธิบายรูปภาพที่นี่

นี่คือสิ่งที่ฉันได้ลองทำและค้นหาแหล่งที่มาของปัญหา:

  • ค่าการworker_rlimit_nofileกำหนดค่าnginx ถูกตั้งค่าเป็น 8192
  • ได้nofileตั้งค่าเป็น 64000 สำหรับทั้งขีด จำกัด ฮาร์ดและซอฟต์rootและwww-dataผู้ใช้ (สิ่งที่ nginx ทำงานเป็น)/etc/security/limits.conf
  • ไม่มีข้อบ่งชี้ว่ามีสิ่งผิดปกติเกิดขึ้น/var/log/nginx.d/error.log(โดยทั่วไปหากคุณพบข้อ จำกัด ของตัวอธิบายไฟล์ nginx จะพิมพ์ข้อความแสดงข้อผิดพลาดโดยบอกว่าเป็นอย่างนั้น)

  • ฉันมีการตั้งค่า ufw แต่ไม่มีการ จำกัด อัตรากฎ บันทึก ufw ระบุว่าไม่มีอะไรถูกบล็อกและฉันได้ลองปิดการใช้งาน ufw ด้วยผลลัพธ์เดียวกัน

  • ไม่มีข้อผิดพลาดที่บ่งบอกถึง /var/log/kern.log
  • ไม่มีข้อผิดพลาดที่บ่งบอกถึง /var/log/syslog
  • ฉันได้เพิ่มค่าต่อไปนี้/etc/sysctl.confและโหลดsysctl -pโดยไม่มีผลกระทบ:

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

ความคิดใด ๆ

แก้ไข:ฉันทำการทดสอบใหม่โดยเพิ่มการเชื่อมต่อไปยัง 3000 บนไฟล์ขนาดเล็กมาก (3 ไบต์เท่านั้น) นี่คือกราฟ Blitz.io:

กราฟ Blitz.io

อีกครั้งตาม Blitz ข้อผิดพลาดเหล่านี้ทั้งหมดคือข้อผิดพลาด "การเชื่อมต่อ TCP รีเซ็ต"

นี่คือกราฟแบนด์ Linode โปรดทราบว่านี่เป็นค่าเฉลี่ย 5 นาทีดังนั้นจึงผ่านการกรองความถี่ต่ำเล็กน้อย (แบนด์วิดท์แบบทันทีอาจสูงกว่านี้มาก) แต่ถึงอย่างนี้ก็ไม่มีอะไร:

ป้อนคำอธิบายรูปภาพที่นี่

CPU:

ป้อนคำอธิบายรูปภาพที่นี่

I / O:

ป้อนคำอธิบายรูปภาพที่นี่

นี่คือhtopใกล้สิ้นสุดการทดสอบ: htop

ฉันยังได้จับภาพปริมาณการใช้ tcpdump ในการทดสอบที่แตกต่างกัน (แต่คล้ายกัน) เริ่มจับภาพเมื่อข้อผิดพลาดเริ่มเข้ามา: sudo tcpdump -nSi eth0 -w /tmp/loadtest.pcap -s0 port 80

นี่คือไฟล์หากใครต้องการดู (~ 20MB): https://drive.google.com/file/d/0B1NXWZBKQN6ETmg2SEFOZUsxV28/view?usp=sharing

นี่คือกราฟแบนด์วิดธ์จาก Wireshark:

ป้อนคำอธิบายรูปภาพที่นี่ (สายเป็นแพ็คเก็ตทั้งหมดแถบสีฟ้าเป็นข้อผิดพลาด TCP)

จากการตีความการดักจับของฉัน (และฉันไม่มีผู้เชี่ยวชาญ) ดูเหมือนว่าค่าสถานะ TCP RST มาจากแหล่งทดสอบโหลดไม่ใช่เซิร์ฟเวอร์ ดังนั้นสมมติว่ามีบางอย่างไม่ผิดปกติกับบริการทดสอบโหลดมันปลอดภัยหรือไม่ที่จะคิดว่านี่เป็นผลของการจัดการเครือข่ายหรือการลด DDOS ระหว่างบริการทดสอบโหลดและเซิร์ฟเวอร์ของฉัน

ขอบคุณ!


ผู้ให้บริการของคุณกำลังทำ DDoS อยู่บ้างไหม? สิ่งนี้อาจรบกวนการทดสอบของคุณ
Michael Hampton

@MichaelHampton ฉันค่อนข้างแน่ใจว่า Linode ไม่ทำเช่นนั้น
EEAA

คุณสามารถโพสต์กราฟเครือข่ายจากแผงควบคุม Linode ได้หรือไม่ การทดสอบนี้ใช้แบนด์วิดท์เท่าใด
EEAA

ฉันทำการตรวจสอบอีกเล็กน้อยและอัปเดตโพสต์ต้นฉบับด้วยข้อมูลเพิ่มเติมมากมาย ฉันยังยืนยันกับ Linode ว่าพวกเขาไม่ได้ทำการลดผลกระทบ DDOS ถึงแม้ว่านี่ไม่ได้หมายความว่าผู้ให้บริการเครือข่ายระหว่างบริการทดสอบโหลดและ Linode ไม่ได้ทำอะไรเลย ขอบคุณ!
Erik Swan

1
มีเหตุผลที่คุณตั้งค่าnet.core.netdev_max_backlogได้ถึง 2000 เท่านั้นหรือไม่ ตัวอย่างที่ฉันเห็นมีลำดับความสำคัญสูงกว่าสำหรับการเชื่อมต่อกิกะบิต (และ 10Gig)
Moshe Katz

คำตอบ:


1

อาจมีแหล่งที่มาจำนวนมากของการเชื่อมต่อที่รีเซ็ต เครื่องทดสอบโหลดอาจออกจากพอร์ตชั่วคราวที่พร้อมใช้งานเพื่อเริ่มต้นการเชื่อมต่ออุปกรณ์ระหว่างทาง (เช่นไฟร์วอลล์ที่ทำ NAT) อาจมีพูล NAT ของมันหมดและไม่สามารถระบุพอร์ตต้นทางสำหรับการเชื่อมต่อได้ ตัวโหลดบาลานซ์หรือไฟร์วอลล์ในตอนท้ายของคุณอาจถึงขีด จำกัด การเชื่อมต่อหรือไม่ และถ้าทำ NAT ต้นทางบนทราฟฟิกขาเข้านั่นอาจทำให้พอร์ตอ่อนลง

หนึ่งจะต้องมีไฟล์ pcap จากปลายทั้งสอง สิ่งที่คุณต้องการค้นหาคือหากความพยายามในการเชื่อมต่อถูกส่งไป แต่ไม่เคยไปถึงเซิร์ฟเวอร์ แต่ยังคงปรากฏขึ้นราวกับว่ามันถูกรีเซ็ตโดยเซิร์ฟเวอร์ หากเป็นเช่นนั้นมีบางสิ่งในสายต้องรีเซ็ตการเชื่อมต่อ NAT pool exhaustion เป็นสาเหตุทั่วไปของปัญหาเหล่านี้

นอกจากนี้ netstat -st อาจให้ข้อมูลเพิ่มเติมแก่คุณ


1

ความคิดบางอย่างที่ควรลองโดยพิจารณาจากประสบการณ์การปรับจูนที่คล้ายกันของฉัน ด้วยการอ้างอิง:

คุณบอกว่ามันเป็นไฟล์ข้อความคงที่ ในกรณีที่มีการประมวลผลอัปสตรีมเกิดขึ้นซ็อกเก็ตโดเมนจะปรับปรุงปริมาณงาน TCP ผ่านการเชื่อมต่อที่ใช้พอร์ต TC:

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

โดยไม่คำนึงถึงการเลิกต้นน้ำ:

เปิดใช้งาน multi_accept และ tcp_nodelay: http://tweaked.io/guide/nginx/

ปิดใช้งาน TCP Slow Start: /programming/17015611/disable-tcp-slow-start http://www.cdnplanet.com/blog/tune-tcp-initcwnd-for-optimum-performance/

ปรับแต่งหน้าต่างความแออัดของ TCP (initcwnd): http://www.nateware.com/linux-network-tuning-for-2013.html


1

ในการตั้งค่าจำนวนไฟล์ที่เปิดสูงสุด (หากเป็นสาเหตุของปัญหาของคุณ) คุณต้องเพิ่ม "fs.file-max = 64000" เป็น /etc/sysctl.conf


0

โปรดดูจำนวนพอร์ตที่อยู่ในTIME_WAITสถานะใช้คำสั่งnetstat -patunl| grep TIME | wc -lและเปลี่ยนnet.ipv4.tcp_tw_reuseเป็น 1


ฉันจะดูจำนวนพอร์ตที่อยู่ในTIME_WAITสถานะอย่างไร
Erik Swan

การใช้หรือnetstat ssฉันอัพเดตคำตอบของฉันด้วยคำสั่งทั้งหมด!
fgbreel

ฉันได้ทดสอบอีกครั้งและwatch -n 1 'sudo netstat -patunl | grep TIME | wc -l'ส่งกลับ 0 ตลอดการทดสอบทั้งหมด ฉันเชื่อมั่นว่าการรีเซ็ตจะมาจากการลด DDOS ของใครบางคนระหว่างตัวทดสอบโหลดและเซิร์ฟเวอร์ของฉันจากการวิเคราะห์ไฟล์ PCAP ที่ฉันโพสต์ไว้ด้านบน แต่ถ้ามีคนยืนยันได้ว่ามันยอดเยี่ยมมาก!
Erik Swan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.