ฉันกำลังออกแบบระบบเพื่อจัดการการเชื่อมต่อ 10,000 TCP ต่อวินาทีฉันจะพบปัญหาใดบ้าง


18

ฉันมีกล่อง 8-core ที่ค่อนข้างใหม่ที่ใช้ CentOS ฉันต้องการพัฒนาเซิร์ฟเวอร์สถิติที่ใช้ TCP มันง่ายมากยอมรับการเชื่อมต่อ TCP เพิ่มตัวนับและปิดการเชื่อมต่อ การจับต้องทำอย่างน้อย 10k ร้องขอต่อวินาที ฉันสงสัยว่าซีพียู / หน่วยความจำจะไม่มีปัญหา แต่ฉันกังวลมากขึ้นเกี่ยวกับข้อ จำกัด ที่ประดิษฐ์ขึ้น (เช่นการเชื่อมต่อแบบเปิดครึ่ง) ที่ฉันอาจต้องกำหนดค่าบนเซิร์ฟเวอร์ของฉันเพื่อให้รองรับไดรฟ์ข้อมูลประเภทนี้ เป็นไปได้ไหม ฉันควรทราบถึงการตั้งค่าใดบ้าง NIC ของฉันจะไม่สามารถจัดการได้หรือไม่


1
ตรวจสอบให้แน่ใจว่าไม่ได้วางไข่เธรดสำหรับการเชื่อมต่อที่เข้ามาทุกครั้งมันจะฆ่าประสิทธิภาพการทำงาน

1
+1 สำหรับการรายงานผลสุดท้ายของคุณที่นี่ :)
agsamek

คำตอบ:


17

เรื่องนี้เป็นที่รู้จักกันทั่วไปว่าเป็นปัญหาc10k หน้านั้นมีข้อมูลที่ดีมากมายเกี่ยวกับปัญหาที่คุณจะพบ


ใช่ลิงค์ดี!
sybreon

1
ฉันคาดหวังว่าจะพบปัญหามากกว่า / แตกต่างจากที่กล่าวไว้ในหน้า c10k การสร้างและปิดการเชื่อมต่อ 10k ต่อวินาทีนั้นแตกต่างจากการเปิดการเชื่อมต่อ 10k การเชื่อมต่อที่อยู่ในสถานะ TIME_WAIT จะเป็นหนึ่งการเชื่อมโยงขีด จำกัด backlog สำหรับซ็อกเก็ตการฟังอาจเป็นอีกหนึ่ง และฉันจะไม่แปลกใจถ้ากรณีการใช้งานนั้นยังไม่ได้รับการทำโปรไฟล์ / การปรับให้เหมาะสมในเคอร์เนลโค้ดมากกว่ากรณีการเชื่อมต่อแบบเปิดขนาด 10k ทั่วไป
cmeerw

2

คุณควรจะทำได้ [แม้ว่ามันอาจเป็นความคิดที่ไม่ดี]

ในเรซิน appserv ฉันสามารถรับ ~ 5k req / วินาทีใน quad core 2.6ghz xeon คำร้องขอให้เรียกใช้เซิร์ฟเล็ตแบบง่ายที่อ่าน 1 แถวจาก mysql และส่งการตอบสนอง xml ที่น้อยมาก

ทำแบบทดสอบด้วย

ab -n 10000 -c 16 http://some/url/

ผลการทดสอบ:

Concurrency Level:      16
Time taken for tests:   1.904 seconds
Complete requests:      10000
Failed requests:        0
Write errors:           0
Total transferred:      3190000 bytes
HTML transferred:       1850000 bytes
Requests per second:    5252.96 [#/sec] (mean)
Time per request:       3.046 [ms] (mean)
Time per request:       0.190 [ms] (mean, across all concurrent requests)
Transfer rate:          1636.42 [Kbytes/sec] received

แต่ฉันคิดว่าคุณจะทำได้ดีกว่ามากโดยใช้โปรแกรม c อย่างง่ายแน่นอนโดยไม่ต้องวางไข่เธรดใหม่สำหรับแต่ละคำขอ ลิงก์จาก Greg Hewgill ควรให้ความคิดที่ดีแก่คุณ

แม้ในระหว่างการทดสอบเป็นเวลานานฉันไม่ได้รับปัญหาใด ๆ กับการเชื่อมต่อ [ซ็อกเก็ตครึ่งเปิดที่กล่าวถึง]; ทดสอบการทำงานระหว่างกล่องลินุกซ์สองกล่องที่เชื่อมต่อผ่านกิกะบิตอีเธอร์เน็ต


การเชื่อมต่อของคุณถูกปิดหลังจากตอบสนองทุกอย่างเช่น OPs หรือไม่ ab กำลังส่งการเชื่อมต่อ: ปิดส่วนหัวหรือไม่
เนท

1
@Nate it http 1.0 - การเชื่อมต่อเดียวสำหรับทุกคำขอ HTTP เดียว
pQd

1

คุณอาจสนใจขีด จำกัด ของเคอร์เนล Linux ที่ฉันใช้ขณะทดสอบ Apache ในกรณีของฉันเคอร์เนลสร้างข้อความแสดงข้อผิดพลาดที่มีประโยชน์ดังนั้นคำแนะนำของฉันคือเขียนโปรแกรมของคุณและถ้าคุณดูเหมือนจะมีขีด จำกัด ให้ใส่ใจกับบันทึกของเคอร์เนล


0

ฉันจะใช้ UDP แทน TCP ถ้าเป็นไปได้ ควรมีน้ำหนักเบาและปรับขนาดได้ดีกว่า


ฉันเห็นด้วย. UDP จะมีน้ำหนักเบากว่ามาก
fpmurphy

1
UDP มีข้อบกพร่องเช่นผู้ส่งและการตรวจสอบการส่งมอบดังนั้นควรพิจารณาก่อนใช้ UDP ในการผลิต
SaveTheRbtz

0

Nic ของคุณควรจะสามารถจัดการได้ แต่ฉันถามว่าการออกแบบการเชื่อมต่อ TCP ใหม่ 10k ต่อวินาที; หากคุณกำลังสร้าง / ทำลายการเชื่อมต่อที่รวดเร็วคุณควร a) เปิดการเชื่อมต่อไว้นานขึ้นหรือ b) ใช้ UDP แทน

ในกรณีที่คุณมีลูกค้า 1 ล้านคนที่ต้องทำแบบสอบถามเป็นครั้งคราว แต่ที่โหลดจะกด 10k ต่อวินาที UDP น่าจะเป็นทางเลือกที่ดีกว่า

ในกรณีที่คุณมีลูกค้าเพียง 10k เท่านั้นที่ต้องทำแบบสอบถามทุกวินาทีพวกเขาสามารถเปิดการเชื่อมต่อที่มีอยู่แล้วนำมาใช้ใหม่ นี่จะดีกว่าระบบปฏิบัติการและให้เวลาในการตอบสนองน้อยลงเนื่องจากไม่ต้องจับมือกันใหม่ทุกครั้ง

ในกรณีที่คุณมีคำขอ 10k ต่อวินาทีฉันคิดว่าคุณมี load balancer front-end อยู่แล้วดังนั้นคุณจะต้องทดสอบด้วยเช่นกัน

(NB: ฉันคิดว่านี่เป็นของ Stack Overflow)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.