การตั้งค่า TCP latency ต่ำบน Ubuntu


10

มีเซิร์ฟเวอร์สำหรับการวัดที่รันบน Ubuntu ในแล็บของฉัน และมีโปรแกรม C ซึ่งรับข้อมูลผ่านการเชื่อมต่อ TCP และควรส่งการตอบกลับโดยเร็วที่สุด

องค์ประกอบ

  • ซีพียู: โปรเซสเซอร์ 2 ตัว x 4 คอร์ - Intel (R) Xeon (R) CPU E5345 @ 2.33GHz
  • RAM: 12 GB
  • NIC: Intel Corporation 80003ES2LAN Gigabit Ethernet Controller / 82546EB Gigabit Ethernet Controller
  • สวิตช์เครือข่าย: Cisco Catalyst 2960
  • ข้อมูล: บล็อกข้อมูลมาประมาณ แต่ละ 10 มิลลิวินาที ขนาดบล็อกข้อมูลมีขนาดประมาณ 1,000 ไบต์

เวลาแฝงของเครือข่ายเมื่อรับแพ็กเก็ตมีความสำคัญมาก (มีความสำคัญนับสิบไมโครวินาที) ฉันปรับโปรแกรมให้มีประสิทธิภาพสูงสุด แต่ฉันไม่มีประสบการณ์ในการปรับแต่ง Ubuntu

สิ่งที่สามารถกำหนดค่าใน Ubuntu เพื่อลดความล่าช้าในการประมวลผล / ส่งแพ็กเก็ต


ใช่ฉันต้องการทราบยี่ห้อ / รุ่นของเซิร์ฟเวอร์
ewwhite

คุณควรขุดลึกลงไป อ่านบางสิ่งเกี่ยวกับการเพิ่มประสิทธิภาพเคอร์เนลสำหรับการซื้อขายความถี่สูง ขายกระดาษของซิสโก้: cisco.com/c/dam/en/us/products/collateral/switch/ เพื่อให้ได้การ์ด PCI-E ที่ดีทั้งสองด้านจะช่วยประหยัดได้บ้าง เป็นไปได้มากที่สุด (ขึ้นอยู่กับระยะเวลาที่คุณต้องการใช้กับเรื่องนี้) คุณจะสร้างเคอร์เนลอย่างน้อยที่สุดด้วยการตั้งค่าที่แตกต่างกันเอาสิ่งต่างๆที่อูบุนตูต้องการออก แต่คุณไม่ต้องการ ดังนั้นเมื่อ ewwhite เขียนไว้ในคอมเม้นต์อูบุนตูอาจไม่เหมาะกับการตั้งค่าที่ต่ำที่สุด
Dennis Nolte

ด้วยรายการฮาร์ดแวร์เป็นอุปกรณ์ในยุค 2008 (Intel 5300-series CPUs) ก่อนหน้านี้ไม่มีการเปลี่ยนแปลงฮาร์ดแวร์ความหน่วงต่ำพิเศษมากเกินไป ฉันต้องการตั้งค่า BIOS ระบบให้ทำงานในโหมดประสิทธิภาพสูงและปิดการใช้งาน CPU C-States
ewwhite

@ ขาวใช่คุณพูดถูกเกี่ยวกับอุปกรณ์ยุค 2008 ฉันจะลองคำแนะนำของคุณ ขอบคุณ!
Alex V

ความสามารถในการปรับแต่งซอฟต์แวร์นี้สำหรับ TCP_NODELAY หรือไม่?
แมตต์

คำตอบ:


10

สุจริตฉันจะไม่ใช้ Ubuntu สำหรับสิ่งนี้ ... แต่มีตัวเลือกที่สามารถนำไปใช้กับตัวแปร Linux ใด ๆ

คุณจะต้องการเพิ่มบัฟเฟอร์สแต็กเครือข่ายของคุณ:

net.core.rmem_default = 10000000
net.core.wmem_default = 10000000
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216

หากแอปพลิเคชันกำลังเขียนลงดิสก์อาจจำเป็นต้องเปลี่ยนกำหนดการ / ลิฟท์ (เช่นdeadlineลิฟต์)

ที่ระดับเซิร์ฟเวอร์คุณสามารถปรับเปลี่ยนการควบคุม CPU และพลังงานและการจัดการความถี่ CPU (P-States, C-States)

ที่ระดับ OS คุณสามารถเปลี่ยนลำดับความสำคัญตามเวลาจริงของแอปพลิเคชันของคุณ ( chrt), ปรับแต่งเพื่อลดการขัดจังหวะ, ตรึงมันไว้ที่ CPU หรือกลุ่มของ CPU ( taskset) และหยุดบริการที่ไม่จำเป็นหรือ daemons ใด ๆ

นอกจากนี้คุณยังสามารถดูคำแนะนำได้ที่: วิธีแก้ปัญหาเวลาแฝงระหว่าง 2 โฮสต์ Linux

เป็นการยากที่จะเจาะจงมากขึ้นโดยไม่ทราบว่ามีฮาร์ดแวร์หรืออุปกรณ์เครือข่ายที่เกี่ยวข้อง


3
นี่ไม่ใช่สถานที่ที่เหมาะสมสำหรับการอภิปรายทางศาสนา พาไปที่อื่นเช่นแชท
Michael Hampton

1
: @MichaelHampton มีการเชื่อมโยงที่น่าสนใจในการอภิปรายที่เกี่ยวข้องกับคำถามที่มีหมวกสีแดงเรียลไทม์คู่มือการปรับแต่ง
Alex V

6

หากคุณไปสู่เส้นทางที่มีประสิทธิภาพสูงโดยทั่วไปคุณจะต้องเรียกใช้กระบวนการอื่น ๆ (ตามกำหนดเวลา) น้อยที่สุดเท่าที่จะเป็นไปได้เนื่องจากจะรบกวนการทำงานของแอปพลิเคชันของคุณ

Linux เช่นเดียวกับระบบปฏิบัติการ UNIX แบบคลาสสิกได้รับการออกแบบมาเพื่อรันแอพพลิเคชั่นหลายตัวพร้อมกันอย่างยุติธรรมและพยายามป้องกันความอดอยากของทรัพยากรและคุณจะมุ่งไปที่สิ่งที่ตรงกันข้าม ขั้นตอนง่าย ๆ ในระดับระบบปฏิบัติการกำลังเปลี่ยนระดับที่ดีและลำดับความสำคัญตามเวลาจริงของแอปพลิเคชันของคุณเปลี่ยนตัวกำหนดตารางเวลาหรือไปใช้เคอร์เนลตามเวลาจริง

โดยทั่วไปแล้ว TCP / IP จะถูกปรับเพื่อป้องกันการเชื่อมต่อที่ลดลงและใช้แบนด์วิดท์ให้มีประสิทธิภาพ เพื่อให้ได้ค่าเวลาแฝงต่ำสุดที่เป็นไปได้จากการเชื่อมโยงที่รวดเร็วมากแทนที่จะใช้แบนด์วิดท์สูงสุดที่เป็นไปได้จากการเชื่อมต่อที่มีการเชื่อมโยงกลางบางข้อ จำกัด มากขึ้นคุณจะต้องปรับจูนเครือข่าย

 sysctl -a 

จะแสดงโฮสต์ของการตั้งค่าเมล็ดที่คุณสามารถปรับได้ การตั้งค่าขึ้นอยู่กับว่าคุณกำลังใช้ IPv4 หรือ IPv6 หรือไม่และสิ่งที่คุณทำในแอปพลิเคชันของคุณ แต่อาจเป็นที่สนใจ:

  • net.ipv4.tcp_window_scaling=1 RFC 1323 - รองรับขนาดหน้าต่าง IPV4 TCP ที่ใหญ่กว่า 64K - โดยทั่วไปจำเป็นสำหรับเครือข่ายแบนด์วิธสูง
  • net.ipv4.tcp_reordering=3 จำนวนครั้งสูงสุดที่แพ็คเก็ต IPV4 สามารถจัดลำดับใหม่ในสตรีมแพ็คเก็ต TCP โดยไม่มี TCP สมมติว่าแพ็กเก็ตสูญหายและกำลังเริ่มต้นช้า
  • net.ipv4.tcp_low_latency=1ตั้งใจที่จะให้ความสำคัญกับเวลาแฝงต่ำผ่านปริมาณงานสูง setting = 1 ปิดใช้งานการประมวลผล prequeue IPV4 tcp
  • net.ipv4.tcp_sack=0 การตั้งค่าเป็น 1 เปิดใช้งานการตอบรับแบบเลือกได้สำหรับ IPV4 ซึ่งต้องการการเปิดใช้งาน tcp_timestamps และเพิ่มค่าใช้จ่ายของแพ็คเก็ตซึ่งคุณไม่ต้องการหากคุณไม่ได้สัมผัสกับ packetloss
  • net.ipv4.tcp_timestamps=0 แนะนำเฉพาะในกรณีที่ต้องการกระสอบ
  • net.ipv4.tcp_fastopen=1 เปิดใช้งานเพื่อส่งข้อมูลในการเปิดแพ็คเก็ต SYN

ส่วนใหญ่ถ้าไม่ใช่ทั้งหมดจะได้รับการบันทึกไว้ในแหล่งเคอร์เนลได้ดีขึ้น

คุณสามารถเรียนรู้โค้ดของซ็อกเก็ต TCP ดิบและโดยส่วนใหญ่ผ่านเคอร์เนล TCP / IP สแต็คทั้งหมด

บ่อยครั้งที่ระบบที่ได้รับการปรับแต่งสูงทำงานในเครือข่ายที่เชื่อถือได้และจะปิดไฟร์วอลล์ในเครื่อง (iptables)

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