시나리오 : 다수의 Windows 클라이언트가 정기적으로 대용량 파일 (FTP / SVN / HTTP PUT / SCP)을 ~ 100-160ms 떨어진 Linux 서버에 업로드합니다. 사무실에는 1Gbit / s 동기 대역폭이 있으며 서버는 AWS 인스턴스이거나 미국 DC에서 물리적으로 호스팅됩니다.
초기 보고서는 새 서버 인스턴스에 업로드 할 때보 다 훨씬 느리다는 것이 었습니다. 이것은 테스트와 여러 위치에서 나왔습니다. 클라이언트는 Windows 시스템에서 호스트에 대해 2-5Mbit / s의 안정성을 보였습니다.
나는 발발 iperf -s
AWS 인스턴스에서 다음에서 윈도우 사무실에서 클라이언트 :
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
후자의 수치는 후속 테스트 (AWS의 편차)에 따라 크게 다를 수 있지만 일반적으로 70 ~ 130Mbit / s이며 이는 우리의 요구에 충분합니다. 세션을 Wiresharking하면 다음을 볼 수 있습니다.
iperf -c
Windows SYN-Window 64kb, 스케일 1-Linux SYN, ACK : Window 14kb, 스케일 : 9 (* 512)iperf -c -w1M
Windows SYN-Windows 64kb, 스케일 1-Linux SYN, ACK : 창 14kb, 스케일 : 9
분명히 링크는 이러한 높은 처리량을 유지할 수 있지만, 실제로 사용하려면 창 크기를 명시 적으로 설정해야합니다. 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에서 네이티브 윈도우, 리눅스)는 각각의 플랫폼에서 위의 iperf 테스트만큼 같은 방식으로 확장 할 수 있습니다.
편집하다
여기에서 관련성이있는 또 다른 일관된 것을 발견했습니다.
확대 된 1MB 캡처의 첫 번째 초입니다. 창이 확대되고 버퍼가 커짐에 따라 Slow Start 가 작동하는 것을 볼 수 있습니다 . ~ 0.2 초의이 작은 고원 다음있다 정확히 기본 창 iperf 테스트 영원히 평평 시점에서이. 이것은 물론 더 어지러운 높이로 확장되지만 스케일링 에서이 일시 중지 (값은 1022 바이트 * 512 = 523264)가 있기 전에 궁금합니다.
업데이트-6 월 30 일
다양한 응답에 대한 후속 조치 :
- CTCP 활성화-차이가 없습니다. 창 스케일링이 동일합니다. (이 내용을 올바르게 이해하면이 설정으로 인해 정체 창이 확대 될 수있는 최대 크기가 아닌 확대 비율이 증가합니다)
- TCP 타임 스탬프 활성화 -여기도 바뀌지 않았습니다.
- Nagle의 알고리즘-이것은 의미가 있으며 적어도 문제의 표시로 그래프의 특정 얼룩을 무시할 수 있음을 의미합니다.
- pcap 파일 : 여기에서 사용할 수있는 Zip 파일 : https://www.dropbox.com/s/104qdysmk01lnf6/iperf-pcaps-10s-Win%2BLinux-2014-06-30.zip (bittwiste와 익명으로, ~ 150MB로 추출) 비교를 위해 각 OS 클라이언트에서 하나씩)
업데이트 2-6 월 30 일
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
그러나 슬프게도 처리량에는 변화가 없습니다.
그래도 여기에 원인 / 결과 질문이 있습니다. 그래프는 클라이언트의 서버 ACK에 설정된 RWIN 값입니다. Windows 클라이언트의 경우 클라이언트의 제한된 CWIN으로 인해 버퍼가 채워지지 않기 때문에 Linux 가이 값을 저점 이상으로 확장하지 않는다고 생각하고 있습니까? 리눅스가 인위적으로 RWIN을 제한하는 다른 이유가있을 수 있습니까?
참고 : 나는 그것을 위해 ECN을 켜려고 노력했다. 그러나 변화는 없습니다.
업데이트 3-6 월 31 일
휴리스틱 및 RWIN 자동 튜닝 비활성화 후 변경 사항이 없습니다. 장치 관리자 탭을 통해 기능 왜곡을 일으키는 소프트웨어를 사용하여 인텔 네트워크 드라이버를 최신 (12.10.28.0)으로 업데이트했습니다. 이 카드는 82579V 칩셋 온보드 NIC입니다. (realtek 또는 다른 공급 업체의 클라이언트에서 더 많은 테스트를 수행 할 것입니다)
잠시 NIC에 집중하면서 다음을 시도했습니다 (거의 범인을 배제 할 것입니다).
- 수신 버퍼를 256에서 2k로, 전송 버퍼를 512에서 2k로 증가 (모두 최대)-변경 없음
- 모든 IP / TCP / UDP 체크섬 오프로드를 비활성화했습니다. - 변경 없음.
- 비활성화 된 대용량 전송 오프로드-Nada.
- IPv6, QoS 스케줄링 끄기-Nowt.
업데이트 3-7 월 3 일
Linux 서버 측을 제거하기 위해 Server 2012R2 인스턴스를 시작하고 iperf
(cygwin binary) 및 NTttcp를 사용하여 테스트를 반복했습니다 .
으로 iperf
, 나는 명시 적으로 지정했습니다 -w1m
에 모두 연결이 ~ 5Mbit / s의 이상으로 확장 할 전에 측면. (실수로, 91ms의 대기 시간에서 ~ 5Mbits의 BDP는 거의 정확히 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 / s는 명시 적으로 큰 창을 사용하여 얻은 수준으로 설정 iperf
합니다. 이상하게도 1273 버퍼의 80MB = 64kB 버퍼입니다. 추가 wireshark는 클라이언트가 충족하는 것처럼 보이는 가변 가변 RWIN이 서버에서 나오는 것을 보여줍니다 (Scale factor 256). 아마도 ntttcp가 전송 창을 잘못보고 있습니다.
업데이트 4-7 월 3 일
@ karyhead의 요청에 따라, 좀 더 많은 테스트를 수행하고 여기에 몇 가지 더 캡처를 생성했습니다 https://www.dropbox.com/s/dtlvy1vi46x75it/iperf%2Bntttcp%2Bftp-pcaps-2014-07-03.zip
iperf
Windows에서 이전과 동일한 Linux 서버 (1.2.3.4)까지 두 개 더 : 하나는 128k 소켓 크기 및 기본 64k 창 (다시 ~ 5Mbit / s로 제한)과 1MB 전송 창 및 기본 8kb 소켓 크기. (더 큰 스케일)ntttcp
동일한 Windows 클라이언트에서 Server 2012R2 EC2 인스턴스 (1.2.3.5)까지 하나의 추적. 여기서 처리량은 잘 확장됩니다. 참고 : NTttcp는 포트 6001에서 테스트 연결을 열기 전에 이상한 일을합니다. 무슨 일이 일어나고 있는지 잘 모르겠습니다.- 하나의 FTP 데이터 추적으로
/dev/urandom
Cygwin을 사용하여 거의 동일한 Linux 호스트 (1.2.3.6)에 20MB를 업로드ncftp
합니다. 다시 한계가 있습니다. 패턴은 Windows Filezilla를 사용하는 것과 거의 동일합니다.
iperf
버퍼 길이를 변경하면 시간 시퀀스 그래프 (훨씬 더 많은 수직 섹션)와 예상되는 차이가 발생하지만 실제 처리량은 변경되지 않습니다.
netsh int tcp set global timestamps=enabled