Grupa ćwicz. 4 |
Grupa lab. 7 |
Zespół. 6 |
Data wykonania. 21.03.2014 r. |
Data odbioru |
Nr ćwicz./ wersja 6 |
Temat ćwiczenia. Optymalizacja serwerów www |
|||
Imiona i nazwiska. Konrad Rugała, Mariusz Równy, Krzysztof Sobieraj |
Ocena i uwagi |
Wstęp
Serwer www jest to oprogramowanie odpowiedzialne za obsługiwanie zapytań klienta. Odszukuje odpowiednie pliki bądź uruchamia skrypty i zwraca ich wyniki klientowi. Główne oprogramowanie do stawiania serwerów www to APACHE, LIGHTTPD, NCSA, CERN. Serwery te zazwyczaj pracują na maszynach z systemem operacyjnym na bazie UNIXa.
Najpopularniejszym oprogramowaniem serwerowym jest Apache, ze względu na swoją darmową licencję, która w połączeniu z darmowym systemem operacyjnym pozwala na uruchomienie własnego serwera bez jakichkolwiek kosztów. Apache wykorzystuje protokół http do udostępniania dokumentów, plików i informowania o wyborach klienta czy odpowiedziach serwera. Apache udostępnia kod źródłowy oraz cieszy się ostatnimi laty ogromną popularnością (według różnych źródeł około 50% z wszystkich wykorzystywanych serwerów) pośród zwykłych użytkowników i różnej wielkości przedsiębiorstw.
Apache posiada modułową budową oraz współpracą z wieloma językami programowania i bazami danych - m.in. PHP, MySQL itp. Pomimo wielu swoich niedoskonałości - np. podatność na ataki typu DoS - jest nieustannie rozwijany i wykorzystywany jako środowisko, na którym działa wiele popularnych stron i sklepów internetowych czy for dyskusyjnych. Kolejną, bardzo ważną zaletą jest jego przenośność. Jest dostępny dla systemów operacyjnych Windows, Linux i Mac OS. Wiele możliwości konfiguracyjnych, które on posiada, są dostępne w graficznym interfejsie użytkownika, który jest dostępny w nowszych wersjach programu.
Serwer www powinien:
- obsługiwać dużą ilość zadań jednocześnie
- pracować możliwe szybko nie powodując zbytnich obciążeń komputera, na którym jest uruchomiony
- monitorować użytkowników
- udostępniać różne rodzaje formatów
Do konfiguracji Apache możemy wykorzystać interfejs graficzny dostarczany z nowszymi wersjami bądź dokonując konfiguracji zmieniając intuicyjne parametry pliku /etc/apache2/server-tuning.conf
Oto fragment przykładowego zrzutu ekranu pliku konfiguracyjnego:
Do edycji pliku użyliśmy edytora tekstowego VIM, który jest darmowym oprogramowaniem (producent zachęca do donacji na cele charytatywne) bardzo przyjaznym użytkownikowi. Jak widać na załączonym obrazku posiada bardzo wiele opcji podświetleń, które ułatwiają pracę.
Program ApacheBench – jest to program typu Benchmark czyli oprogramowanie do testowania sprzętu i innych aplikacji. Jest dołączony do serwera Apache. Jego działanie polega na wysyłaniu dużych ilości zapytań i testowaniu sprawności serwera. Pozwala ocenić jak serwer radzi sobie z różnym ilościami zapytań, jak szybko na nie odpowiada czy ile hostów w ciągu jednej sekundy może obsłużyć. Dzięki temu oprogramowaniu możemy łatwo stwierdzić jakie obciążenie maksymalnie może znieść sprzęt (oraz połączenie sieciowe) na którym pracuje serwer. Dzięki temu wiemy w jakich sytuacjach nasz serwer będzie pracował wydajnie oraz czy konieczne są jakieś zmiany sprzętowe. Program ten odpalamy z wiersza poleceń (terminala) następującą komendą:
ab2 –n ilość_zapytań –c ilość_równoległych_zapytań adres_serwera
Przykładowe polecenia jakie wykorzystywaliśmy na ćwiczeniach:
Część praktyczna
Do wykonania ćwiczenia zostały użyte trzy komputery klasy PC w laboratorium komputerowym z system na licencji GNU GPL: OpenSUSE w wersji 11.
Oprogramowanie wykorzystane do wykonania ćwiczenia:
Apache2 – serwer www
ab2 – benchmark
VIM – edytor tekstu, wykorzystany do edycji plików konfiguracyjnych
Mozilla Firefox – przeglądarka internetowa do sprawdzenia działania serwera www
Dodatkowo użyty został program do robienia zrzutów ekranu dostarczony z system operacyjnym oraz program 7-zip do skompresowania zrzutów ekranów przed zapisem.
Zadania zostały wykonane na osobnych komputerach oraz rozdzielone w następujący sposób:
Krzysztof Sobieraj – testowanie parametrów KeepAliveTimeout, MaxSpareServers
Mariusz Równy – testowanie parametrów MinSpareServers, MaxSpareThreads
Konrad Rugała – testowanie parametrów MinSpareThreads, MaxRequestPerChild
Oprócz tego na każdym komputerze zostały przeprowadzone testy dla parametrów standardowych programu Apache. Parametry były testowane w następujący sposób:
Parametr/opcja - apache | Wartość domyślna | wartości zmienione |
---|---|---|
KeepAliveTimeout | 15 | 5 |
MaxSpareServers | 10 | 5 |
MinSpareServers | 5 | 3 |
MaxSpareThreads | 75 | 55 |
MinSpareThreads | 25 | 15 |
MaxRequestsPerChild | 10000 | 8000 |
Po każdej zmianie parametrów serwer był ponownie uruchamiany w celu zastosowania nowych parametrów.
Po ponownym uruchomieniu można było sprawdzić poprawność działania łącząc się w przeglądarce z adresem http://localhost jednak nie było to konieczne gdyż program ab2 nie był w stanie przeprowadzać testów jeżeli serwer nie był uruchomiony.
Zrzuty ekranów z przebiegu pracy:
Stanowisko pracy:
Kilka zrzutów ekranów z działania programu ab2.
Ze względu na fakt, że wszystkie zrzuty ekranów z pracy programu ab2 różnią się jedynie wynikami oraz, że informacje na temat parametrów jakie zostały zmienione znajdują się w nazwach plików nie umieszczamy wielu zrzutów ekranów. Wszystkie pliki graficzne w formatach .png zostały zapisane w serwisie chomikuj.pl i są dostępne pod linkiem http://chomikuj.pl/xkonradox/SIECI+KOMPUTEROWE który nie wygaśnie. Znajdują się tam również wszystkie dane zebrane tabelach programu Excel.
O to zebrane dane:
pomiary dla parametrów standardowych (Krzysiek) | Time taken for tests [s] | Requests per second [#/s] | Time per request [ms] (mean) | Time per request [ms] (mean, across all conc. Req) |
---|---|---|---|---|
requests | concurent requests | |||
1000 | 300 | 0,623 | 1605,52 | 186,856 |
3000 | 12,478 | 240,42 | 1247,815 | |
6000 | 0,63 | 9530,53 | 31,478 | |
10000 | 4,342 | 2302,95 | 130,268 | |
13000 | 9,586 | 1356,2 | 221,206 | |
16000 | 8,487 | 1885,34 | 159,122 | |
20000 | 10,752 | 1860,03 | 161,287 |
pomiary dla parametrów standardowych (Marek) | Time taken for tests [s] | Requests per second [#/s] | Time per request [ms] (mean) | Time per request [ms] (mean, across all conc. Req) |
---|---|---|---|---|
requests | concurent requests | |||
1000 | 300 | 0,623 | 1604,68 | 186,954 |
3000 | 5,844 | 513,39 | 584,356 | |
6000 | 6,704 | 895,01 | 335,192 | |
10000 | 7,184 | 1391,97 | 215,521 | |
13000 | 2,161 | 6016,9 | 49,86 | |
16000 | 1,957 | 8175,87 | 36,693 | |
20000 | 2,327 | 8595,75 | 34,901 |
pomiary dla parametrów standardowych (Konrad) | Time taken for tests [s] | Requests per second [#/s] | Time per request [ms] (mean) | Time per request [ms] (mean, across all conc. Req) |
---|---|---|---|---|
requests | concurent requests | |||
1000 | 300 | 0,622 | 1608,43 | 186,517 |
3000 | 1,437 | 2087,63 | 143,704 | |
6000 | 15,395 | 389,75 | 769,728 | |
10000 | 4,949 | 2020,55 | 148,475 | |
13000 | 13,556 | 958,95 | 312,841 | |
16000 | 3,435 | 4657,9 | 64,407 | |
20000 | 7,089 | 2821,08 | 106,342 |
pomiary dla parametru KeepAliveTimeout = 5 | Time taken for tests [s] | Requests per second [#/s] | Time per request [ms] (mean) | Time per request [ms] (mean, across all conc. Req) |
---|---|---|---|---|
requests | concurent requests | |||
1000 | 300 | 0,626 | 1597,72 | 187,768 |
3000 | 6,659 | 450,5 | 665,923 | |
6000 | 16,986 | 535,23 | 849,311 | |
10000 | 14,12 | 708,2 | 423,61 | |
13000 | 11,243 | 1156,26 | 259,456 | |
16000 | 10,024 | 1596,24 | 187,941 | |
20000 | 11,489 | 1740,73 | 172,342 | |
pomiary dla parametru KeepAliveTimeout = 10 | Time taken for tests [s] | Requests per second [#/s] | Time per request [ms] (mean) | Time per request [ms] (mean, across all conc. Req) |
requests | concurent requests | |||
1000 | 300 | 8,949 | 111,74 | 2684,783 |
3000 | 8,611 | 348,39 | 861,106 | |
6000 | 8,209 | 730,88 | 410,466 | |
10000 | 10,188 | 981,54 | 305,642 | |
13000 | 8,398 | 1547,97 | 193,802 | |
16000 | 6,554 | 2441,27 | 122,887 | |
20000 | 4,965 | 4028,07 | 74,477 | |
pomiary dla parametru KeepAliveTimeout = 20 | Time taken for tests [s] | Requests per second [#/s] | Time per request [ms] (mean) | Time per request [ms] (mean, across all conc. Req) |
requests | concurent requests | |||
1000 | 300 | 8,159 | 122,56 | 2447,706 |
3000 | 10,011 | 299,66 | 1001,131 | |
6000 | 11,684 | 513,53 | 584,189 | |
10000 | 1,053 | 9493,66 | 31,6 | |
13000 | 1,344 | 9675,24 | 31,007 | |
16000 | 7,965 | 2008,88 | 149,337 | |
20000 | 2,147 | 9314,89 | 32,206 | |
pomiary dla parametru KeepAliveTimeout = 25 | Time taken for tests [s] | Requests per second [#/s] | Time per request [ms] (mean) | Time per request [ms] (mean, across all conc. Req) |
requests | concurent requests | |||
1000 | 300 | 2,255 | 443,46 | 676,502 |
3000 | 21,943 | 136,72 | 2194,313 | |
6000 | 7,712 | 777,97 | 385,618 | |
10000 | 8,57 | 1166,93 | 257,085 | |
13000 | 12,192 | 1066,27 | 281,355 | |
16000 | 10,368 | 1543,17 | 194,405 | |
20000 | 2,434 | 8217,37 | 36,508 | |
pomiary dla parametru MaxSpareServers = 5 | Time taken for tests [s] | Requests per second [#/s] | Time per request [ms] (mean) | Time per request [ms] (mean, across all conc. Req) |
requests | concurent requests | |||
1000 | 300 | 7,483 | 133,63 | 2244,964 |
3000 | 18,731 | 160,17 | 1873,05 | |
6000 | 15,154 | 395,93 | 757,704 | |
10000 | 3,959 | 2525,83 | 118,773 | |
13000 | 17,013 | 764,1 | 392,618 | |
16000 | 14,855 | 1077,05 | 278,539 | |
20000 | 11,9 | 1680,72 | 178,495 | |
pomiary dla parametru MaxSpareServers = 8 | Time taken for tests [s] | Requests per second [#/s] | Time per request [ms] (mean) | Time per request [ms] (mean, across all conc. Req) |
requests | concurent requests | |||
1000 | 300 | 0,621 | 1609,46 | 186,398 |
3000 | 6,624 | 452,89 | 662,411 | |
6000 | 17,721 | 350,45 | 856,038 | |
10000 | 13,941 | 717,32 | 418,225 | |
13000 | 10,845 | 1198,72 | 250,267 | |
16000 | 9,689 | 1651,39 | 181,665 | |
20000 | 7,851 | 2547,34 | 117,77 | |
pomiary dla parametru MaxSpareServers = 15 | Time taken for tests [s] | Requests per second [#/s] | Time per request [ms] (mean) | Time per request [ms] (mean, across all conc. Req) |
requests | concurent requests | |||
1000 | 300 | 18,156 | 55,08 | 5446,772 |
3000 | 4,867 | 616,33 | 486,749 | |
6000 | 4,539 | 1321,87 | 226,951 | |
10000 | 4,179 | 2392,97 | 125,367 | |
13000 | 4,658 | 2790,86 | 107,494 | |
16000 | 4,508 | 3549,47 | 84,52 | |
20000 | 8,563 | 2335,51 | 128,451 | |
pomiary dla parametru MaxSpareServers = 20 | Time taken for tests [s] | Requests per second [#/s] | Time per request [ms] (mean) | Time per request [ms] (mean, across all conc. Req) |
requests | concurent requests | |||
1000 | 300 | 10,822 | 92,41 | 3246,538 |
3000 | 0,396 | 7568,23 | 39,639 | |
6000 | 0,696 | 8616,1 | 34,819 | |
10000 | 9,18 | 1089,31 | 275,405 | |
13000 | 7,325 | 1774,79 | 169,034 | |
16000 | 5,611 | 2851,31 | 105,215 | |
20000 | 4,216 | 4743,45 | 63,245 |
pomiary dla parametru MaxSpareThreads = 55 | Time taken for tests [s] | Requests per second [#/s] | Time per request [ms] (mean) | Time per request [ms] (mean, across all conc. Req) |
---|---|---|---|---|
requests | concurent requests | |||
1000 | 300 | 20,133 | 49,67 | 6039,819 |
3000 | 19,293 | 155,49 | 1929,335 | |
6000 | 18,367 | 326,67 | 918,346 | |
10000 | 18,585 | 538,06 | 557,563 | |
13000 | 11,572 | 1123,41 | 267,044 | |
16000 | 2,149 | 7445,67 | 40,292 | |
20000 | 9,483 | 2109,08 | 142,242 | |
pomiary dla parametru MaxSpareThreads = 65 | Time taken for tests [s] | Requests per second [#/s] | Time per request [ms] (mean) | Time per request [ms] (mean, across all conc. Req) |
requests | concurent requests | |||
1000 | 300 | 0,221 | 4515,28 | 66,441 |
3000 | 0,884 | 3393,34 | 88,409 | |
6000 | 8,723 | 1146,41 | 261,687 | |
10000 | 7,657 | 1697,84 | 176,695 | |
13000 | 9,096 | 1758,92 | 170,559 | |
16000 | 8,01 | 2496,84 | 120,152 | |
20000 | 0,221 | 4515,28 | 66,441 | |
pomiary dla parametru MaxSpareThreads = 85 | Time taken for tests [s] | Requests per second [#/s] | Time per request [ms] (mean) | Time per request [ms] (mean, across all conc. Req) |
requests | concurent requests | |||
1000 | 300 | 7,859 | 127,25 | 2357,636 |
3000 | 6,579 | 456,02 | 657,873 | |
6000 | 16,544 | 362,66 | 827,212 | |
10000 | 13,616 | 734,41 | 408,49 | |
13000 | 7,281 | 1785,46 | 168,024 | |
16000 | 8,549 | 1871,64 | 160,287 | |
20000 | 8,003 | 2499 | 120,048 | |
pomiary dla parametru MaxSpareThreads = 95 | Time taken for tests [s] | Requests per second [#/s] | Time per request [ms] (mean) | Time per request [ms] (mean, across all conc. Req) |
requests | concurent requests | |||
1000 | 300 | 20,107 | 49,73 | 6032,163 |
3000 | 6,008 | 499,36 | 600,772 | |
6000 | 17,178 | 349,28 | 858,905 | |
10000 | 14,961 | 668,41 | 448,825 | |
13000 | 12,526 | 1037,84 | 289,061 | |
16000 | 11,826 | 1353 | 221,729 | |
20000 | 2,802 | 7138,64 | 42,025 | |
pomiary dla parametru MinSpareServers = 3 | Time taken for tests [s] | Requests per second [#/s] | Time per request [ms] (mean) | Time per request [ms] (mean, across all conc. Req) |
requests | concurent requests | |||
1000 | 300 | 18,166 | 55,05 | 5449,704 |
3000 | 15,247 | 196,76 | 1524,738 | |
6000 | 4,265 | 1406,74 | 213,258 | |
10000 | 14,167 | 705,89 | 424,998 | |
13000 | 1,673 | 7772,19 | 38,599 | |
16000 | 1,734 | 9227,03 | 32,513 | |
20000 | 2,328 | 8590,43 | 34,923 | |
pomiary dla parametru MinSpareServers = 4 | Time taken for tests [s] | Requests per second [#/s] | Time per request [ms] (mean) | Time per request [ms] (mean, across all conc. Req) |
requests | concurent requests | |||
1000 | 300 | 9,389 | 106,51 | 2816,56 |
3000 | 14,736 | 203,58 | 1473,591 | |
6000 | 0,636 | 9433,77 | 31,801 | |
10000 | 1,188 | 8417,54 | 35,64 | |
13000 | 2,186 | 5947,55 | 50,441 | |
16000 | 7,887 | 2028,64 | 147,882 | |
20000 | 7,117 | 2810,09 | 106,758 | |
pomiary dla parametru MinSpareServers = 6 | Time taken for tests [s] | Requests per second [#/s] | Time per request [ms] (mean) | Time per request [ms] (mean, across all conc. Req) |
requests | concurent requests | |||
1000 | 300 | 6,718 | 148,86 | 2015,315 |
3000 | 17,568 | 170,77 | 1756,776 | |
6000 | 15,25 | 393,45 | 762,495 | |
10000 | 4,268 | 2343,09 | 128,036 | |
13000 | 14,185 | 916,46 | 327,345 | |
16000 | 2,082 | 7685,42 | 39,035 | |
20000 | 2,285 | 8753,48 | 34,272 | |
pomiary dla parametru MinSpareServers = 7 | Time taken for tests [s] | Requests per second [#/s] | Time per request [ms] (mean) | Time per request [ms] (mean, across all conc. Req) |
requests | concurent requests | |||
1000 | 300 | 12,447 | 80,34 | 3734,137 |
3000 | 0,413 | 7269,89 | 41,266 | |
6000 | 0,718 | 8361,58 | 35,878 | |
10000 | 8,685 | 1151,4 | 260,553 | |
13000 | 6,982 | 1861,87 | 161,129 | |
16000 | 5,538 | 2888,9 | 103,846 | |
20000 | 3,2 | 6250,57 | 47,996 |
pomiary dla parametru MaxReqPerChild = 8000 | Time taken for tests [s] | Requests per second [#/s] | Time per request [ms] (mean) | Time per request [ms] (mean, across all conc. Req) |
---|---|---|---|---|
requests | concurent requests | |||
1000 | 300 | 14,693 | 68,06 | 4407,792 |
3000 | 4,131 | 726,17 | 413,127 | |
6000 | 13,702 | 437,88 | 685,124 | |
10000 | 1,159 | 8624,65 | 34,784 | |
13000 | 12,023 | 1081,29 | 277,446 | |
16000 | 10,215 | 1566,37 | 191,256 | |
20000 | 8,392 | 2383,16 | 125,883 | |
pomiary dla parametru MaxReqPerChild = 9000 | Time taken for tests [s] | Requests per second [#/s] | Time per request [ms] (mean) | Time per request [ms] (mean, across all conc. Req) |
requests | concurent requests | |||
1000 | 300 | 0,623 | 1603,87 | 187,048 |
3000 | 6,875 | 436,37 | 687,487 | |
6000 | 6,353 | 944,45 | 317,644 | |
10000 | 6,048 | 1653,32 | 181,453 | |
13000 | 5,813 | 2236,25 | 134,153 | |
16000 | 5,569 | 2873,3 | 104,41 | |
20000 | 5,268 | 3796,42 | 79,022 | |
pomiary dla parametru MaxReqPerChild = 11000 | Time taken for tests [s] | Requests per second [#/s] | Time per request [ms] (mean) | Time per request [ms] (mean, across all conc. Req) |
requests | concurent requests | |||
1000 | 300 | 20,196 | 49,52 | 6058,733 |
3000 | 6,089 | 492,72 | 608,864 | |
6000 | 5,905 | 1016,12 | 295,24 | |
10000 | 5,268 | 1898,37 | 158,03 | |
13000 | 14,673 | 885,96 | 338,615 | |
16000 | 3,078 | 5198,75 | 57,706 | |
20000 | 11,549 | 1731,86 | 173,224 | |
pomiary dla parametru MaxReqPerChild = 12000 | Time taken for tests [s] | Requests per second [#/s] | Time per request [ms] (mean) | Time per request [ms] (mean, across all conc. Req) |
requests | concurent requests | |||
1000 | 300 | 10,261 | 97,45 | 3078,405 |
3000 | 17,163 | 174,79 | 1716,342 | |
6000 | 16,336 | 367,3 | 816,779 | |
10000 | 14,894 | 671,39 | 446,832 | |
13000 | 1,375 | 9454,78 | 31,73 | |
16000 | 11,623 | 1376,54 | 217,938 | |
20000 | 9,466 | 2112,84 | 141,989 | |
pomiary dla parametru MinSpareThreads = 15 | Time taken for tests [s] | Requests per second [#/s] | Time per request [ms] (mean) | Time per request [ms] (mean, across all conc. Req) |
requests | concurent requests | |||
1000 | 300 | 16,929 | 57,07 | 5078,576 |
3000 | 3,802 | 789,03 | 380,212 | |
6000 | 12,599 | 476,22 | 629,967 | |
10000 | 1,128 | 8867,09 | 33,833 | |
13000 | 1,432 | 9075,25 | 33,057 | |
16000 | 4,612 | 3469,28 | 86,473 | |
20000 | 4,393 | 4552,7 | 65,895 | |
pomiary dla parametru MinSpareThreads = 20 | Time taken for tests [s] | Requests per second [#/s] | Time per request [ms] (mean) | Time per request [ms] (mean, across all conc. Req) |
requests | concurent requests | |||
1000 | 300 | 22,725 | 44 | 6817,434 |
3000 | 0,627 | 4783,77 | 62,712 | |
6000 | 1,994 | 3008,58 | 99,715 | |
10000 | 19,896 | 502,61 | 596,886 | |
13000 | 6,614 | 1965,65 | 152,621 | |
16000 | 6,13 | 2610,29 | 114,93 | |
20000 | 7,269 | 4529,335 | 198,65 | |
pomiary dla parametru MinSpareThreads = 30 | Time taken for tests [s] | Requests per second [#/s] | Time per request [ms] (mean) | Time per request [ms] (mean, across all conc. Req) |
requests | concurent requests | |||
1000 | 300 | 15,821 | 63,24 | 4746,226 |
3000 | 0,421 | 7121,36 | 42,127 | |
6000 | 0,74 | 8106,98 | 37,005 | |
10000 | 12,193 | 820,17 | 365,78 | |
13000 | 11,275 | 921,45 | 349,27 | |
16000 | 10,038 | 1295,06 | 231,649 | |
20000 | 8,08 | 2475,25 | 121,2 | |
pomiary dla parametru MinSpareThreads = 35 | Time taken for tests [s] | Requests per second [#/s] | Time per request [ms] (mean) | Time per request [ms] (mean, across all conc. Req) |
requests | concurent requests | |||
1000 | 300 | 19,198 | 52,09 | 5759,338 |
3000 | 7,023 | 427,16 | 702,31 | |
6000 | 7,283 | 823,83 | 364,153 | |
10000 | 7,591 | 1317,41 | 227,719 | |
13000 | 8,784 | 147,9 | 202,717 | |
16000 | 8,723 | 1834,26 | 163,554 | |
20000 | 8,12 | 2462,93 | 121,806 |
Opracowanie wyników
Jak widać na wykresie parametry dają podobne skutki dla dużej ilości zapytań. Ciężko stwierdzić, która wartość jest optymalna. Wartością, którą wybralibyśmy jest wartość 20. Dla zapytań rzędu kilkunastu tysięcy ma bardzo dobre wyniki.
Podczas testów parametru MaxSpareServers naszą szczególną uwagę zwróciła wartość 20, która utrzymywała się poniżej jednej milisekundy. Wszystkie parametry nie wiele różniły się od siebie.
Dane zebrane podczas testów parametru MinSpareServers nie pozwalają na wyciągnięcie logicznych wniosków co do znaczenia tego parametru. Logicze wydaje się zwiększenie tego parametru jeżeli spodziewamy się dużej ilości zapytań
Jeżeli dobrze się przyjżeć danym na wykresie bądź przeglądając dane zebrane w tabelach zmniejszenie parametru MaxSpareThreads może wpłynąć korzystnie na działanie serwera przy większej liczbie zapytań. Brak bezczynnych procesów na pewno odciąży sprzęt komputerowy.
Podobnie jak w przypadku MinSpareServers z wykresu i danych ciężko przeprowadzić wnioskowanie statystyczne. Znając znaczenie parametrów można łatwo się domyślić, że zwiększenie tego parametru wpłynie korzystnie na działanie naszego serwera jeżeli będziemy otrzymywać dużą liczbę zapytań.
Przy testach maksymalnej liczby MaxRequestPerChild zauważamy, że zwiększenie tego parametru polepsza wydajność przy dużej liczbie zapytań. Natomiast zmniejszenie tej wartości poprawi działanie przy małej liczbie zapytań.
Legenda:
KeepAliveTimeout – informuje ile sekund Apache ma czekać na kolejne zapytanie przed przerwaniem połączenia
MaxSpareServers/MinSpareServers – określa liczbę pożądanych procesów zapasowych (są to procesy bezczynne) przekroczenie maksimum skutkuje zabiciem nadmiaru procesów. Zejście poniżej minimalnej liczby powoduje utworzenie nowych procesów.
MaxSpareThreads/MinSpareThreads – dotyczy wątków. Działanie jest podobne do opisanego powyżej.
MaxRequestPerChild – określa maksymalną liczbę żądań jaką może obsługiwać podproces serwera.
Wnioski
Ćwiczenie wymagało od nas przeprowadzenia wielu testów. Niestety czas przeznaczony na zajęcia nie wystarczył na sprawdzenie danych optymalnych. Po przeprowadzonych testach sądzimy jedna, że nie istnieją uniwersalne wartości optymalne.
Optymalizacja serwera www jest zadaniem trudnym. Wymaga znajomości oprogramowania wykorzystywanego do postawienia serwera oraz wielu zmiennych czynników, które wpłyną na działanie serwera. Sądzimy, że optymalizacja nie jest czynnością, a procesem. Wiele serwerów i serwisów Internetowych rozwija się, bądź ulega degradacji. Jeżeli rozpoczynamy pracę z serwerem, łączy się z nami mało klientów, warto zredukować liczbę bezczynnych procesów i wątków oraz maksymalną liczbę zapytań obsługiwanych przez podprocesy by nasz serwer płynnie działał. Wraz z rozwojem naszego serwera i wzrostem liczby zapytań, które do niego przychodzą warto zwiększać te parametry oraz zmniejszyć czas oczekiwania na kolej zapytanie by osoby łączące się z naszym serwisem były zadowolone z dostarczanych usług.
Przeglądając zgromadzone dane łatwo jest również zauważyć liczne nielogiczne wartości jakie dawały przeprowadzone testy. Widać szczególnie, że pierwszy test po restarcie serwera dawał zazwyczaj bardzo długi czas obsługi zapytań. Sądzimy, że nie jest to spowodowane przez parametry, które zmienialiśmy, a przez pracę komputera, która była obciążona świeżo uruchomionym serwerem oraz innym oprogramowaniem wykorzystywanym do wykonania ćwiczenia.
To zadanie było bardzo praktyczne i prawdopodobnie wiedzę, zdobytą podczas jego wykonywania wykorzystamy w przyszłości stawiając własny serwer www lub w przyszłej karierze zawodowej.