Score:2

ปรับแต่งเราเตอร์และเซิร์ฟเวอร์ Linux เพื่อประสิทธิภาพที่ดีขึ้น / แก้ปัญหาความเร็วการเชื่อมต่อ TCP เดียวที่ช้า

ธง au

ฉันมีสถาปัตยกรรมเครือข่ายที่ง่ายที่สุด/ทั่วไป

เว็บเซิร์ฟเวอร์ตั้งอยู่หลังเราเตอร์บนเครือข่ายท้องถิ่น เราเตอร์นี้ทำ iptables DNAT เพื่อให้สามารถส่งต่อพอร์ตไปยังเว็บเซิร์ฟเวอร์ได้

ดังนั้น ฉันสามารถดาวน์โหลดไฟล์จากเซิร์ฟเวอร์ 1 ไปยังคอมพิวเตอร์ของฉันผ่านทางอินเทอร์เน็ตได้

ป้อนคำอธิบายรูปภาพที่นี่

คำถามของฉัน

  1. การปรับเคอร์เนลที่เหมาะสมคืออะไรเพื่อให้แน่ใจว่าเราเตอร์ใช้ศักยภาพส่วนใหญ่ (สำหรับการเชื่อมต่อประมาณ 2,000 ครั้งและปริมาณงานสูงสุด) ฉันมีปัญหาในสีส้ม

  2. พารามิเตอร์เคอร์เนลดูดีบนเซิร์ฟเวอร์ 1 หรือไม่

  3. คุณช่วยอธิบายได้ไหมว่าทำไมฉันถึงได้รับเพียง 3mbps จากเซิร์ฟเวอร์ 1 ในขณะที่ CPU และ RAM ไม่ได้โอเวอร์โหลด คุณเห็นปัญหาอื่น ๆ นอกเหนือจากเคอร์เนล Linux, CPU และ RAM หรือไม่ คุณช่วยระบุปัญหาที่เป็นไปได้เหล่านี้เพื่อสำรวจได้ไหม อินเทอร์เฟซเครือข่าย 1gbps พอร์ต ฯลฯ 2x1.5ghz ARM ช้าสำหรับการกำหนดเส้นทางหรือไม่ รุ่น iptables?

ระบบปฏิบัติการและทรัพยากร

คอมพิวเตอร์ - แกน CPU Mac OS 8 x86, RAM ฟรี 16G/32G

เราเตอร์ - แกน CPU Linux DD-WRT 2 ARM, RAM ฟรี 270M / 512M

เซิร์ฟเวอร์ 1 - Linux Ubuntu 18.04 4 x86 CPU คอร์, 240M/32G ของ RAM ฟรี (500M เปลี่ยนเป็น SSD)

เซิร์ฟเวอร์ 2 - Linux Raspbian 1 ARM CPU core, 95M/512M ของ RAM ฟรี

มทร

ทุกที่ 1500

TXQUEUELEN

ทุกที่ 1,000

โปรโตคอล

ความเร็ว UDP นั้นใช้ได้

ความเร็ว TCP ได้รับผลกระทบ พอร์ตใดๆ

รุ่น Iptables

เราเตอร์ - 1.3.7

เซิร์ฟเวอร์ 1 - 1.8.4

เซิร์ฟเวอร์ 2 - 1.6.0

เวอร์ชันลินุกซ์

เราเตอร์ - 4.9.207

เซิร์ฟเวอร์ 1 - 5.4.0-67-ทั่วไป

เซิร์ฟเวอร์ 2 - 4.14.79+

ความเร็วในการเชื่อมโยงทางทฤษฎี

จากคอมพิวเตอร์ของฉันไปยังเราเตอร์ - 30mbps / 3.75 MB/s

จากเราเตอร์ถึงเว็บเซิร์ฟเวอร์ 1 - 1gbps

จากเราเตอร์ไปยังเว็บเซิร์ฟเวอร์ 2 - 1gbps

ความเร็วในการดาวน์โหลดจากเว็บเซิร์ฟเวอร์ (ไฟล์โฮสต์อยู่ใน RAM)

การทดสอบ 1: เซิร์ฟเวอร์ 2 -> เราเตอร์ = 800mbps

การทดสอบ 2: เซิร์ฟเวอร์ 2 -> คอมพิวเตอร์ = 30mbps

การทดสอบ 3: เซิร์ฟเวอร์ 1 -> เราเตอร์ = 800mbps

การทดสอบ 4: เซิร์ฟเวอร์ 1 -> คอมพิวเตอร์ที่ใช้ 15 การเชื่อมต่อ = 15mbps

การทดสอบ 5: เซิร์ฟเวอร์ 1 -> คอมพิวเตอร์ = 3mbps (ปัญหา!)

การใช้งาน CPU อยู่ที่ประมาณไม่กี่เปอร์เซ็นต์ในอุปกรณ์ใด ๆ ค่าเฉลี่ยโหลดของ CPU คือ 0.0x บนอุปกรณ์ทั้งหมด แต่เซิร์ฟเวอร์ 1 - มีค่าเฉลี่ยโหลด 4.6 เซิร์ฟเวอร์ 1 ยังรองรับการเชื่อมต่อประมาณ 500-1,000 รายการสำหรับสิ่งอื่นๆ นอกเหนือจากการทดสอบ แต่ที่ความเร็วประมาณ 1mbps ดังนั้นจึงไม่ควรส่งผลกระทบต่อปริมาณการทดสอบอย่างมาก (เว้นแต่ว่าการเชื่อมต่อเหล่านี้จะทำให้สิ่งต่างๆ แย่ลงโดยอ้อม)

แม้ว่าโหลดจะสูงกว่า TEST 3 ก็ทำได้ดีมาก ดังนั้นจึงยังยากที่จะตำหนิเซิร์ฟเวอร์ 1

ไม่มีปัญหาใน dmesg บนอุปกรณ์ใดก็ได้

ความคิดของฉัน

ปัญหาจะปรากฏเฉพาะเมื่อ DNAT อยู่บนเราเตอร์และเฉพาะกับเซิร์ฟเวอร์ 1 ซึ่งมีการเชื่อมต่ออื่นๆ ในปริมาณมาก (แต่การเชื่อมต่อเหล่านี้เกือบจะไม่ได้ใช้งาน ดังนั้นจึงไม่ควรส่งผลกระทบต่อทุกอย่างในทางลบ?)

การทดสอบที่น่าสนใจที่สุดที่จะอธิบายในความคิดสุดท้าย

เมื่อฉันดาวน์โหลดเว็บแบบมัลติเธรด (ทดสอบ 4) เซิร์ฟเวอร์ 1 ทำงานได้ดีกว่ามาก ดังนั้นจึงสามารถเข้าถึงความเร็วในการดาวน์โหลดที่สูงขึ้น แต่ทำไม 1 การเชื่อมต่อถึงมีความเร็วไม่เท่ากัน?

พารามิเตอร์ที่ฉันสำรวจ

คุณเห็นบางสิ่งที่ไม่เหมาะสำหรับเราเตอร์ Linux หรือไม่

net.core.wmem_max - ซ็อกเก็ต tcp สูงสุดส่งขนาดหน่วยความจำบัฟเฟอร์ (เป็นไบต์) เพิ่มบัฟเฟอร์การอ่าน/เขียน TCP เพื่อให้สามารถปรับขนาดหน้าต่างให้ใหญ่ขึ้นได้ หน้าต่างที่ใหญ่ขึ้นจะเพิ่มจำนวนข้อมูลที่จะถ่ายโอนก่อนที่จะต้องมีการตอบรับ (ACK) สิ่งนี้จะลดเวลาแฝงโดยรวมและส่งผลให้ปริมาณงานเพิ่มขึ้น

โดยทั่วไป การตั้งค่านี้ถูกกำหนดเป็นค่าอนุรักษ์นิยมที่ 262,144 ไบต์ ขอแนะนำให้ตั้งค่านี้ให้ใหญ่ที่สุดเท่าที่เคอร์เนลอนุญาต ค่าที่ใช้ในที่นี่คือ 4,136,960 ไบต์ อย่างไรก็ตาม เคอร์เนล 4.x ยอมรับค่าที่มากกว่า 16MB

เราเตอร์ - 180224

เซิร์ฟเวอร์ 1 - 212992

เซิร์ฟเวอร์ 2 - 163840

ใช้ที่อื่น - 83886080

net.core.wmem_default

เราเตอร์ - 180224

เซิร์ฟเวอร์ 1 - 212992

เซิร์ฟเวอร์ 2 - 163840

ใช้ที่อื่น - 83886080

net.ipv4.rmem_max - ซ็อกเก็ต tcp สูงสุดรับขนาดหน่วยความจำบัฟเฟอร์ (เป็นไบต์)

เราเตอร์ - 180224

เซิร์ฟเวอร์ 1 - 212992

เซิร์ฟเวอร์ 2 - 163840

ใช้ที่อื่น - 335544320

net.core.rmem_default

เราเตอร์ - 180224

เซิร์ฟเวอร์ 1 - 212992

เซิร์ฟเวอร์ 2 - 163840

ใช้ที่อื่น - 335544320

net.ipv4.tcp_rem - ประกอบด้วยค่าสามค่าที่แสดงถึงขนาดต่ำสุด ค่าดีฟอลต์ และค่าสูงสุดของบัฟเฟอร์การรับซ็อกเก็ต TCP คำแนะนำคือให้ใช้ค่าสูงสุด 16M ไบต์หรือสูงกว่า (ขึ้นอยู่กับระดับเคอร์เนล) โดยเฉพาะอย่างยิ่งสำหรับอะแดปเตอร์ 10 Gigabit

เราเตอร์ - 4096 87380 3776288

เซิร์ฟเวอร์ 1 - 4096 131072 6291456

เซิร์ฟเวอร์ 2 - 4096 87380 3515840

ที่อื่นใช้ - 4096 87380 4136960 (IBM)

net.ipv4.tcp_wmem - คล้ายกับ net.ipv4.tcp_rmem พารามิเตอร์นี้ประกอบด้วย 3 ค่า ค่าต่ำสุด ค่าดีฟอลต์ และค่าสูงสุด คำแนะนำคือให้ใช้ค่าสูงสุด 16M ไบต์หรือสูงกว่า (ขึ้นอยู่กับระดับเคอร์เนล) โดยเฉพาะอย่างยิ่งสำหรับอะแดปเตอร์ 10 Gigabit

เราเตอร์ - 4096 16384 3776288

เซิร์ฟเวอร์ 1 - 4096 16384 4194304

เซิร์ฟเวอร์ 2 - 4096 16384 3515840

ที่อื่นใช้ - 4096 87380 4136960 (IBM)

net.ipv4.tcp_tw_reuse - ในสภาพแวดล้อมที่มีการจราจรหนาแน่น ซ็อกเก็ตจะถูกสร้างขึ้นและถูกทำลายด้วยอัตราที่สูงมาก เมื่อตั้งค่าพารามิเตอร์นี้ จะอนุญาตให้ใช้ซ็อกเก็ตที่ไม่จำเป็นอีกต่อไปและกำลังจะถูกทำลายเพื่อใช้สำหรับการเชื่อมต่อใหม่ เมื่อเปิดใช้งาน พารามิเตอร์นี้สามารถข้ามโอเวอร์เฮดการจัดสรรและการเริ่มต้นตามปกติที่เกี่ยวข้องกับการสร้างซ็อกเก็ตซึ่งจะช่วยประหยัดรอบของ CPU โหลดของระบบ และเวลา

ค่าเริ่มต้นคือ 0 (ปิด) ค่าที่แนะนำคือ 1 (เปิด)

เราเตอร์ - 0

เซิร์ฟเวอร์ 1 - 2

เซิร์ฟเวอร์ 2 - 0

ที่อื่นใช้ - 1

net.ipv4.tcp_tw_reuse

เราเตอร์ - 0

เซิร์ฟเวอร์ 1 - 2

เซิร์ฟเวอร์ 2 - 0

ที่อื่นใช้ - 1

net.ipv4.tcp_max_tw_buckets - ระบุจำนวนซ็อกเก็ตสูงสุดในสถานะ âtime-waitâ ที่อนุญาตให้มีได้ตลอดเวลา หากเกินค่าสูงสุด ซ็อกเก็ตในสถานะ âtime-waitâ จะถูกทำลายทันทีและแสดงคำเตือน การตั้งค่านี้มีไว้เพื่อป้องกันการโจมตีแบบปฏิเสธการให้บริการบางประเภท ควรใช้ความระมัดระวังก่อนที่จะลดค่านี้ เมื่อมีการเปลี่ยนแปลง ค่าควรเพิ่มขึ้น โดยเฉพาะอย่างยิ่งเมื่อมีการเพิ่มหน่วยความจำให้กับระบบมากขึ้น หรือเมื่อความต้องการเครือข่ายสูงและสภาพแวดล้อมมีความเสี่ยงต่อภัยคุกคามจากภายนอกน้อยลง

เราเตอร์ - 2048

เซิร์ฟเวอร์ 1 - 131072

เซิร์ฟเวอร์ 2 - 2048

ใช้ที่อื่น - 65536, 262144 (IBM), 45000 (IBM)

net.ipv4.tcp_tw_reuse

เราเตอร์ - 0

เซิร์ฟเวอร์ 1 - 2

เซิร์ฟเวอร์ 2 - 0

ที่อื่นใช้ - 1

net.ipv4.tcp_fin_timeout

เราเตอร์ - 60

เซิร์ฟเวอร์ 1 - 60

เซิร์ฟเวอร์ 2 - 60

ใช้ที่อื่น - 15

net.ipv4.tcp_max_syn_backlog

เราเตอร์ - 128

เซิร์ฟเวอร์ 1 - 2048

เซิร์ฟเวอร์ 2 - 128

ใช้ที่อื่น - 65536

net.ipv4.ip_local_port_range - ช่วงของพอร์ตที่ใช้สำหรับการเชื่อมต่อ TCP ขาออก (มีประโยชน์ในการเปลี่ยนหากคุณมีการเชื่อมต่อขาออกจากโฮสต์จำนวนมาก)

เราเตอร์ - 32768 60999

เซิร์ฟเวอร์ 1 - 32768 60999

เซิร์ฟเวอร์ 2 - 32768 60999

ใช้ที่อื่น - 1024 65535

net.core.netdev_max_backlog - จำนวนสล็อตในบัฟเฟอร์วงแหวนของผู้รับสำหรับแพ็กเก็ตที่มาถึง (เคอร์เนลใส่แพ็กเก็ตในคิวนี้หาก CPU ไม่พร้อมสำหรับการประมวลผล เช่น ตามแอปพลิเคชัน)

เราเตอร์ - 120

เซิร์ฟเวอร์ 1 - 1,000

เซิร์ฟเวอร์ 2 - 1,000

ใช้ที่อื่น - 100,000, 1,000 (IBM), 25,000 (IBM)

net.ipv4.neigh.default.gc_thresh1

เราเตอร์ - 1

เซิร์ฟเวอร์ 1 - 128

เซิร์ฟเวอร์ 2 - 128

ใช้ที่อื่น - 128

net.ipv4.neigh.default.gc_thresh2

เราเตอร์ - 512

เซิร์ฟเวอร์ 1 - 512

เซิร์ฟเวอร์ 2 - 512

ใช้ที่อื่น - 512

net.ipv4.neigh.default.gc_thresh3

เราเตอร์ - 1024

เซิร์ฟเวอร์ 1 - 1024

เซิร์ฟเวอร์ 2 - 1024

ใช้ที่อื่น - 1024

net.ipv4.neigh.default.gc_thresh3

เราเตอร์ - 1024

เซิร์ฟเวอร์ 1 - 1024

เซิร์ฟเวอร์ 2 - 1024

ใช้ที่อื่น - 1024

net.core.somaxconn - ขนาดคิวการฟังสูงสุดสำหรับซ็อกเก็ต (การตั้งค่าที่มีประโยชน์และมักถูกมองข้ามสำหรับตัวโหลดบาลานเซอร์ เว็บเซิร์ฟเวอร์ และเซิร์ฟเวอร์แอปพลิเคชัน (เช่น ยูนิคอร์น php-fpm) หากกระบวนการ/เธรดของเซิร์ฟเวอร์ทั้งหมดไม่ว่าง การเชื่อมต่อไคลเอ็นต์ขาเข้าจะถูกใส่ไว้ใน “backlog” กำลังรอการเสิร์ฟ). งานค้างทั้งหมดทำให้การเชื่อมต่อไคลเอ็นต์ถูกปฏิเสธทันที ทำให้เกิดข้อผิดพลาดไคลเอ็นต์

เราเตอร์ - 128

เซิร์ฟเวอร์ 1 - 4096

เซิร์ฟเวอร์ 2 - 128

net.ipv4.tcp_mem - เกณฑ์การใช้หน่วยความจำบัฟเฟอร์ TCP สำหรับการปรับอัตโนมัติในหน้าหน่วยความจำ (1 หน้า = 4kb)

เราเตอร์ - 5529 7375 11058

เซิร์ฟเวอร์ 1 - 381144 508193 762288

เซิร์ฟเวอร์ 2 - 5148 6866 10296

net.nf_conntrack_max - จำนวนการเชื่อมต่อสูงสุด

เราเตอร์ - 32768

เซิร์ฟเวอร์ 1 - 262144

เซิร์ฟเวอร์ 2 - ไม่มีข้อมูล

net.netfilter.nf_conntrack_max - จำนวนการเชื่อมต่อสูงสุด? หากเป็นพารามิเตอร์ที่ถูกต้อง แสดงว่า 1560 ไม่เพียงพอ

เราเตอร์ - 1560

เซิร์ฟเวอร์ 1 - 262144

เซิร์ฟเวอร์ 2 - ไม่มีข้อมูล

/proc/sys/net/ipv4/tcp_congestion_control - ความแออัดของเครือข่ายในระบบเครือข่ายข้อมูล [...] คือคุณภาพการบริการที่ลดลงซึ่งเกิดขึ้นเมื่อโหนดเครือข่ายบรรทุกข้อมูลมากเกินกว่าที่จะสามารถจัดการได้ ผลกระทบโดยทั่วไป ได้แก่ การรอคิว การสูญหายของแพ็กเก็ต หรือการปิดกั้นการเชื่อมต่อใหม่ เครือข่ายใช้เทคนิคการควบคุมความแออัดและการหลีกเลี่ยงความคับคั่งเพื่อพยายามหลีกเลี่ยงการยุบตัวของความคับคั่ง1

เราเตอร์ - เวสต์วูด

เซิร์ฟเวอร์ 1 - ลูกบาศก์

เซิร์ฟเวอร์ 2 - ลูกบาศก์

net.ipv4.tcp_syn_retries - ระบุจำนวนครั้งที่พยายามส่งแพ็กเก็ต SYN เริ่มต้นอีกครั้งสำหรับความพยายามเชื่อมต่อ TCP ที่ใช้งานอยู่ การตั้งค่าปัจจุบันคือ 20 ซึ่งหมายความว่ามีการพยายามส่งสัญญาณซ้ำ 20 ครั้งก่อนที่การเชื่อมต่อจะหมดเวลา การดำเนินการนี้อาจใช้เวลาหลายนาที ขึ้นอยู่กับระยะเวลาของการพยายามส่งสัญญาณซ้ำ

เราเตอร์ - 6

เซิร์ฟเวอร์ 1 - 6

เซิร์ฟเวอร์ 2 - 6

net.ipv4.tcp_low_latency - ค่าเริ่มต้นคือ 0 (ปิด) สำหรับเวิร์กโหลดหรือสภาพแวดล้อมที่เวลาแฝงมีความสำคัญสูงกว่า ค่าที่แนะนำคือ 1 (เปิด)

เราเตอร์ - 0

เซิร์ฟเวอร์ 1 - 0

เซิร์ฟเวอร์ 2 - 0

net.ipv4.tcp_limit_output_bytes - การใช้พารามิเตอร์นี้ TCP จะควบคุมการจำกัดคิวขนาดเล็กตามแต่ละซ็อกเก็ต TCP TCP มีแนวโน้มที่จะเพิ่มข้อมูลในการบินจนกว่าจะได้รับการแจ้งเตือนการสูญหาย ด้วยลักษณะต่างๆ ของ TCP ที่ส่งการปรับอัตโนมัติ ข้อมูลจำนวนมากอาจเข้าคิวที่อุปกรณ์ในเครื่องท้องถิ่น ซึ่งอาจส่งผลเสียต่อเวลาแฝงสำหรับสตรีมอื่นๆtcp_limit_output_bytes จำกัดจำนวนไบต์บนอุปกรณ์เพื่อลดผลกระทบด้านเวลาแฝงที่เกิดจากขนาดคิวที่ใหญ่ขึ้น

เราเตอร์ - 262144

เซิร์ฟเวอร์ 1 - 1048576

เซิร์ฟเวอร์ 2 - 262144

ใช้ที่อื่น - 262,144 (IBM), 131,072 (IBM)

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา