เมื่อเร็ว ๆ นี้เรามีเซิร์ฟเวอร์ apache ที่ตอบสนองช้ามากเนื่องจากการเกิดน้ำท่วม SYN วิธีแก้ปัญหาสำหรับสิ่งนี้คือการเปิดใช้งาน tcp_syncookies ( net.ipv4.tcp_syncookies=1 in /etc/sysctl.conf
)
ฉันโพสต์คำถามเกี่ยวกับเรื่องนี้ที่นี่ถ้าคุณต้องการพื้นหลังเพิ่มเติม
หลังจากเปิดใช้งาน syncookies เราเริ่มเห็นข้อความต่อไปนี้ใน / var / log / ข้อความประมาณทุก 60 วินาที:
[84440.731929] possible SYN flooding on port 80. Sending cookies.
Vinko Vrsalovic แจ้งผมว่านี้หมายถึงค้าง SYN จะได้รับเต็มรูปแบบเพื่อผมยก tcp_max_syn_backlog เพื่อ 4096 ในบางจุดที่ผม tcp_synack_retries ยังลดลงถึง 3 (ลดลงจากเริ่มต้นของ 5) sysctl -w net.ipv4.tcp_synack_retries=3
โดยการออกและเสนอขาย หลังจากทำสิ่งนี้แล้วความถี่จะลดลงเมื่อช่วงเวลาของข้อความแตกต่างกันไปประมาณ 60 ถึง 180 วินาที
ต่อไปฉันออกsysctl -w net.ipv4.tcp_max_syn_backlog=65536
แต่ยังได้รับข้อความในบันทึก
ตลอดทั้งหมดนี้ฉันได้ดูจำนวนการเชื่อมต่อในสถานะ SYN_RECV (โดยเรียกใช้watch --interval=5 'netstat -tuna |grep "SYN_RECV"|wc -l'
) และมันไม่เคยสูงกว่าประมาณ 240 ซึ่งต่ำกว่าขนาดของงานในมือมาก แต่ฉันมีเซิร์ฟเวอร์ Red Hat ที่วนรอบ 512 (ขีด จำกัด บนเซิร์ฟเวอร์นี้คือค่าเริ่มต้นของ 1024)
มีการตั้งค่า tcp อื่น ๆ ที่จะ จำกัด ขนาดของ backlog หรือฉันเห่าต้นไม้ผิด? จำนวนการเชื่อมต่อ SYN_RECV ควรnetstat -tuna
สัมพันธ์กับขนาดของงานในมือหรือไม่?
ปรับปรุง
อย่างดีที่สุดที่ฉันสามารถบอกได้ว่าฉันกำลังเผชิญกับการเชื่อมต่อที่ถูกต้องที่นี่netstat -tuna|wc -l
วนเวียนอยู่รอบ ๆ 5,000 ฉันได้ทำการวิจัยในวันนี้และพบโพสต์นี้จากพนักงาน last.fm ซึ่งค่อนข้างมีประโยชน์
ฉันได้ค้นพบว่า tcp_max_syn_backlog ไม่มีผลเมื่อเปิดใช้งาน syncookies (ตามลิงค์นี้ )
ดังนั้นในขั้นตอนต่อไปฉันตั้งค่าต่อไปนี้ใน sysctl.conf:
net.ipv4.tcp_syn_retries = 3
# default=5
net.ipv4.tcp_synack_retries = 3
# default=5
net.ipv4.tcp_max_syn_backlog = 65536
# default=1024
net.core.wmem_max = 8388608
# default=124928
net.core.rmem_max = 8388608
# default=131071
net.core.somaxconn = 512
# default = 128
net.core.optmem_max = 81920
# default = 20480
จากนั้นผมก็ตั้งค่าของฉันทดสอบเวลาตอบสนองวิ่งและผู้พิการโดยsysctl -p
syncookiessysctl -w net.ipv4.tcp_syncookies=0
หลังจากทำเช่นนี้จำนวนการเชื่อมต่อในสถานะ SYN_RECV ยังคงอยู่ประมาณ 220-250 แต่การเชื่อมต่อเริ่มล่าช้าอีกครั้ง เมื่อฉันสังเกตเห็นความล่าช้าเหล่านี้ฉันเปิดใช้งาน syncookies อีกครั้งและความล่าช้าหยุดลง
ฉันเชื่อว่าสิ่งที่ฉันเห็นยังคงเป็นการปรับปรุงจากสถานะเริ่มต้นอย่างไรก็ตามคำขอบางอย่างยังคงล่าช้าซึ่งแย่กว่าการเปิดใช้งาน syncookies มาก ดังนั้นดูเหมือนว่าฉันเปิดใช้งานพวกเขาไว้จนกว่าเราจะได้เซิร์ฟเวอร์เพิ่มออนไลน์เพื่อรับมือกับภาระ ถึงกระนั้นฉันก็ไม่แน่ใจว่าฉันเห็นเหตุผลที่ถูกต้องในการปิดการใช้งานพวกเขาอีกครั้งเพราะพวกเขาจะส่ง (ชัดเจน) เมื่อบัฟเฟอร์ของเซิร์ฟเวอร์เต็ม
แต่การซิงค์ที่ค้างไว้นั้นไม่เต็มไปด้วยการเชื่อมต่อเพียง 250 การเชื่อมต่อในสถานะ SYN_RECV! เป็นไปได้หรือไม่ที่ข้อความการท่วม SYN เป็นปลาเฮอริ่งแดงและเป็นสิ่งอื่นที่ไม่ใช่ syn_backlog ที่กำลังเติม?
หากใครมีตัวเลือกการปรับแต่งอื่น ๆ ที่ฉันยังไม่ได้ลองฉันก็ยินดีที่จะลองพวกเขา แต่ฉันเริ่มสงสัยว่าการตั้งค่า syn_backlog ไม่ได้ถูกนำไปใช้อย่างเหมาะสมด้วยเหตุผลบางประการ