Senaryo: Düzenli olarak büyük dosyaları (FTP / SVN / HTTP PUT / SCP) ~ 100-160ms uzaklıktaki Linux sunucularına yükleyen çok sayıda Windows istemcisi var. Ofiste 1Gbit / s senkron bant genişliğine sahibiz ve sunucular ya AWS örnekleri ya da fiziksel olarak ABD DC'lerinde barındırılıyor.
İlk rapor, yeni bir sunucuya yapılan yüklemelerin olabileceğinden çok daha yavaş olmasıydı. Bu testte ve birden fazla yerden çıktı; istemciler, Windows sistemlerinden ana bilgisayara 2-5Mbit / s hızında karar veriyorlardı.
iperf -s
Bir AWS örneğinde ve ardından ofisteki bir Windows istemcisinden ayrıldım :
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
İkinci rakam, sonraki testlerde (AWS'in Değişkenleri) önemli ölçüde değişebilir, ancak genellikle ihtiyaçlarımız için fazlasıyla yeterli olan 70 ile 130Mbit / s arasındadır. Wiresharking oturumu, görebiliyorum:
iperf -c
Windows SYN - Pencere 64kb, Ölçek 1 - Linux SYN, ACK: Pencere 14kb, Ölçek: 9 (* 512)iperf -c -w1M
Windows SYN - Windows 64kb, Ölçek 1 - Linux SYN, ACK: Pencere 14kb, Ölçek: 9
Açıkçası, bağlantı bu yüksek verimi sürdürebilir, ancak çoğu gerçek dünya uygulamalarının yapmama izin vermeyeceği herhangi bir kullanım için pencere boyutunu belirlemem gerekiyor. TCP el sıkışmaları her durumda aynı başlangıç noktalarını kullanır, ancak zorunlu ölçekler
Tersine, aynı ağdaki bir Linux istemcisinden doğrudan bir iperf -c
((varsayılan 85kb sistemi kullanarak) bana verir:
[ 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
Herhangi bir zorlama olmadan, beklendiği gibi ölçeklenir. Bu araya giren atlamalarda veya yerel anahtarlarımızda / yönlendiricilerimizde bir şey olamaz ve aynı şekilde Windows 7 ve 8 istemcilerini de etkiler. Otomatik ayarlama konusunda birçok kılavuz okudum, ancak bunlar genellikle kötü korkunç ev ağı kitinin etrafında çalışmak için ölçeklendirmenin tamamen devre dışı bırakılmasıyla ilgilidir.
Biri bana burada neler olduğunu söyleyebilir ve düzeltmem için bir yol verebilir mi? (Tercihen GPO aracılığıyla kayıt defterine yapabileceğim bir şey.)
notlar
Söz konusu AWS Linux örneğinde, aşağıdaki çekirdek ayarları uygulanır 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
Diğer olası darboğazları ekarte etmek ve kaldırmak için sunucuya dd if=/dev/zero | nc
yönlendirmeyi kullandım , ancak sonuçlar aynı. Testler ile (Cygwin, Doğal Windows, Linux) kendi platformlarda yukarıdaki iperf testlerinin hemen hemen aynı şekilde ölçeklendirilirler./dev/null
iperf
ncftp
Düzenle
Burada alakalı olabilecek başka bir tutarlı şey tespit ettim:
Bu, yakınlaştırılan 1 MB'lik yakalamanın ilk saniyesidir, yakınlaştırılır. Pencere genişlediğinde ve arabellek büyüdükçe, Yavaş Başlat eylemini görebilirsiniz . Daha sonra , varsayılan pencere iperf testinin sonsuza dek düzleştiği noktada tam olarak ~ 0.2s'lik bu küçük plato var . Elbette bu, çok fazla baş dönmesi yüksekliğine kadar ölçeklenir, ancak ölçeklemede bu duraklamanın (Değerler 1022bayt * 512 = 523264) ondan önce olması ilginçtir.
Güncelleme - 30 Haziran.
Çeşitli cevapları takip etmek:
- CTCP'yi Etkinleştirmek - Bu fark yaratmaz; pencere ölçeklendirmesi aynıdır. (Bunu doğru anlarsam, bu ayar ulaşabileceği maksimum boyut yerine tıkanıklık penceresinin büyütülme oranını artırır)
- TCP zaman damgalarını etkinleştirme. - Burada da değişiklik yok.
- Nagle algoritması - Bu mantıklı ve en azından grafikteki belirli patlamaları sorunun herhangi bir göstergesi olarak görmezden gelebileceğim anlamına geliyor.
- pcap dosyaları: burada mevcut Zip dosyası: https://www.dropbox.com/s/104qdysmk01lnf6/iperf-pcaps-10s-Win%2BLinux-2014-06-30.zip (bittwiste ile açıklanmadığı anonim, orada olduğu gibi ~ 150MB için ayıklar Karşılaştırma için her işletim sistemi istemcisinden bir tane)
Güncelleme 2 - 30 Haziran
Öyleyse Kyle'ın önerisine göre, ctcp ve devre dışı baca boşaltımını etkinleştirdim: 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
Fakat ne yazık ki, verimde değişiklik yok.
Burada bir neden / sonuç sorum var: Grafikler, sunucunun ACK'larında istemciye ayarlanan RWIN değerinde. Windows istemcileriyle, müşterinin sınırlı CWIN’inin bu arabellek doldurulmasını bile önlediği için Linux’un bu değeri bu düşük noktadan daha fazla ölçeklemediğini düşünüyorum. Linux'un RWIN'i yapay olarak sınırlandırmasının başka bir nedeni olabilir mi?
Not: Bu cehennem için ECN'yi açmayı denedim; ama değişiklik yok, orada.
Güncelleme 3 - 31 Haziran.
Sezgisel tarama ve RWIN otomatik ayarlama işlevini devre dışı bıraktıktan sonra değişiklik yok. Functioanlity tweaks viadevice manager sekmelerini açığa çıkaran bir yazılımla Intel ağ sürücülerini en son (12.10.28.0) sürümüne yükseltin. Kart bir 82579V Chipset onboard NIC'dir - (Realtek veya diğer satıcılara sahip müşterilerden biraz daha test yapacağım)
Bir an için NIC'e odaklanarak, aşağıdakileri denedim (Çoğunlukla sadece olası suçluları dışlamak):
- Alma arabelleklerini 256'dan 2k'ye ve arabellekleri 512'den 2k'ye çıkar (Her ikisi de maksimumda) - Değişiklik yok
- Tüm IP / TCP / UDP sağlama toplamı boşaltmasını devre dışı bıraktı. - Değişiklik yok.
- Engelli Büyük Gönderme Boşaltma - Nada.
- IPv6'yı kapattı, QoS planlaması - Nowt.
Güncelleme 3 - 3 Temmuz
Linux sunucu tarafını ortadan kaldırmaya çalışırken, bir Server 2012R2 örneği başlattım ve iperf
(cygwin binary) ve NTttcp kullanarak testleri tekrarladım .
Bununla birlikte iperf
, bağlantının ~ 5Mbit / s'nin ötesine ölçeklenmesi -w1m
için her iki tarafta da açıkça belirtmem gerekiyordu . (Bu arada, kontrol edilebiliyordum ve 91 ms gecikmeyle ~ 5Mbit'lik BDP neredeyse tam 64kb. Limiti belirle ...)
Ntttcp ikili dosyaları şimdi böyle bir sınırlama gösterdi. Kullanılması ntttcpr -m 1,0,1.2.3.5
sunucuda ve ntttcp -s -m 1,0,1.2.3.5 -t 10
istemci üzerinde, çok daha iyi verim görebilirsiniz:
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çıkça büyük pencerelerle aldığım seviyelere yerleştiriyor iperf
. İşin garibi olsa da, 1273 tamponda 80MB = tekrar 64 kb tamponu. Bir başka wireshark, sunucudan geri dönen iyi, değişken bir RWIN'i gösterir (Ölçek faktörü 256), müşterinin yerine getirdiği görülüyor; belki de ntttcp gönderme penceresini yanlış rapor ediyordur.
Güncelleme 4 - 3 Temmuz
@ Karyhead'in isteği üzerine biraz daha test yaptım ve birkaç tane daha yaka yakaladım, burada: https://www.dropbox.com/s/dtlvy1vi46x75it/iperf%2Bntttcp%2Bftp-pcaps-2014-07-03.zip
- Her
iperf
ikisi de Windows’tan önceki Linux sunucusundan aynı Linux sunucusuna (1.2.3.4): 128k Soket boyutu ve varsayılan 64k penceresine sahip bir tane (tekrar ~ 5Mbit / s ile sınırlandırılır) ve 1 MB gönderme penceresi ve varsayılan 8kb soket ile bir tane daha boyut. (daha yüksek ölçekler) - Bir
ntttcp
Sunucu 2012R2 EC2 örneği (1.2.3.5) için aynı Windows istemciden iz. Burada, verim iyi ölçeklenir. Not: NTttcp, test bağlantısını açmadan önce 6001 numaralı bağlantı noktasında garip bir şey yapar. Orada neler olduğundan emin değilim. - Bir FTP veri izi,
/dev/urandom
Cygwin'i kullanarak yaklaşık aynı linux ana bilgisayara 20 MB yükleyerek (1.2.3.6)ncftp
. Yine sınırı var. Kalıp, Windows Filezilla kullanılarak aynıdır.
iperf
Tampon uzunluğunu değiştirmek, zaman dizisi grafiğindeki beklenen farkı yaratır (çok daha fazla dikey bölüm), ancak gerçek verimlilik değişmez.
netsh int tcp set global timestamps=enabled