ฉันมีการติดตั้ง 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 ข้อผิดพลาดเหล่านี้ทั้งหมดคือข้อผิดพลาด "การเชื่อมต่อ TCP รีเซ็ต"
นี่คือกราฟแบนด์ Linode โปรดทราบว่านี่เป็นค่าเฉลี่ย 5 นาทีดังนั้นจึงผ่านการกรองความถี่ต่ำเล็กน้อย (แบนด์วิดท์แบบทันทีอาจสูงกว่านี้มาก) แต่ถึงอย่างนี้ก็ไม่มีอะไร:
CPU:
I / O:
นี่คือ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 ระหว่างบริการทดสอบโหลดและเซิร์ฟเวอร์ของฉัน
ขอบคุณ!
net.core.netdev_max_backlog
ได้ถึง 2000 เท่านั้นหรือไม่ ตัวอย่างที่ฉันเห็นมีลำดับความสำคัญสูงกว่าสำหรับการเชื่อมต่อกิกะบิต (และ 10Gig)