NFsec Logo

Slow Start tuning nie tylko dla jądra 3.2

22/04/2012 w Administracja, Debug 1 komentarz.  (artykuł nr 345, 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

Kategorie K a t e g o r i e : Administracja, Debug

Tagi T a g i : , , , , , , ,

1 komentarz.

  1. Patryk Krawaczyński napisał(a):

    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.

    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).

Zostaw odpowiedź.

Musisz być zalogowany by móc komentować.