สถานการณ์จำลอง: เรามีลูกค้า Windows จำนวนมากที่อัปโหลดไฟล์ขนาดใหญ่เป็นประจำ (FTP / SVN / HTTP PUT / SCP) ไปยังเซิร์ฟเวอร์ Linux ที่อยู่ห่างออกไป ~ 100-160ms เรามีแบนด์วิดท์แบบซิงโครนัส 1Gbit / s ที่สำนักงานและเซิร์ฟเวอร์เป็นอินสแตนซ์ AWS หรือโฮสต์ในสหรัฐอเมริกา DC
รายงานเริ่มต้นคือการอัปโหลดไปยังอินสแตนซ์ของเซิร์ฟเวอร์ใหม่ช้ากว่าที่ควรจะเป็น นี่เป็นสิ่งที่น่าเบื่อในการทดสอบและจากหลาย ๆ สถานที่ ลูกค้าเห็นเสถียรภาพ 2-5Mbit / s ไปยังโฮสต์จากระบบ Windows ของพวกเขา
ฉันโพiperf -s
สต์อินสแตนซ์ AWS แล้วจากไคลเอนต์Windowsในสำนักงาน:
iperf -c 1.2.3.4
[ 5] local 10.169.40.14 port 5001 connected with 1.2.3.4 port 55185
[ 5] 0.0-10.0 sec 6.55 MBytes 5.48 Mbits/sec
iperf -w1M -c 1.2.3.4
[ 4] local 10.169.40.14 port 5001 connected with 1.2.3.4 port 55239
[ 4] 0.0-18.3 sec 196 MBytes 89.6 Mbits/sec
ตัวเลขหลังสามารถแตกต่างกันอย่างมีนัยสำคัญในการทดสอบครั้งต่อไป (Vagaries of AWS) แต่มักจะอยู่ระหว่าง 70 และ 130Mbit / s ซึ่งเกินพอสำหรับความต้องการของเรา เมื่อเห็นเซสชั่นฉันสามารถดู:
iperf -c
Windows SYN - หน้าต่าง 64kb, สเกล 1 - Linux SYN, ACK: หน้าต่าง 14kb, สเกล: 9 (* 512)iperf -c -w1M
Windows SYN - Windows 64kb, สเกล 1 - Linux SYN, ACK: หน้าต่าง 14kb, สเกล: 9
เห็นได้ชัดว่าการเชื่อมโยงสามารถรักษาปริมาณงานสูง แต่ฉันต้องอธิบายขนาดของหน้าต่างเพื่อใช้ประโยชน์จากมันซึ่งแอพพลิเคชั่นโลกแห่งความเป็นจริงส่วนใหญ่จะไม่ยอมให้ฉันทำ Handshakes TCP ใช้จุดเริ่มต้นเดียวกันในแต่ละกรณี แต่บังคับหนึ่งสเกล
ในทางกลับกันจากไคลเอนต์ Linux บนเครือข่ายเดียวกันเป็นเส้นตรงiperf -c
(โดยใช้ค่าเริ่มต้นของระบบ 85kb) ให้ฉัน:
[ 5] local 10.169.40.14 port 5001 connected with 1.2.3.4 port 33263
[ 5] 0.0-10.8 sec 142 MBytes 110 Mbits/sec
มันจะขยายตามที่คาดไว้ นี่ไม่ใช่สิ่งที่จะเกิดขึ้นในระหว่างการกระโดดหรือสวิตช์ / เราเตอร์ในพื้นที่ของเราและดูเหมือนว่าจะมีผลกับไคลเอนต์ Windows 7 และ 8 เหมือนกัน ฉันได้อ่านคำแนะนำมากมายเกี่ยวกับการปรับจูนอัตโนมัติ แต่โดยทั่วไปแล้วสิ่งเหล่านี้เกี่ยวกับการปิดใช้งานการปรับสเกลพร้อมกันเพื่อหลีกเลี่ยงชุดเครือข่ายในบ้านที่แย่มาก
ใครสามารถบอกฉันว่าเกิดอะไรขึ้นที่นี่และให้วิธีการแก้ไขกับฉันได้ไหม (โดยเฉพาะอย่างยิ่งสิ่งที่ฉันสามารถติดในรีจิสทรีผ่าน GPO)
หมายเหตุ
อินสแตนซ์ AWS Linux ที่เป็นปัญหามีการใช้การตั้งค่าเคอร์เนลต่อไปนี้sysctl.conf
:
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.rmem_default = 1048576
net.core.wmem_default = 1048576
net.ipv4.tcp_rmem = 4096 1048576 16777216
net.ipv4.tcp_wmem = 4096 1048576 16777216
ฉันใช้การdd if=/dev/zero | nc
เปลี่ยนเส้นทางไป/dev/null
ที่จุดสิ้นสุดของเซิร์ฟเวอร์เพื่อแยกแยะiperf
และลบคอขวดที่เป็นไปได้อื่น ๆ แต่ผลลัพธ์จะเหมือนกันมาก การทดสอบด้วยระดับncftp
(Cygwin, Native Windows, Linux) ในลักษณะเดียวกับการทดสอบ iperf ด้านบนบนแพลตฟอร์มที่เกี่ยวข้อง
แก้ไข
ฉันพบสิ่งที่สอดคล้องกันอีกครั้งที่นี่ซึ่งอาจเกี่ยวข้อง:
นี่เป็นวินาทีแรกของการจับ 1MB ที่ซูมเข้าคุณสามารถเห็นการทำงานเริ่มช้าในขณะที่หน้าต่างขยายและบัฟเฟอร์ใหญ่ขึ้น นอกจากนี้แล้วนี้ที่ราบเล็ก ๆ ของ ~ 0.2s ตรงที่จุดที่การทดสอบหน้าต่างเริ่มต้น iperf flattens ออกไปตลอดกาล หลักสูตรนี้ปรับให้สูงขึ้นมาก แต่สงสัยว่ามีการหยุดชั่วคราวในการปรับขนาด (ค่า 1022bytes * 512 = 523264) ก่อนที่จะทำเช่นนั้น
อัปเดต - 30 มิถุนายน
ติดตามการตอบสนองต่าง ๆ :
- การเปิดใช้งาน CTCP - สิ่งนี้ไม่สร้างความแตกต่าง การปรับขนาดหน้าต่างเหมือนกัน (ถ้าฉันเข้าใจสิ่งนี้อย่างถูกต้องการตั้งค่านี้จะเพิ่มอัตราการขยายหน้าต่างคับคั่งแทนที่จะเป็นขนาดสูงสุดที่สามารถเข้าถึงได้)
- การเปิดใช้งานการประทับเวลา TCP - ไม่มีการเปลี่ยนแปลงที่นี่เช่นกัน
- อัลกอริทึมของ Nagle - มันสมเหตุสมผลแล้วและอย่างน้อยก็หมายความว่าฉันอาจเพิกเฉยต่อการผิดพลาดนั้นในกราฟเพื่อบ่งบอกถึงปัญหา
- ไฟล์ pcap: มีไฟล์ซิปที่นี่: https://www.dropbox.com/s/104qdysmk01lnf6/iperf-pcaps-10s-Win%2BLinux-2014-06-30.zip (ไม่ระบุชื่อด้วย bittwiste แยกเป็น ~ 150MB หนึ่งรายการจากไคลเอนต์แต่ละระบบปฏิบัติการสำหรับการเปรียบเทียบ)
อัปเดต 2 - 30 มิถุนายน
O ดังนั้นเมื่อ op ตามคำแนะนำของ Kyle ฉันได้เปิดใช้งาน ctcp และปิดใช้งานการถ่ายปล่องไฟ: TCP Global Parameters
----------------------------------------------
Receive-Side Scaling State : enabled
Chimney Offload State : disabled
NetDMA State : enabled
Direct Cache Acess (DCA) : disabled
Receive Window Auto-Tuning Level : normal
Add-On Congestion Control Provider : ctcp
ECN Capability : disabled
RFC 1323 Timestamps : enabled
Initial RTO : 3000
Non Sack Rtt Resiliency : disabled
แต่น่าเศร้าที่ไม่มีการเปลี่ยนแปลงในปริมาณงาน
ฉันมีคำถามสาเหตุ / ผลที่นี่ แต่: กราฟเป็นค่า RWIN ที่ตั้งค่าใน ACK ของเซิร์ฟเวอร์ไปยังลูกค้า ด้วยไคลเอนต์ Windows ฉันคิดถูกว่า Linux ไม่ได้ปรับค่านี้เกินกว่าจุดต่ำสุดเนื่องจากไคลเอนต์ที่ จำกัด ของ CWIN จะป้องกันไม่ให้บัฟเฟอร์นั้นเต็ม มีเหตุผลอื่นอีกไหมที่ลีนุกซ์ จำกัด การใช้ RWIN อย่างผิด ๆ ?
หมายเหตุ: ฉันได้ลองเปิดใช้งาน ECN เพื่อหาขุมทรัพย์ของมันแล้ว แต่ไม่มีการเปลี่ยนแปลงที่นั่น
อัปเดต 3 - 31 มิถุนายน
ไม่มีการเปลี่ยนแปลงหลังจากปิดใช้งานการวิเคราะห์พฤติกรรมและการสลับอัตโนมัติของ RWIN ได้อัพเดตไดร์เวอร์เครือข่าย Intel เป็นเวอร์ชั่นล่าสุด (12.10.28.0) ด้วยซอฟต์แวร์ที่แสดงให้เห็นถึงความสามารถในการปรับแต่งแท็บ viadevice manager การ์ดดังกล่าวเป็นชิปเซ็ต 82579V บนเมนบอร์ด NIC - (ฉันจะทำการทดสอบเพิ่มเติมจากลูกค้าที่มี realtek หรือผู้ขายรายอื่น)
มุ่งเน้นไปที่ NIC สักครู่ฉันได้ลองทำสิ่งต่อไปนี้ (ส่วนใหญ่จะตัดสินผู้กระทำผิดที่ไม่น่าจะเกิดขึ้น):
- เพิ่มบัฟเฟอร์รับเป็น 2k จาก 256 และส่งบัฟเฟอร์เป็น 2k จาก 512 (ทั้งสองตอนนี้สูงสุด) - ไม่มีการเปลี่ยนแปลง
- ปิดใช้งานการตรวจสอบการถ่ายโอนข้อมูล IP / TCP / UDP ทั้งหมด - ไม่มีการเปลี่ยนแปลง.
- ปิดใช้งานการส่งข้อมูลขนาดใหญ่ - Nada
- ปิดใช้งาน IPv6, QoS scheduling - Nowt
อัปเดต 3 - 3 กรกฎาคม
พยายามที่จะกำจัดฝั่งเซิร์ฟเวอร์ Linux ผมเริ่มต้นขึ้นอินสแตนซ์เซิร์ฟเวอร์ 2012R2 และทำซ้ำการทดสอบโดยใช้iperf
(ไบนารี Cygwin) และNTttcp
ด้วยiperf
ผมก็มีการระบุอย่างชัดเจน-w1m
เกี่ยวกับทั้งสองฝ่ายก่อนที่จะเชื่อมต่อจะขนาดเกิน ~ 5Mbit / s (บังเอิญฉันสามารถตรวจสอบได้และ BDP ของ ~ 5Mbits ที่ 91ms latency เกือบ 64kb แม่นยำแม่นยำ จำกัด วงเงิน ... )
ไบนารี ntttcp แสดงข้อ จำกัด ดังกล่าวในขณะนี้ ntttcpr -m 1,0,1.2.3.5
เมื่อใช้บนเซิร์ฟเวอร์และntttcp -s -m 1,0,1.2.3.5 -t 10
บนไคลเอนต์ฉันสามารถดูปริมาณงานได้ดีขึ้นมาก:
Copyright Version 5.28
Network activity progressing...
Thread Time(s) Throughput(KB/s) Avg B / Compl
====== ======= ================ =============
0 9.990 8155.355 65536.000
##### Totals: #####
Bytes(MEG) realtime(s) Avg Frame Size Throughput(MB/s)
================ =========== ============== ================
79.562500 10.001 1442.556 7.955
Throughput(Buffers/s) Cycles/Byte Buffers
===================== =========== =============
127.287 308.256 1273.000
DPCs(count/s) Pkts(num/DPC) Intr(count/s) Pkts(num/intr)
============= ============= =============== ==============
1868.713 0.785 9336.366 0.157
Packets Sent Packets Received Retransmits Errors Avg. CPU %
============ ================ =========== ====== ==========
57833 14664 0 0 9.476
8MB / iperf
วินาทีทำให้มันขึ้นมาในระดับที่ผมได้รับมีหน้าต่างบานใหญ่อย่างชัดเจนใน แม้ว่าจะผิดปกติ 80MB ใน 1273 บัฟเฟอร์ = บัฟเฟอร์ 64kB อีกครั้ง การเปลี่ยนแปลงเพิ่มเติมแสดงให้เห็นว่าตัวแปร RWIN ที่ดีนั้นกลับมาจากเซิร์ฟเวอร์ (ตัวประกอบขนาด 256) ที่ไคลเอ็นต์ดูเหมือนว่าจะเติมเต็ม ดังนั้นบางที ntttcp กำลังส่งหน้าต่างส่งผิด
อัพเดท 4 - 3 กรกฎาคม
ตามคำขอของ @ karyhead ฉันได้ทำการทดสอบเพิ่มเติมและสร้างการบันทึกเพิ่มเติมอีกสองสามรายการที่นี่: https://www.dropbox.com/s/dtlvy1vi46x75it/iperf%2Bntttcp%2Bftp-pcaps-2014-07-03.zip
- อีกสอง
iperf
s ทั้งจาก Windows ไปยังเซิร์ฟเวอร์ Linux เดียวกันเช่นก่อน (1.2.3.4): หนึ่งที่มีขนาดซ็อกเก็ต 128k และหน้าต่าง 64k เริ่มต้น (จำกัด ถึง ~ 5Mbit / s อีกครั้ง) และหนึ่งที่มีหน้าต่างส่ง 1MB และซ็อกเก็ต 8kb เริ่มต้น ขนาด. (ตาชั่งที่สูงกว่า) - หนึ่งการ
ntttcp
ติดตามจากไคลเอนต์ Windows เดียวกันกับอินสแตนซ์ของเซิร์ฟเวอร์ 2012R2 EC2 (1.2.3.5) ที่นี่ปริมาณงานก็ขยายตัวได้ดี หมายเหตุ: NTttcp ทำสิ่งผิดปกติบนพอร์ต 6001 ก่อนที่จะเปิดการเชื่อมต่อทดสอบ ไม่แน่ใจว่าเกิดอะไรขึ้น - หนึ่ง FTP ร่องรอยข้อมูล 20MB อัพโหลด
/dev/urandom
ไปยังโฮสต์อยู่ใกล้กับลินุกซ์เหมือนกัน (1.2.3.6) โดยใช้ncftp
Cygwin มีการ จำกัด อีกครั้ง รูปแบบเหมือนกันมากโดยใช้ Windows Filezilla
การเปลี่ยนiperf
ความยาวบัฟเฟอร์ทำให้เกิดความแตกต่างตามที่คาดไว้กับกราฟลำดับเวลา (ส่วนแนวตั้งอื่น ๆ อีกมากมาย) แต่ปริมาณงานที่แท้จริงไม่เปลี่ยนแปลง
netsh int tcp set global timestamps=enabled