จำนวนการเชื่อมต่อสูงสุดได้รับผลกระทบจากข้อ จำกัด บางประการทั้งฝั่งไคลเอ็นต์และเซิร์ฟเวอร์แม้ว่าจะต่างกันเล็กน้อย
บนฝั่งไคลเอ็นต์:
เพิ่มช่วงพอร์ต ephermal และลดtcp_fin_timeout
เพื่อหาค่าเริ่มต้น:
sysctl net.ipv4.ip_local_port_range
sysctl net.ipv4.tcp_fin_timeout
ช่วงพอร์ต ephermal กำหนดจำนวนซ็อกเก็ตขาออกสูงสุดที่โฮสต์สามารถสร้างได้จากที่อยู่ IP เฉพาะ การfin_timeout
กำหนดเวลาต่ำสุดซ็อกเก็ตเหล่านี้จะยังคงอยู่ในTIME_WAIT
สถานะ (ไม่สามารถใช้งานได้หลังจากใช้ครั้งเดียว) ค่าเริ่มต้นของระบบปกติคือ:
net.ipv4.ip_local_port_range = 32768 61000
net.ipv4.tcp_fin_timeout = 60
โดยทั่วไปหมายความว่าระบบของคุณไม่สามารถรับประกันได้มากกว่า(61000 - 32768) / 60 = 470
ซ็อกเก็ตต่อวินาทีอย่างสม่ำเสมอ port_range
ถ้าคุณไม่ได้มีความสุขกับการที่คุณสามารถเริ่มต้นด้วยการเพิ่ม การตั้งค่าช่วง15000 61000
เป็นเรื่องธรรมดาในทุกวันนี้ fin_timeout
นอกจากนี้คุณยังสามารถเพิ่มความพร้อมโดยการลด สมมติว่าคุณทำทั้งสองอย่างคุณควรเห็นการเชื่อมต่อขาออกมากกว่า 1,500 ครั้งต่อวินาทีพร้อมมากขึ้น
วิธีเปลี่ยนค่า :
sysctl net.ipv4.ip_local_port_range="15000 61000"
sysctl net.ipv4.tcp_fin_timeout=30
ไม่ควรตีความข้างต้นเป็นปัจจัยที่มีผลต่อความสามารถของระบบในการทำการเชื่อมต่อขาออกต่อวินาที แต่ปัจจัยเหล่านี้ส่งผลกระทบต่อความสามารถของระบบในการจัดการการเชื่อมต่อพร้อมกันในลักษณะที่ยั่งยืนสำหรับ "กิจกรรม" เป็นระยะเวลานาน
ค่าเริ่มต้น Sysctl ในกล่อง Linux ทั่วไปสำหรับtcp_tw_recycle
& tcp_tw_reuse
จะเป็น
net.ipv4.tcp_tw_recycle=0
net.ipv4.tcp_tw_reuse=0
สิ่งเหล่านี้ไม่อนุญาตให้มีการเชื่อมต่อจากซ็อกเก็ต "ใช้แล้ว" (อยู่ในสถานะรอ) และบังคับให้ซ็อกเก็ตใช้งานจนครบtime_wait
วงจร ฉันแนะนำการตั้งค่า:
sysctl net.ipv4.tcp_tw_recycle=1
sysctl net.ipv4.tcp_tw_reuse=1
วิธีนี้ช่วยให้สามารถหมุนซ็อกเก็ตได้อย่างรวดเร็วtime_wait
และนำกลับมาใช้อีกครั้ง แต่ก่อนที่คุณจะทำการเปลี่ยนแปลงตรวจสอบให้แน่ใจว่าสิ่งนี้ไม่ขัดแย้งกับโปรโตคอลที่คุณจะใช้สำหรับแอปพลิเคชันที่ต้องการซ็อกเก็ตเหล่านี้ อย่าลืมอ่านโพสต์"การรับมือกับ TCP TIME-WAIT" จาก Vincent Bernatเพื่อทำความเข้าใจกับความหมาย net.ipv4.tcp_tw_recycle
ตัวเลือกที่เป็นปัญหามากสำหรับเซิร์ฟเวอร์สาธารณะมันจะไม่จัดการการเชื่อมต่อจากคอมพิวเตอร์สองเครื่องที่แตกต่างกันที่อยู่เบื้องหลังอุปกรณ์ NAT เดียวกันซึ่งเป็นปัญหาที่ยากที่จะตรวจสอบและรอคอยที่จะกัดคุณ โปรดทราบว่าnet.ipv4.tcp_tw_recycle
ถูกลบออกจาก Linux 4.12
ทางด้านเซิร์ฟเวอร์:net.core.somaxconn
ค่ามีบทบาทสำคัญ มัน จำกัด จำนวนสูงสุดของการร้องขอเข้าคิวเพื่อฟังซ็อกเก็ต หากคุณมั่นใจในความสามารถของแอปพลิเคชันเซิร์ฟเวอร์ของคุณให้ชนจากค่าเริ่มต้น 128 เป็นอย่าง 128 ถึง 1024 ตอนนี้คุณสามารถใช้ประโยชน์จากการเพิ่มขึ้นนี้ได้โดยการแก้ไขตัวแปรไฟล์เสียงค้างในการฟังการเรียกใช้แอปพลิเคชันของคุณ
sysctl net.core.somaxconn=1024
txqueuelen
พารามิเตอร์ของการ์ดอีเธอร์เน็ตของคุณยังมีบทบาทในการเล่น ค่าเริ่มต้นคือ 1,000 ดังนั้นชนพวกเขามากถึง 5,000 หรือมากกว่านั้นหากระบบของคุณสามารถจัดการกับมันได้
ifconfig eth0 txqueuelen 5000
echo "/sbin/ifconfig eth0 txqueuelen 5000" >> /etc/rc.local
ในทำนองเดียวกันชนขึ้นค่าสำหรับและnet.core.netdev_max_backlog
net.ipv4.tcp_max_syn_backlog
ค่าเริ่มต้นของพวกเขาคือ 1,000 และ 1024 ตามลำดับ
sysctl net.core.netdev_max_backlog=2000
sysctl net.ipv4.tcp_max_syn_backlog=2048
ตอนนี้อย่าลืมเริ่มต้นทั้งแอพพลิเคชั่นไคลเอนต์และเซิร์ฟเวอร์โดยเพิ่ม FD ulimts ในเชลล์
นอกจากเทคนิคหนึ่งที่นิยมใช้โดยโปรแกรมเมอร์คือการลดจำนวนการเรียกใช้การเขียน tcp การตั้งค่าของฉันเองคือการใช้บัฟเฟอร์ที่ฉันผลักดันข้อมูลที่ฉันต้องการส่งไปยังลูกค้าแล้วที่จุดที่เหมาะสมฉันจะเขียนข้อมูลบัฟเฟอร์ลงในซ็อกเก็ตที่เกิดขึ้นจริง เทคนิคนี้ช่วยให้ฉันใช้แพ็กเก็ตข้อมูลขนาดใหญ่ลดการกระจายตัวลดการใช้งาน CPU ของฉันทั้งในพื้นที่ของผู้ใช้และระดับเคอร์เนล