Kịch bản: Chúng tôi có một số máy khách Windows thường xuyên tải lên các tệp lớn (FTP / SVN / HTTP PUT / SCP) lên các máy chủ Linux cách đó ~ 100-160ms. Chúng tôi có băng thông đồng bộ 1Gbit / s tại văn phòng và các máy chủ là phiên bản AWS hoặc được lưu trữ vật lý trong các DC của Hoa Kỳ.
Báo cáo ban đầu là việc tải lên một phiên bản máy chủ mới chậm hơn nhiều so với khả năng của chúng. Điều này nhàm chán trong thử nghiệm và từ nhiều địa điểm; khách hàng đã thấy ổn định 2-5Mbit / s đến máy chủ từ hệ thống Windows của họ.
Tôi đã nổ ra iperf -s
một ví dụ AWS và sau đó từ một máy khách Windows trong văn phòng:
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
Con số thứ hai có thể thay đổi đáng kể trong các thử nghiệm tiếp theo, (Vagaries of AWS) nhưng thường nằm trong khoảng 70 đến 130Mbit / s, quá đủ cho nhu cầu của chúng tôi. Wiresharking phiên, tôi có thể thấy:
iperf -c
Windows SYN - Window 64kb, Scale 1 - Linux SYN, ACK: Window 14kb, Scale: 9 (* 512)iperf -c -w1M
Windows SYN - Windows 64kb, Tỷ lệ 1 - Linux SYN, ACK: Window 14kb, Tỷ lệ: 9
Rõ ràng liên kết có thể duy trì thông lượng cao này, nhưng tôi phải tự động đặt kích thước cửa sổ để sử dụng nó, điều mà hầu hết các ứng dụng trong thế giới thực sẽ không cho phép tôi làm. Các bắt tay TCP sử dụng cùng một điểm bắt đầu trong mỗi trường hợp, nhưng bắt buộc một thang đo
Ngược lại, từ một máy khách Linux trên cùng một mạng, iperf -c
(sử dụng hệ thống mặc định 85kb) mang lại cho tôi:
[ 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
Không có bất kỳ sự ép buộc nào, nó có quy mô như mong đợi. Đây không thể là một cái gì đó trong các bước nhảy xen kẽ hoặc các bộ chuyển mạch / bộ định tuyến cục bộ của chúng tôi và dường như ảnh hưởng đến cả máy khách Windows 7 và 8. Tôi đã đọc rất nhiều hướng dẫn về tự động điều chỉnh, nhưng chúng thường là về việc vô hiệu hóa tỷ lệ hoàn toàn để làm việc xung quanh bộ công cụ mạng gia đình tồi tệ.
Bất cứ ai có thể cho tôi biết những gì đang xảy ra ở đây và cho tôi một cách để sửa chữa nó? (Tốt nhất là một cái gì đó tôi có thể dính vào sổ đăng ký thông qua GPO.)
Ghi chú
Ví dụ AWS Linux được đề cập có các cài đặt kernel sau được áp dụng trong 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
Tôi đã sử dụng dd if=/dev/zero | nc
chuyển hướng đến /dev/null
ở cuối máy chủ để loại trừ iperf
và loại bỏ bất kỳ tắc nghẽn nào khác có thể xảy ra, nhưng kết quả rất giống nhau. Các thử nghiệm với ncftp
quy mô (Cygwin, Windows gốc, Linux) theo cách tương tự như các thử nghiệm iperf ở trên trên các nền tảng tương ứng của chúng.
Biên tập
Tôi đã phát hiện ra một điều phù hợp khác ở đây có thể có liên quan:
Đây là giây đầu tiên của bản chụp 1 MB, được phóng to. Bạn có thể thấy Slow Start hoạt động khi cửa sổ mở rộng và bộ đệm trở nên lớn hơn. Sau đó, cao nguyên nhỏ bé này ~ 0,2s chính xác tại điểm mà cửa sổ mặc định iperf kiểm tra bị san phẳng mãi mãi. Điều này tất nhiên có quy mô đến độ cao chóng mặt hơn nhiều, nhưng điều tò mò là có sự tạm dừng này trong tỷ lệ (Giá trị là 1022byte * 512 = 523264) trước khi thực hiện.
Cập nhật - ngày 30 tháng 6.
Theo dõi các phản ứng khác nhau:
- Kích hoạt CTCP - Điều này không tạo ra sự khác biệt; tỉ lệ cửa sổ là giống hệt nhau. (Nếu tôi hiểu chính xác điều này, cài đặt này sẽ tăng tốc độ mở rộng cửa sổ tắc nghẽn thay vì kích thước tối đa có thể đạt được)
- Kích hoạt dấu thời gian TCP. - Không có thay đổi ở đây.
- Thuật toán của Nagle - Điều đó có ý nghĩa và ít nhất nó có nghĩa là tôi có thể có thể bỏ qua các đốm đặc biệt đó trong biểu đồ như bất kỳ dấu hiệu nào của vấn đề.
- tệp pcap: Tệp zip có sẵn tại đây: https://www.dropbox.com/s/104qdysmk01lnf6/iperf-pcaps-10s-Win%2BLinux-2014-06-30.zip (Được ẩn danh bằng bittwiste, trích xuất ~ 150 MB khi có một từ mỗi máy khách HĐH để so sánh)
Cập nhật ngày 2 - 30 tháng 6
O, vì vậy, theo gợi ý của Kyle, tôi đã kích hoạt ctcp và tắt tải ống khói: Thông số toàn cầu TCP
----------------------------------------------
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
Nhưng thật đáng buồn, không có thay đổi trong thông lượng.
Tôi có một câu hỏi về nguyên nhân / hiệu ứng ở đây, mặc dù: Các biểu đồ có giá trị RWIN được đặt trong ACK của máy chủ cho máy khách. Với các máy khách Windows, tôi có đúng không khi nghĩ rằng Linux không mở rộng giá trị này vượt quá điểm thấp đó bởi vì CWIN bị giới hạn của máy khách sẽ ngăn chặn ngay cả bộ đệm đó bị lấp đầy? Có thể có một số lý do khác mà Linux giới hạn một cách giả tạo RWIN?
Lưu ý: Tôi đã thử bật ECN cho địa ngục của nó; Nhưng không có thay đổi, ở đó.
Cập nhật ngày 3 - 31 tháng 6.
Không có thay đổi sau khi vô hiệu hóa heuristic và RWIN autotuning. Đã cập nhật trình điều khiển mạng Intel lên bản mới nhất (12.10.28.0) với phần mềm hiển thị các tinh chỉnh funcioanlity thông qua các tab trình quản lý. Thẻ này là một Chipset 82579V trên bo mạch - (Tôi sẽ thực hiện thêm một số thử nghiệm từ các khách hàng với realtek hoặc các nhà cung cấp khác)
Tập trung vào NIC trong giây lát, tôi đã thử các cách sau (Chủ yếu chỉ loại trừ các thủ phạm không có khả năng):
- Tăng bộ đệm nhận lên 2k từ 256 và truyền bộ đệm lên 2k từ 512 (Cả hai hiện tại tối đa) - Không thay đổi
- Vô hiệu hóa tất cả giảm tải tổng kiểm tra IP / TCP / UDP. - Không thay đổi.
- Vô hiệu hóa Giảm tải lớn - Nada.
- Đã tắt IPv6, lập lịch QoS - Ngay bây giờ.
Cập nhật 3 - 3 tháng 7
Cố gắng loại bỏ phía máy chủ Linux, tôi đã khởi động một phiên bản Server 2012R2 và lặp lại các thử nghiệm bằng cách sử dụng iperf
(cygwin binary) và NTttcp .
Với iperf
, tôi đã phải xác định rõ ràng -w1m
ở cả hai bên trước khi kết nối vượt quá ~ 5Mbit / s. (Ngẫu nhiên, tôi có thể được kiểm tra và BDP ~ 5Mbits ở độ trễ 91ms gần như chính xác là 64kb. Phát hiện giới hạn ...)
Các nhị phân ntttcp cho thấy giới hạn như vậy. Sử dụng ntttcpr -m 1,0,1.2.3.5
trên máy chủ và ntttcp -s -m 1,0,1.2.3.5 -t 10
trên máy khách, tôi có thể thấy thông lượng tốt hơn nhiều:
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 / s đưa nó lên ở mức tôi đã nhận được với các cửa sổ lớn rõ ràng iperf
. Mặc dù, kỳ lạ là 80 MB trong bộ đệm 1273 = bộ đệm 64kB một lần nữa. Một dây dẫn tiếp theo cho thấy một RWIN tốt, biến trở lại từ máy chủ (Hệ số tỷ lệ 256) mà máy khách dường như đáp ứng; vì vậy có lẽ ntttcp đang nhập sai cửa sổ gửi.
Cập nhật 4 - 3 tháng 7
Theo yêu cầu của @ karyhead, tôi đã thực hiện thêm một số thử nghiệm và tạo thêm một số ảnh chụp, tại đây: https://www.dropbox.com/s/dtlvy1vi46x75it/iperf%2Bntttcp%2Bftp-pcaps-2014-07-03.zip
- Hai
iperf
giây nữa , cả từ Windows đến cùng một máy chủ Linux như trước (1.2.3.4): Một với kích thước Ổ cắm 128k và cửa sổ 64k mặc định (giới hạn ở ~ 5Mbit / giây một lần nữa) và một với cửa sổ gửi 1 MB và ổ cắm 8kb mặc định kích thước. (thang điểm cao hơn) - Một
ntttcp
dấu vết từ cùng một máy khách Windows đến phiên bản Server 2012R2 EC2 (1.2.3.5). ở đây, thông lượng quy mô tốt. Lưu ý: NTttcp thực hiện một số thứ kỳ lạ trên cổng 6001 trước khi mở kết nối thử nghiệm. Không chắc chắn những gì đang xảy ra ở đó. - Một dấu vết dữ liệu FTP, tải lên 20 MB
/dev/urandom
đến một máy chủ linux gần giống (1.2.3.6) bằng Cygwinncftp
. Một lần nữa giới hạn là có. Mô hình rất giống nhau khi sử dụng Windows Filezilla.
Thay đổi iperf
độ dài bộ đệm sẽ tạo ra sự khác biệt dự kiến cho biểu đồ trình tự thời gian (nhiều phần dọc hơn nhiều), nhưng thông lượng thực tế không thay đổi.
netsh int tcp set global timestamps=enabled