ฉันมีสถาปัตยกรรมเครือข่ายที่ง่ายที่สุด/ทั่วไป
เว็บเซิร์ฟเวอร์ตั้งอยู่หลังเราเตอร์บนเครือข่ายท้องถิ่น เราเตอร์นี้ทำ iptables DNAT เพื่อให้สามารถส่งต่อพอร์ตไปยังเว็บเซิร์ฟเวอร์ได้
ดังนั้น ฉันสามารถดาวน์โหลดไฟล์จากเซิร์ฟเวอร์ 1 ไปยังคอมพิวเตอร์ของฉันผ่านทางอินเทอร์เน็ตได้
คำถามของฉัน
การปรับเคอร์เนลที่เหมาะสมคืออะไรเพื่อให้แน่ใจว่าเราเตอร์ใช้ศักยภาพส่วนใหญ่ (สำหรับการเชื่อมต่อประมาณ 2,000 ครั้งและปริมาณงานสูงสุด) ฉันมีปัญหาในสีส้ม
พารามิเตอร์เคอร์เนลดูดีบนเซิร์ฟเวอร์ 1 หรือไม่
คุณช่วยอธิบายได้ไหมว่าทำไมฉันถึงได้รับเพียง 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)