Skenario: Kami memiliki sejumlah klien Windows yang secara teratur mengunggah file besar (FTP / SVN / HTTP PUT / SCP) ke server Linux yang ~ 100-160ms jauhnya. Kami memiliki bandwidth sinkron 1Gbit / s di kantor dan server adalah instance AWS atau di-host secara fisik di US DC.
Laporan awal adalah bahwa unggahan ke instance server baru jauh lebih lambat daripada yang seharusnya. Ini membosankan dalam pengujian dan dari berbagai lokasi; klien melihat stabil 2-5Mbit / s ke host dari sistem Windows mereka.
Saya pecah iperf -s
pada contoh AWS dan kemudian dari klien Windows di kantor:
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
Angka terakhir dapat bervariasi secara signifikan pada tes berikutnya, (Vagaries of AWS) tetapi biasanya antara 70 dan 130Mbit / s yang lebih dari cukup untuk kebutuhan kita. Wiresharking sesi, saya bisa melihat:
iperf -c
Windows SYN - Window 64kb, Skala 1 - Linux SYN, ACK: Window 14kb, Skala: 9 (* 512)iperf -c -w1M
Windows SYN - Windows 64kb, Skala 1 - Linux SYN, ACK: Jendela 14kb, Skala: 9
Jelas tautan tersebut dapat mempertahankan throughput yang tinggi ini, tetapi saya harus secara eksplisit mengatur ukuran jendela untuk memanfaatkannya, yang tidak akan membiarkan saya melakukannya oleh sebagian besar aplikasi dunia nyata. Jabat tangan TCP menggunakan titik awal yang sama dalam setiap kasus, tetapi yang dipaksakan skala
Sebaliknya, dari klien Linux pada jaringan yang sama secara langsung, iperf -c
(menggunakan sistem default 85kb) memberi saya:
[ 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
Tanpa paksaan, itu berskala seperti yang diharapkan. Ini tidak bisa menjadi sesuatu dalam hop intervening atau switch / router lokal kami dan tampaknya mempengaruhi klien Windows 7 dan 8 sama. Saya telah membaca banyak panduan tentang penyetelan otomatis, tetapi ini biasanya tentang menonaktifkan penskalaan untuk bekerja di sekitar perangkat jaringan rumah yang buruk.
Adakah yang bisa memberi tahu saya apa yang terjadi di sini dan memberi saya cara untuk memperbaikinya? (Lebih disukai sesuatu yang bisa saya tempel ke registri melalui GPO.)
Catatan
Contoh AWS Linux yang bersangkutan memiliki pengaturan kernel berikut diterapkan di 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
Saya telah menggunakan dd if=/dev/zero | nc
pengalihan ke /dev/null
di ujung server untuk mengesampingkan iperf
dan menghapus kemungkinan hambatan lainnya, tetapi hasilnya hampir sama. Pengujian dengan ncftp
(Cygwin, Native Windows, Linux) memiliki skala yang hampir sama dengan tes iperf di atas pada platform masing-masing.
Sunting
Saya telah melihat hal lain yang konsisten di sini yang mungkin relevan:
Ini adalah detik pertama dari tangkapan 1MB, diperbesar. Anda dapat melihat Slow Start beraksi saat jendela naik dan buffer bertambah besar. Lalu ada dataran kecil ~ 0.2s ini tepat pada titik bahwa tes iperf jendela default rata selamanya. Yang satu ini tentu saja mencapai ketinggian yang jauh lebih tinggi, tetapi aneh bahwa ada jeda dalam penskalaan (Nilai adalah 1022bytes * 512 = 523264) sebelum melakukannya.
Pembaruan - 30 Juni.
Menindaklanjuti berbagai tanggapan:
- Mengaktifkan CTCP - Ini tidak ada bedanya; penskalaan jendela identik. (Jika saya mengerti ini dengan benar, pengaturan ini meningkatkan kecepatan di mana jendela kemacetan diperbesar daripada ukuran maksimum yang bisa dicapai)
- Mengaktifkan cap waktu TCP. - Tidak ada perubahan di sini juga.
- Algoritma Nagle - Itu masuk akal dan setidaknya itu berarti saya mungkin dapat mengabaikan blip tertentu dalam grafik sebagai indikasi masalah.
- file pcap: File zip tersedia di sini: https://www.dropbox.com/s/104qdysmk01lnf6/iperf-pcaps-10s-Win%2BLinux-2014-06-30.zip (Dianonimkan dengan bittwiste, ekstrak ke ~ 150MB karena ada ~ 150MB karena ada satu dari setiap klien OS untuk perbandingan)
Pembaruan 2 - 30 Juni
O, jadi ikuti op saran Kyle, saya sudah mengaktifkan ctcp dan menonaktifkan pemuatan cerobong: 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
Namun sayangnya, tidak ada perubahan dalam throughput.
Saya punya pertanyaan sebab / akibat di sini, meskipun: Grafik adalah dari nilai RWIN yang ditetapkan dalam ACK server ke klien. Dengan klien Windows, apakah saya benar berpikir bahwa Linux tidak mengubah nilai ini di luar titik rendah itu karena CWIN yang terbatas dari klien bahkan mencegah buffer untuk diisi? Mungkinkah ada beberapa alasan lain bahwa Linux secara buatan membatasi RWIN?
Catatan: Saya sudah mencoba menyalakan ECN untuk itu; tapi tidak ada perubahan, di sana.
Pembaruan 3 - 31 Juni.
Tidak ada perubahan setelah menonaktifkan heuristik dan autotuning RWIN. Telah memperbarui driver jaringan Intel ke yang terbaru (12.10.28.0) dengan perangkat lunak yang memaparkan tab tweak viadevice manajer fungsi. Kartu ini adalah chipset on-board 82579V NIC - (Saya akan melakukan beberapa pengujian lagi dari klien dengan realtek atau vendor lain)
Berfokus pada NIC sejenak, saya sudah mencoba yang berikut (Kebanyakan hanya mengesampingkan penyebab yang tidak mungkin):
- Tingkatkan buffer yang diterima menjadi 2k dari 256 dan kirimkan buffer ke 2k dari 512 (Keduanya sekarang maksimum) - Tidak ada perubahan
- Menonaktifkan semua pembongkaran checksum IP / TCP / UDP. - Tidak ada perubahan.
- Dinonaktifkan Besar Kirim Offload - Nada.
- Mematikan IPv6, penjadwalan QoS - Nowt.
Perbarui 3 - 3 Juli
Mencoba menghilangkan sisi server Linux, saya memulai contoh Server 2012R2 dan mengulangi pengujian menggunakan iperf
(cygwin binary) dan NTttcp .
Dengan iperf
, saya harus menentukan secara eksplisit -w1m
di kedua sisi sebelum koneksi akan melebihi ~ 5Mbit / s. (Kebetulan, saya bisa diperiksa dan BDP ~ 5Mbits pada latensi 91ms hampir persis 64kb. Cari batasnya ...)
Binari ntttcp sekarang menunjukkan batasan seperti itu. Menggunakan ntttcpr -m 1,0,1.2.3.5
di server dan ntttcp -s -m 1,0,1.2.3.5 -t 10
di klien, saya bisa melihat throughput yang jauh lebih baik:
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 menempatkannya di tingkat yang saya dapatkan dengan jendela besar secara eksplisit iperf
. Anehnya, 80MB pada 1273 buffer = buffer 64kB lagi. Wireshark lebih lanjut menunjukkan RWIN yang baik dan variabel yang kembali dari server (Scale factor 256) yang tampaknya dipenuhi oleh klien; jadi mungkin ntttcp salah melaporkan jendela kirim.
Perbarui 4 - 3 Juli
Atas permintaan @ karyhead, saya telah melakukan beberapa pengujian lagi dan membuat beberapa tangkapan lagi, di sini: https://www.dropbox.com/s/dtlvy1vi46x75it/iperf%2Bntttcp%2Bftp-pcaps-2014-07-03.zip
- Dua lagi
iperf
, keduanya dari Windows ke server Linux yang sama seperti sebelumnya (1.2.3.4): Satu dengan ukuran 128k Socket dan jendela 64k default (membatasi hingga ~ 5Mbit / dtk lagi) dan satu dengan jendela kirim 1MB dan soket standar 8kb ukuran. (skala lebih tinggi) - Satu
ntttcp
jejak dari klien Windows yang sama ke instance Server 2012R2 EC2 (1.2.3.5). di sini, throughputnya berskala baik. Catatan: NTttcp melakukan sesuatu yang aneh pada port 6001 sebelum membuka koneksi tes. Tidak yakin apa yang terjadi di sana. - Satu jejak data FTP, mengunggah 20MB
/dev/urandom
ke host linux yang hampir identik (1.2.3.6) menggunakan Cygwinncftp
. Sekali lagi batasnya ada di sana. Polanya hampir sama menggunakan Windows Filezilla.
Mengubah iperf
panjang buffer memang membuat perbedaan yang diharapkan ke grafik urutan waktu (lebih banyak bagian vertikal), tetapi throughput aktual tidak berubah.
netsh int tcp set global timestamps=enabled