Knowledge Ubuntu 16.04 - niska wydajność karty sieciowej

Silas Mariusz

rm -rf /
Help us, GOD!
Apr 5, 2008
10,355
34
2,801
153
40
Nowy Sącz
forum.qnap.net.pl
QNAP
TS-x77
Ethernet
1 GbE
Hey, ta informacja jest tylko notką dla osób korzystających z Ubuntu 16.04 na stacji wirtualizacji.

FYI
Problem nie leży po stronie QNAP, a po stronie samego Ubuntu 16.04.

Co to za problem?
System Ubuntu 16.04 postawiony na wirtualizacji w QNAP (KVM i QEMU) ma kłopoty z wydajnością karty sieciowej VirtIO, które objawia się spadkiem prędkości karty sieciowej. Zmiana na kartę sieciową Intel nie rozwiązuje problemu, zmiana na Realtek stabilizuje prace karty sieciowej, ale nie pozwala osiągnąć maksimum jej możliwości.

Jak wygląda ten problem - jego rezultat?
Przeprowadzony test prędkości za pomocą speedtest-cli i skryptu, który w tym celu napisałem.

Test został przeprowadzony w tym samym czasie na dwóch symetrycznych linkach po 100Mbit.

Prędkości które osiąga host - czyli QNAP - serwer wirtualizacji:
Code:
Ping: 22.5 ms       Upload:     11.4 Mbyte/s    Download:     11.2 Mbyte/s      17569) Multi-NET Infrastruktura Sp. z o.o. (Bielsko-Biała, PL) [124.51 km]
Ping: 17.9 ms       Upload:     11.6 Mbyte/s    Download:     10.6 Mbyte/s       3376) Fiberway Sp. z o.o. (Niepolomice, Poland) [58.58 km]
Ping: 26.8 ms       Upload:     11.4 Mbyte/s    Download:     10.4 Mbyte/s      10858) MULTINET 24 SP Z O.O. (Debica, Poland) [64.67 km]
Ping: 32.6 ms       Upload:     10.7 Mbyte/s    Download:      9.8 Mbyte/s       3670) inhost.pro (Debica, Poland) [64.67 km]
Ping: 33.2 ms       Upload:     11.6 Mbyte/s    Download:      7.6 Mbyte/s       8409) IT Systematic Group (Krosno, Poland) [70.73 km]
Ping: 31.7 ms       Upload:     11.9 Mbyte/s    Download:     10.0 Mbyte/s       6785) Stimo (Krosno, Poland) [70.73 km]
Ping: 27.7 ms       Upload:     11.2 Mbyte/s    Download:     10.5 Mbyte/s       9689) FIBERLINK Sp z o.o. (Mogilany, Poland) [71.10 km]

Prędkości, które osiąga gość - czyli maszyna wirtualna w tym wypadku Ubuntu 16.04, to:
Code:
Ping: 28.5 ms       Upload:      4.9 Mbyte/s    Download:      8.3 Mbyte/s      17569) Multi-NET Infrastruktura Sp. z o.o. (Bielsko-Biała, PL) [124.51 km]
Ping: 44.9 ms       Upload:      2.8 Mbyte/s    Download:      6.9 Mbyte/s      3376) Fiberway Sp. z o.o. (Niepolomice, Poland) [58.58 km]
Ping: 25.5 ms       Upload:     10.0 Mbyte/s    Download:      6.6 Mbyte/s      10858) MULTINET 24 SP Z O.O. (Debica, Poland) [64.67 km]
Ping: 37.7 ms       Upload:      8.9 Mbyte/s    Download:      7.6 Mbyte/s      3670) inhost.pro (Debica, Poland) [64.67 km]
Ping: 31.5 ms       Upload:      7.8 Mbyte/s    Download:      7.7 Mbyte/s      8409) IT Systematic Group (Krosno, Poland) [70.73 km]
Ping: 25.6 ms       Upload:      9.2 Mbyte/s    Download:      9.7 Mbyte/s      6785) Stimo (Krosno, Poland) [70.73 km]
Ping: 49.3 ms       Upload:      2.6 Mbyte/s    Download:      9.6 Mbyte/s      9689) FIBERLINK Sp z o.o. (Mogilany, Poland) [71.10 km]
--- widać znaczący spadek prędkości, który najbardziej jest widoczny w uploadzie.

Żeby było ciekawiej, ten sam test przeprowadziłem na kolejnym gościu, ale na maszynie wirtualnej z Ubuntu wersją 18.04 i prędkości są takie jak w hoście - czyli poprawne!


Dla Waszej informacji aktualizacja Kernel w Ubuntu 16.04 do ostatniej wersji absolutnie nie rozwiązuje problemu.
A więc jeśli, ktoś używa Ubuntu 16.04 na KVM/QEMU to niech się liczy z brakiem maksymalnej wydajności maszyny wirtualnej i to jest kwestia tego systemu.


BONUS:
Jeśli, ktoś chce na własną rękę wygenerować sobie taki raport prędkości z polskich serwerów speedtest to podaje źródło skryptu, które w tym celu napisałem (wymagany speedtest-cli - FYI można łatwo uruchomić na QNAP'ie... to tylko pythonowy skrypt):

1. Zainstaluj Pythona. Ja zainstalowałem z Entware.

2. Pobierz plik:
Bash:
wget http://pool.qnapclub.pl/projects/tools/speedtest-cli/speedtest-cli

3. Wygeneruj listę serwerów speedtest dla raportu na wszystkich serwerach:
Bash:
speedtest-cli --list | grep Poland | cut -d" " -f 1 | sed 's/)//' > speedtest.srv.list
(Upewnij się, że plik z listą na wszystkich maszynach jest identyczny...)

4. Utwórz plik speedtest.chart.gen.sh i nadaj mu odpowiednie wykonywalne uprawnienia chmod +x speedtest.chart.gen.sh:
Bash:
#!/bin/sh

/bin/echo -e "\n\nPerforming multiple speedtests... Please be patient!"

PATH=$PATH:.

CMD_SPEEDTEST="speedtest-cli"

CSV=speedtest.chart.csv
LST=speedtest.srv.list
SRV=speedtest.srv

[ -f "$CSV" ] && rm "$CSV" ; touch "$CSV"
[ -f "$SRV" ] && rm "$SRV" ; touch "$SRV"

$CMD_SPEEDTEST --list > "$SRV"

_IFS=$IFS
while IFS="" read -r p || [ -n "$p" ]
do
	PING="" 	 ; UPLOAD="" 	 ; DOWNLOAD="" ; # RESET VALUE

	SERVER=`cat $SRV | grep $p | grep -v "\[$p"`

	_SRV_SPEED_TEST=$($CMD_SPEEDTEST --simple --server $p --timeout 60 --bytes)
	PING=`printf "%s" "${_SRV_SPEED_TEST}" | grep Ping | cut -d" " -f 2`
	UPLOAD=`printf "%s" "${_SRV_SPEED_TEST}" | grep Upload | cut -d" " -f 2`
	DOWNLOAD=`printf "%s" "${_SRV_SPEED_TEST}" | grep Download | cut -d" " -f 2`

	if [ -n "$PING" ] && [ -n "$UPLOAD" ] && [ -n "$DOWNLOAD" ]; then
		# csv export
		echo "$p,$PING,$UPLOAD,$DOWNLOAD,\"$SERVER\"" >> $CSV

		# verbose output
		printf 'Ping: %4.1f ms		Upload: %8.1f Mbyte/s	Download: %8.1f Mbyte/s		%s' "$PING" "$UPLOAD" "$DOWNLOAD" "$SERVER"
		echo
	fi
done < $LST
IFS=$_IFS

4. Uruchom skrypt. Wynik będzie wyświetlany a także zapisany do pliku .csv.