พารามิเตอร์เคอร์เนลหรือการตั้งค่าอื่นใดควบคุมจำนวนสูงสุดของซ็อกเก็ต TCP ที่สามารถเปิดได้บนเซิร์ฟเวอร์ Linux อะไรคือข้อดีของการอนุญาตให้มีการเชื่อมต่อมากขึ้น?
ฉันสังเกตในขณะที่โหลดทดสอบเซิร์ฟเวอร์ Apache ด้วยabว่ามันค่อนข้างง่ายที่จะเปิดการเชื่อมต่อสูงสุดบนเซิร์ฟเวอร์ หากคุณไม่ใช้ตัวเลือก ab's -k ซึ่งอนุญาตให้นำการเชื่อมต่อกลับมาใช้ใหม่และให้ส่งคำขอมากกว่า 10,000 คำขอจากนั้น Apache จะให้บริการคำขอ 11,000 รายการแรกแล้วหยุดพักเป็นเวลา 60 วินาที ดูที่เอาต์พุต netstat แสดงการเชื่อมต่อ 11,000 การเชื่อมต่อในสถานะ TIME_WAIT เห็นได้ชัดว่านี่เป็นเรื่องปกติ การเชื่อมต่อจะถูกเก็บไว้เปิดเริ่มต้นของ 60 วินาทีแม้หลังจากที่ลูกค้าจะทำกับพวกเขาสำหรับเหตุผล TCP ความน่าเชื่อถือ
ดูเหมือนว่านี่จะเป็นวิธีที่ง่ายในการใช้เซิร์ฟเวอร์ DoS และฉันสงสัยว่าการปรับจูนและการป้องกันตามปกติเป็นอย่างไร
นี่คือผลการทดสอบของฉัน:
# ab -c 5 -n 50000 http://localhost/
This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright 2006 The Apache Software Foundation, http://www.apache.org/
Benchmarking localhost (be patient)
Completed 5000 requests
Completed 10000 requests
apr_poll: The timeout specified has expired (70007)
Total of 11655 requests completed
นี่คือคำสั่ง netstat ที่ฉันรันในระหว่างการทดสอบ:
# netstat --inet -p | grep "localhost:www" | sed -e 's/ \+/ /g' | cut -d' ' -f 1-4,6-7 | sort | uniq -c
11651 tcp 0 0 localhost:www TIME_WAIT -
1 tcp 0 1 localhost:44423 SYN_SENT 7831/ab
1 tcp 0 1 localhost:44424 SYN_SENT 7831/ab
1 tcp 0 1 localhost:44425 SYN_SENT 7831/ab
1 tcp 0 1 localhost:44426 SYN_SENT 7831/ab
1 tcp 0 1 localhost:44428 SYN_SENT 7831/ab