In einem WLAN-iperf-TCP-Durchsatztest erzielen mehrere parallele Streams einen höheren Durchsatz als ein Stream. Ich habe versucht, das TCP-Fenster zu vergrößern, kann aber immer noch nicht mit nur 1 Stream den maximalen Durchsatz erzielen. Gibt es noch etwas in der TCP-Schicht, das verhindert, dass die volle Verbindungskapazität genutzt wird?
Nach meiner Erfahrung liegt das Problem normalerweise beim Paketverlust, wenn Sie zwischen 1 TCP-Stream und mehreren TCP-Streams signifikant unterschiedliche Ergebnisse sehen. Das "andere" Element in der TCP-Schicht ist also die erneute Übertragung (aufgrund des Paketverlusts in der unteren Schicht).
Ein Beispiel, das ich zusammengestellt habe, um zu veranschaulichen, wie Paketverlust den Durchsatz eines einzelnen Streams beeinflusst ...
[Wifi||LAN-0.0%-Loss||LAN-2.0%-Loss]
+--------------+ +--------------+
| | | |
| Thinkpad-T61 |----------------------------------------| Linux Server |
| | | Tsunami |
+--------------+ +--------------+
iperf client ------------------> iperf server
Pushes data
Dies ist eine Tabelle, die die Testergebnisse eines 60-Sekunden- iperf
Tests zwischen einem Client und einem Server zusammenfasst. Es kann sein, dass die Iperf-Ergebnisse durch RTT-Jitter (dh höhere RTT-Standardabweichung) geringfügig abweichen. Der größte Unterschied ergab sich jedoch, als ich einen Verlust von 2% simulierte und die Client-Netzwerkkarte verdrahtete. 172.16.1.56 und 172.16.1.80 sind der gleiche Laptop (unter Ubuntu). Der Server ist 172.16.1.5 und läuft unter Debian. Ich habe netem auf dem Client-NIC verwendet, um den Paketverlust zu simulieren ...
Client IP Transport Loss avg RTT RTT StdDev TCP Streams Tput
----------- ---------- ---- ------- ---------- ----------- ----------
172.16.1.56 802.11g 0.0% 0.016s 42.0 1 19.5Mbps
172.16.1.56 802.11g 0.0% 0.016s 42.0 5 20.5Mbps
172.16.1.80 1000BaseT 0.0% 0.0002s 0.0 1 937 Mbps
172.16.1.80 1000BaseT 0.0% 0.0002s 0.0 5 937 Mbps
172.16.1.80 1000BaseT 2.0% 0.0002s 0.0 1 730 Mbps <---
172.16.1.80 1000BaseT 2.0% 0.0002s 0.0 5 937 Mbps
BEARBEITEN für Kommentarantworten :
Können Sie erklären, was im letzten Szenario passiert (1000BaseT, 5 Streams, 2,0% Verlust)? Obwohl es zu Paketverlusten kommt, ist der Gesamtdurchsatz immer noch mit 937 Mbit / s gesättigt.
Die meisten TCP-Implementierungen verringern ihr Überlastungsfenster, wenn ein Paketverlust festgestellt wird. Da wir netem verwenden , um einen Paketverlust von 2% vom Client zum Server zu erzwingen, werden einige Daten des Clients gelöscht. Der Nettoeffekt von netem in diesem Beispiel ist eine durchschnittliche Übertragungsrate von 730 Mbit / s für einen Datenstrom. Durch das Hinzufügen mehrerer Streams können die einzelnen TCP-Streams zusammenarbeiten, um die Verbindung zu sättigen.
Mein Ziel ist es, den höchstmöglichen TCP-Durchsatz über WLAN zu erzielen. Soweit ich weiß, sollte ich die Anzahl der Streams erhöhen, um dem durch Paketverlust verursachten Durchsatzrückgang entgegenzuwirken. Ist das richtig?
Ja
Ab wann wirken sich außerdem zu viele Streams negativ auf den Durchsatz aus? Würde dies durch begrenzten Arbeitsspeicher und / oder Rechenleistung verursacht?
Ohne weitere Experimente kann ich das nicht wirklich beantworten, aber bei 1GE-Verbindungen hatte ich nie ein Problem damit, eine Verbindung mit 5 parallelen Strömen zu sättigen. Damit Sie einen Eindruck davon bekommen, wie skalierbar TCP ist, können Linux-Server unter den richtigen Umständen über 1500 gleichzeitige TCP-Sockets verarbeiten . Dies ist eine weitere SO-Diskussion , die für die Skalierung von gleichzeitigen TCP-Sockets relevant ist. Meiner Meinung nach wäre jedoch alles über 20 parallele Sockets zu viel des Guten, wenn Sie lediglich versuchen, eine Verbindung zu sättigen.
Ich muss ein Missverständnis haben, dass iperf die Fenstergröße -w als Maximum verwendet, da es sich so anhört, als ob Sie sagen, dass es über diesen 21-KB-Anfangswert hinaus gewachsen ist
Ich habe es nicht benutzt iperf -w
, also denke ich, dass es ein Missverständnis gibt. Da Sie so viele Fragen zum WiFi-Fall haben, füge ich ein Wireshark-Diagramm des TCP-Durchsatzes für den WiFi-Fall eines einzelnen TCP-Streams hinzu.
Testdaten
Ich füge auch rohe Testdaten hinzu, falls Sie sehen möchten, wie ich diese Dinge gemessen habe ...
802.11g, 1 TCP-Stream
mpenning@mpenning-ThinkPad-T61:~$ mtr --no-dns --report \
--report-cycles 60 172.16.1.5
HOST: mpenning-ThinkPad-T61 Loss% Snt Last Avg Best Wrst StDev
1.|-- 172.16.1.5 0.0% 60 0.8 16.0 0.7 189.4 42.0
mpenning@mpenning-ThinkPad-T61:~$
[mpenning@tsunami]$ iperf -s -p 9000 -B 172.16.1.5
mpenning@mpenning-ThinkPad-T61:~$ iperf -c 172.16.1.5 -p 9000 -t 60 -P 1
------------------------------------------------------------
Client connecting to 172.16.1.5, TCP port 9000
TCP window size: 21.0 KByte (default)
------------------------------------------------------------
[ 3] local 172.16.1.56 port 40376 connected with 172.16.1.5 port 9000
[ ID] Interval Transfer Bandwidth
[ 3] 0.0-60.1 sec 139 MBytes 19.5 Mbits/sec
mpenning@mpenning-ThinkPad-T61:~$
802.11g, 5 TCP-Streams
[mpenning@tsunami]$ iperf -s -p 9001 -B 172.16.1.5
mpenning@mpenning-ThinkPad-T61:~$ iperf -c 172.16.1.5 -p 9001 -t 60 -P 5
------------------------------------------------------------
Client connecting to 172.16.1.5, TCP port 9001
TCP window size: 21.0 KByte (default)
------------------------------------------------------------
[ 3] local 172.16.1.56 port 37162 connected with 172.16.1.5 port 9001
[ 5] local 172.16.1.56 port 37165 connected with 172.16.1.5 port 9001
[ 7] local 172.16.1.56 port 37167 connected with 172.16.1.5 port 9001
[ 4] local 172.16.1.56 port 37163 connected with 172.16.1.5 port 9001
[ 6] local 172.16.1.56 port 37166 connected with 172.16.1.5 port 9001
[ ID] Interval Transfer Bandwidth
[ 3] 0.0-60.0 sec 28.0 MBytes 3.91 Mbits/sec
[ 5] 0.0-60.1 sec 28.8 MBytes 4.01 Mbits/sec
[ 4] 0.0-60.3 sec 28.1 MBytes 3.91 Mbits/sec
[ 6] 0.0-60.4 sec 34.0 MBytes 4.72 Mbits/sec
[ 7] 0.0-61.0 sec 30.5 MBytes 4.20 Mbits/sec
[SUM] 0.0-61.0 sec 149 MBytes 20.5 Mbits/sec
mpenning@mpenning-ThinkPad-T61:~$
1000BaseT, 1 Stream, 0,0% Verlust
mpenning@mpenning-ThinkPad-T61:~$ mtr --no-dns --report \
> --report-cycles 60 172.16.1.5
HOST: mpenning-ThinkPad-T61 Loss% Snt Last Avg Best Wrst StDev
1.|-- 172.16.1.5 0.0% 60 0.2 0.2 0.2 0.2 0.0
mpenning@mpenning-ThinkPad-T61:~$
[mpenning@tsunami]$ iperf -s -p 9002 -B 172.16.1.5
mpenning@mpenning-ThinkPad-T61:~$ iperf -c 172.16.1.5 -p 9002 -t 60 -P 1
------------------------------------------------------------
Client connecting to 172.16.1.5, TCP port 9002
TCP window size: 21.0 KByte (default)
------------------------------------------------------------
[ 3] local 172.16.1.80 port 49878 connected with 172.16.1.5 port 9002
[ ID] Interval Transfer Bandwidth
[ 3] 0.0-60.0 sec 6.54 GBytes 937 Mbits/sec
mpenning@mpenning-ThinkPad-T61:~$
1000BaseT, 5 Streams, 0,0% Verlust
[mpenning@tsunami]$ iperf -s -p 9003 -B 172.16.1.5
mpenning@mpenning-ThinkPad-T61:~$ iperf -c 172.16.1.5 -p 9003 -t 60 -P 5
------------------------------------------------------------
Client connecting to 172.16.1.5, TCP port 9003
TCP window size: 21.0 KByte (default)
------------------------------------------------------------
[ 7] local 172.16.1.80 port 47047 connected with 172.16.1.5 port 9003
[ 3] local 172.16.1.80 port 47043 connected with 172.16.1.5 port 9003
[ 4] local 172.16.1.80 port 47044 connected with 172.16.1.5 port 9003
[ 5] local 172.16.1.80 port 47045 connected with 172.16.1.5 port 9003
[ 6] local 172.16.1.80 port 47046 connected with 172.16.1.5 port 9003
[ ID] Interval Transfer Bandwidth
[ 4] 0.0-60.0 sec 1.28 GBytes 184 Mbits/sec
[ 5] 0.0-60.0 sec 1.28 GBytes 184 Mbits/sec
[ 3] 0.0-60.0 sec 1.28 GBytes 183 Mbits/sec
[ 6] 0.0-60.0 sec 1.35 GBytes 193 Mbits/sec
[ 7] 0.0-60.0 sec 1.35 GBytes 193 Mbits/sec
[SUM] 0.0-60.0 sec 6.55 GBytes 937 Mbits/sec
mpenning@mpenning-ThinkPad-T61:~$
1000BaseT, 1 Streams, 2,0% Verlust
mpenning@mpenning-ThinkPad-T61:~$ sudo tc qdisc add dev eth0 root netem corrupt 2.0%
mpenning@mpenning-ThinkPad-T61:~$ mtr --no-dns --report --report-cycles 60 172.16.1.5
HOST: mpenning-ThinkPad-T61 Loss% Snt Last Avg Best Wrst StDev
1.|-- 172.16.1.5 1.7% 60 0.2 0.2 0.2 0.2 0.0
mpenning@mpenning-ThinkPad-T61:~$
[mpenning@tsunami]$ iperf -s -p 9004 -B 172.16.1.5
mpenning@mpenning-ThinkPad-T61:~$ iperf -c 172.16.1.5 -p 9004 -t 60 -P 1
------------------------------------------------------------
Client connecting to 172.16.1.5, TCP port 9004
TCP window size: 42.0 KByte (default)
------------------------------------------------------------
[ 3] local 172.16.1.80 port 48910 connected with 172.16.1.5 port 9004
[ ID] Interval Transfer Bandwidth
[ 3] 0.0-64.1 sec 5.45 GBytes 730 Mbits/sec
mpenning@mpenning-ThinkPad-T61:~$
1000BaseT, 5 Streams, 2,0% Verlust
[mpenning@tsunami]$ iperf -s -p 9005 -B 172.16.1.5
mpenning@mpenning-ThinkPad-T61:~$ iperf -c 172.16.1.5 -p 9005 -t 60 -P 5
------------------------------------------------------------
Client connecting to 172.16.1.5, TCP port 9005
TCP window size: 21.0 KByte (default)
------------------------------------------------------------
[ 7] local 172.16.1.80 port 50616 connected with 172.16.1.5 port 9005
[ 3] local 172.16.1.80 port 50613 connected with 172.16.1.5 port 9005
[ 5] local 172.16.1.80 port 50614 connected with 172.16.1.5 port 9005
[ 4] local 172.16.1.80 port 50612 connected with 172.16.1.5 port 9005
[ 6] local 172.16.1.80 port 50615 connected with 172.16.1.5 port 9005
[ ID] Interval Transfer Bandwidth
[ 3] 0.0-60.0 sec 1.74 GBytes 250 Mbits/sec
[ 7] 0.0-60.0 sec 711 MBytes 99.3 Mbits/sec
[ 4] 0.0-60.0 sec 1.28 GBytes 183 Mbits/sec
[ 6] 0.0-60.0 sec 1.59 GBytes 228 Mbits/sec
[ 5] 0.0-60.0 sec 1.24 GBytes 177 Mbits/sec
[SUM] 0.0-60.0 sec 6.55 GBytes 937 Mbits/sec
mpenning@mpenning-ThinkPad-T61:~$
Entfernen Sie die Paketverlustsimulation
mpenning@mpenning-ThinkPad-T61:~$ sudo tc qdisc del dev eth0 root