Slow Start tuning nie tylko dla jądra 3.2
Napisał: Patryk Krawaczyński
22/04/2012 w Administracja, Debug 1 komentarz. (artykuł nr 347, ilość słów: 723)
W
edług protalu webhosting.pl od wersji 3.2 jądra Linuksa został zwiększony rozmiar okna ograniczenia przesyłu (ang. the initial congestion window) z 3 do 10. Sam Saffron po wykonaniu kilku testów udowodnił, że tuning mechanizmu Slow-start pozwala na przyśpieszenie ładowania strony WWW (jeśli zastosujemy zmiany na maszynie pełniącej rolę web serwera) nawet do 25% – bez żadnej ingerencji w warstwę aplikacji. Podobne testy przeprowadzili technicy wyszukiwarki Cheméo uzyskując w własnych warunkach 20% przyśpieszenie. Czy osoby pragnące wprowadzić podobne zmiany skazane są na oczekiwanie, aż popularne dystrybucje zaczną używać jądra w wersji 3.2 – jak np. Ubuntu 12.04?
Otóż nie. Okazuje się, że zmiany rozmiaru okna zostały już wprowadzone w jądrze w wersji 2.6.39. A, co z takimi dystrybucjami jak np. Debian 6.0 lub CentOS 6.2, które korzystają jeszcze z wersji 2.6.32 ? W celu osiągnięcia tych samych rezultatów mogą skorzystać z polecenia:
ip route change default via $MYGATEWAY dev $MYDEVICE initcwnd 10
Gdzie: $MYGATEWAY
to standardowa brama sieciowa oraz $MYDEVICE
to karta sieciowa podłączona do tej bramy.
[root@stardust ~]# ip route show | egrep ^default default via 91.121.72.254 dev eth0
Niestety ze względu na błąd polecenie to poprawnie zadziała tylko dla jądra Linuksa równego lub większego od wersji 2.6.30.
[root@stardust ~]# ip route show | egrep ^default default via 91.121.72.254 dev eth0 initcwnd 10
Poniżej zamieszczam wyniki mini testów dla głównej strony tego bloga, jakie wykonałem przy pomocy serwisu Pingdom Tools. Pierwszy test wykonywany był z initcwnd ustawionym na wartość 3. Kolejne dwa testy odbyły się już z wartością 10 (zmienna waga strony wynika z ładowania różnych zewnętrznych reklam pochodzących z serwisu AdTaily).
[initcwnd 03] Ilość żądań: 44 | czas ładowania: 1.92s | waga strony: 265.1 KB [initcwnd 10] Ilość żądań: 44 | czas ładowania: 604ms | waga strony: 265.1 KB [initcwnd 10] Ilość żądań: 44 | czas ładowania: 526ms | waga strony: 271.1 KB
Należy jednak zaznaczyć, że ustawienie większego initcwnd nie oznacza, że klient komunikujący się z serwerem zawsze skorzysta z tej wielkości. Wynika to z faktu, że podczas “potrójnego uścisku dłoni” serwer i klient przedstawiają rozmiary swoich okien – serwer congestion window
, a klient okna odbiorczego (ang. receive window aka RWIN), które określa w bajtach maksymalną ilość danych, które nadawca może wysłać bez otrzymywania potwierdzenia. Niezależnie, po której stronie wartość ta będzie mniejsza – zostanie ona przyjęta jako podstawa transmisji – nadawca nie może przekroczyć wielkości odbiorcy i na odwrót. Dlatego ograniczenie może występować zarówno po stronie serwera, jak i klienta (różne systemy posiadają różne wartości).
Receive window
w systemie Linux nazywa się initrwnd – i może zostać zmienione od wersji 2.6.33 poleceniem:
ip route change default via $MYGATEWAY dev $MYDEVICE initrwnd 10
Ciekawe podejście zaprezentowali Aaron Peters oraz Sajal Kayan – konsultanci od webowej wydajności prowadzący serwis CDN planet sugerując podniesienie zarówno initcwnd oraz initrwnd na serwerach pośredniczących np. frontowych maszynach serwujących obrazki, które obsługują żądania przeglądarek, a kontaktującymi się z backendem w razie cache missów np. serwery Varnishowe, czy Nginx cacheujące ruch do Apache (na których został podniesiony tylko rozmiar initcwnd):
[IE / Firefox / Chrome] <------------> [ CDN server ] <------------> [ Backend server ] -------| RWIN |-------------------| initcwnd |-| initrwnd |----------| initcwnd |------
Ustawienie dla serwera CDN możemy osiągnąć za pomocą polecenia:
ip route change default via $MYGATEWAY dev $MYDEVICE initrwnd 10 initcwnd 10
Autorzy serwisu przeprowadzili również serię testów różnych dostawców CDN i ich ustawień wielkości okna, z których wynika, że jeszcze nie wszystkie firmy uważają tą zmianę za konieczną. Tym bardziej, że zwiększenie initcwnd, jest jednym z wielu parametrów wydajności, jakie można zmienić w stosie sieciowym systemu Linux.
Więcej informacji: An Argument for Increasing TCP’s Inital Congestion Window
Okazuje się, że na powiększenie initcwnd jest również możliwe w systemie CentOS 5.8 (i wcześniejszych?), który używa jądra 2.6.18 (mimo niskiej wersji RedHat naprawia i dodaje funkcjonalności z wyższych wersji).