next up previous contents
Next: 7 Zakończenie Up: Język do tworzenia aplikacji Previous: 5 Porównanie   Spis rzeczy

Subsections

6 Testy

1 Wprowadzenie

W tym rozdziale opisuję testy, mające na celu ocenę wydajności aplikacji generowanych przez translator TLCC. Sprawdzają one szybkość działania poszczególnych elementów, które wchodzą w skład generowanych programów oraz porównują te wartości z osiągami istniejących systemów. Zmierzona została szybkość takich kluczowych operacji jak zapisywanie i odczytywanie trwałych obiektów, czy wywoływanie zdalnych metod przy pomocy biblioteki CORBA.

Wszystkie opisane w tym rozdziale testy zostały przeprowadzone na komputerze (lub kilku komputerach) Pentium II 350 MHz.

2 Sekwencje o zmiennej długości

Przy ocenie wydajności przechowywania obiektów trzeba wziąć pod uwagę wpływ częstych modyfikacji danych na prędkość ich odczytu i zapisu. Obiekt poddany serializacji jest sekwencją bajtów, której długość może się znacząco zmieniać podczas pracy aplikacji. Dobrym przykładem są listy grup tematycznych, do których można dopisywać nowe elementy i przez to zwiększać rozmiar sekwencji, jakie powstają z obiektów w wyniku serializacji. Również w innych przypadkach dane przechowywane w serwisie WWW mają tendencję do zwiększania swojego rozmiaru. Dotyczy to np. wiadomości na forum dyskusyjnym lub różnych informacji związanych z konkretnym użytkownikem (im więcej działań wykonuje, tym więcej danych musi być zapamiętanych).

Celem testów opisanych w tym punkcie był pomiar prędkości odczytu i zapisu sekwencji bajtów, które często zmieniają swój rozmiar. Początkowo zostało utworzonych 5 000 sekwencji o rozmiarze 1 KB każda. Następnie losowo była odczytywana jedna z nich i powiększana o kolejny 1 KB. Dla porównania test ten został przeprowadzony także przy pomocy różnych istniejących systemów, umożliwiających przechowywanie danych. Testowane systemy to interpreter PHP (dane przechowywane były w sesjach) i baza danych MySQL (jedna z najszybszych baz danych).

Liczba 5 000 sekwencji została tak dobrana, aby ich łączny rozmiar w czasie testu przekroczył kilkukrotnie wielkość pamięci operacyjnej (64 MB). W przypadku większej pojemności pamięci komputera efekt otrzymany w teście można uzyskać poprzez proporcjonalne zwiększenie liczby obsługiwanych sekwencji.

Wyniki testów zostały zebrane w tabeli 6.1. Aby zilustrować ich przebieg wykonane operacje podzielono na równe grupy i dla każdej z nich podano średni czas obsługi sekwencji w milisekundach. Każda grupa obejmowała 10 000 operacji, dzięki czemu uzyskane dane w sposób zwięzły przedstawiają zmiany czasu wykonywania poszczególnych działań. Oto objaśnienie zawartości kolumn tabeli 6.1:

  1. LICZBA OPER. - liczba jednostkowych operacji, które zostały przeprowadzone (odczyt sekwencji wraz z powiększeniem jej o 1 KB i zapisem);
  2. PHP - test polegający na zapamiętywaniu sekwencji w sesjach, które są dostępne w skryptach PHP (sesje zapisywane są na dysku);
  3. DB 1 - klasyczny sposób zapisu danych w bazie (MySQL): dodanie łańcucha do sekwencji odbywa się poprzez wstawienie do tabeli nowego wiersza, który zawiera informacje o numerze rozszerzanej sekwencji i dane binarne;
  4. DB 2 - wykorzystanie jednego wiersza w tabeli dla każdej sekwencji: przy doklejaniu łańcucha modyfikowany jest odpowiedni wiersz tabeli;
  5. TLCC 1 - wykorzystanie modułu TLCC, służącego do przechowywania obiektów aplikacji, z następującymi ustawieniami dla pliku danych (por. p. 4.5.2):
  6. TLCC 2 - jak poprzednio, lecz przy zmienionych ustawieniach:


Tabela 6.1: Wyniki testów dla sekwencji o zmiennej długości
LICZBA  PHP    DB 1    DB 2   TLCC 1 TLCC 2
OPER. [ms] [ms] [ms] [ms] [ms]
10 000 3 2 2 2 2
20 000 3 2 9 7 11
30 000 32 3 61 12 15
40 000 39 5 138 18 17
50 000 71 17 205 24 21
60 000 100 37 271 29 24
70 000 131 59 307 34 26
80 000 162 83 367 40 30
90 000 195 108 434 45 34
100 000 227 133 525 49 36
110 000 258 147 - 53 39
120 000 288 165 - 58 43
130 000 320 189 - 64 46
140 000 355 223 - 70 50
150 000 388 256 - 78 54
160 000 417 261 - 84 56
170 000 437 277 - 90 59
180 000 469 307 - 96 64


Tabela pokazuje, że początkowo dla wszystkich testowanych systemów czas obsługi sekwencji jest bardzo mały. Jest to spowodowane niewielką ilością danych, dzięki czemu mieszczą się one w pamięci, służącej jako bufor dla dysku. W pierwszej fazie testu moduł aplikacji TLCC jest trochę wolniejszy, co ma swoje źródło w szybkim wzroście rozmiaru pliku, który przechowuje te dane (później jego rozmiar nie zmienia się znacząco).

W dalszej części testu, gdy dane przestają się mieścić w pamięci, rozwiązania używające sesji PHP i bazy danych okazują się znacznie wolniejsze niż TLCC. Przyczyną tego jest fragmentacja sekwencji w plikach sesji PHP lub w bazie danych. Natomiast sekwencje w TLCC zapisywane są bez fragmentacji. Łagodny wzrost czasu obsługi w tym przypadku jest spowodowany przyrostem wielkości danych oraz koniecznością coraz częstszego przegrupowywania sekwencji w ramach sekcji (aby możliwe było wielokrotne użycie poszczególnych sekcji).

W przypadku testu oznaczonego jako DB 2 druga część wyników nie została umieszczona w tabeli ze względu na to, że testowanie trwałoby bardzo długo. Lecz już z częściowych rezultatów wynika, że jest to rozwiązanie zdecydowanie najmniej efektywne.

Tabela 6.2 przedstawia wyniki tego samego testu, ale zgrupowane według wielkości obsługiwanych sekwencji (kolumna SEKW.). Ich rozmiar podany jest w kilobajtach. Natomiast średni czas obsługi sekwencji o określonej długości został wyrażony w milisekundach.


Tabela 6.2: Wyniki testów dla sekwencji o zmiennej długości (cd.)
SEKW.  PHP    DB 1    DB 2   TLCC 1 TLCC 2
[KB] [ms] [ms] [ms] [ms] [ms]
1-5 16 2 20 6 8
6-10 58 13 140 19 19
11-15 127 52 293 32 27
16-20 217 107 424 45 33
21-25 285 161 562 58 43
26-30 348 216 720 72 52
31-35 403 268 927 83 56
36-40 415 312 - 95 66


Test pokazuje wyraźny związek między wielkością zapamiętywanych danych, a czasem ich obsługi. Widać również, że fragmentacja ma bardzo istotne znaczenie przy szybkości dostępu do informacji, których wielkość jest zmienna. W przypadku wielu modyfikacji sekwencje znacznie szybciej są obsługiwane przez aplikacje, generowane za pomocą translatora TLCC. Ostateczne uszeregowanie testowanych rozwiązań pod względem efektywności wygląda następująco: TLCC 2, TLCC 1, DB 1, PHP, DB 2.

3 Sekwencje o stałej długości

W poprzednim punkcie została przetestowana obsługa sekwencji o zmiennej długości. Istnieją jednak przypadki podczas działania typowej aplikacji, że wielkość obiektów (po wykonaniu serializacji) pozostaje stała lub są to zmiany niewielkie.

Kolejny test miał na celu sprawdzenie szybkości obsługi sekwencji o stałej długości, przy użyciu porównywanych w tym rozdziale systemów. Polegał on na stworzeniu 20 000 jednostek informacji o rozmiarze 10 KB każda. Następnie program testujący przeprowadzał 40 000 odczytów, wybierając za każdym razem losową sekwencję. W drugiej części testu oprócz odczytu wykonywana była także modyfikacja i zapis losowej sekwencji. Jednak modyfikacja nie zmieniała jej rozmiaru. W tabeli 6.3 umieszczono uzyskane wyniki.


Tabela 6.3: Wyniki testów dla sekwencji o stałej długości
RODZAJ TYLKO ODCZYT ODCZYT I ZAPIS
TESTU [ms] [ms]
PHP - 42
DB 1 / DB 2 22 42
TLCC 1 20 42
TLCC 2 20 36


W przypadku oznaczonym jako PHP niemożliwe było uzyskanie wyłącznie odczytu sesji, ponieważ zapis zostaje wykonany automatycznie dopiero po zakończeniu skryptu. Również z tego powodu czas zapisu sekwencji nie został całkowicie uwzględniony w drugiej części testu (często podczas odczytu nowej sesji zbuforowane dane poprzednich sesji muszą być zachowane na dysku, więc zapis wpływa w pewnym stopniu na czas odczytu).

Z testu wynika, że osiągi wszystkich testowanych rozwiązań są bardzo zbliżone. W teście oznaczonym jako TLCC 2 czas obsługi sekwencji jest trochę krótszy, gdyż rozwiązanie to używa pliku o bardzo dużych sekcjach i niskim progu powtórnego użycia. Dzięki temu bardzo wiele sekwencji zapisywanych jest przy pomocy jednej operacji dostępu do dysku.

4 Efektywność przykładowej aplikacji

Aplikacja WWW obsługująca grupy tematyczne (opisana w rozdziale 5) pozwala sprawdzić rzeczywistą wydajność generowanych programów. Kluczowym czynnikiem, który wpływa na szybkość są operacje związane z systemem CORBA, takie jak wywoływanie zdalnych funkcji i transfer większych porcji danych przy pomocy tych wywołań. Podczas pracy aplikacji, serwer wyświetla na bieżąco informacje dotyczące czasu obsługi żądań.

W celu oceny rzeczywistej wydajności systemu przeprowadzono test, polegający na wykonaniu pewnej liczby operacji na zaimplementowanym serwisie. Były to: logowanie użytkownika, przeglądanie kategorii, dodawanie nowych grup, umieszczanie nowych wiadomości na listach dyskusyjnych itp. Aplikacja obsługiwała 4096 kategorii tematycznych, przy czym każda zawierała po 8 elementów. Test obejmował 500 żądań do serwera. Zmierzony został również czas operacji związanych ze zdalnym wywołaniem metod. Otrzymane wyniki są zebrane w tabeli 6.4.


Tabela 6.4: Wyniki uzyskane przez przykładową aplikację
czas wywołania zdalnej funkcji 0.6 ms
prędkość transferu przy zdalnym wywołaniu 12 MB/s
średni czas obsługi żądań 56 ms
maksymalny czas obsługi żądania 147 ms
minimalny czas obsługi żądania 10 ms


Test przeprowadzono w sytuacji, gdy wszystkie procesy wchodzące w skład działającej aplikacji zostały uruchomione na tej samej maszynie. Uzyskane wyniki można zinterpretować w ten sposób, że aplikacja jest w stanie obsługiwać średnio 18 żądań w ciągu sekundy. Przy tym każde żądanie wymaga komunikacji z serwerem obiektów dzielonych i wizualizacji wielu obiektów. Rezultaty testów dostępne w sieci Internet wskazują, że typowa efektywność dla różnych aplikacji WWW waha się od kilku do kilkudziesięciu żądań na sekundę. Biorąc pod uwagę to, że testy takie obejmują żądania skierowane do jednej strony WWW (jej zawartość nie ulega zmianie), a opisywany w tym punkcie test dotyczy rzeczywistych akcji i całkowicie dynamicznie generowanych stron WWW, to otrzymane wyniki można uznać za zadowalające. Z testu wynika także, że narzuty związane z zastosowaniem systemu CORBA (chodzi tu o zdalne wywoływanie funkcji) są niewielkie i akceptowalne.

5 Skalowalność aplikacji

Został również przeprowadzony test, sprawdzający szybkość obsługi użytkowników w środowisku rozproszonym. Polegał on na wysyłaniu równocześnie do aplikacji dużej liczby żądań, przez specjalny program testujący. Uruchamianych było wiele instancji programu testującego, z których każda w losowy sposób poruszała się po drzewie kategorii i wybierała pozycje z głównego menu (wysyłając odpowiednie żądania HTTP do serwera).

Test wykonywał się na drzewie grup, które składało się z 4096 elementów (każda grupa posiadała 8 elementów potomnych). Początkowo na jednym komputerze działał serwer główny, serwer obiektów dzielonych i serwery obiektów (dla sesji). W teście dla większej liczby komputerów serwery obiektów zostały przeniesione na te nowe maszyny. We wszystkich przypadkach obsługa żądań wysyłanych przez program testujący rozkładała się równomiernie między wszystkie uruchomione serwery obiektów.

Tabela 6.5 przedstawia opis testowanych konfiguracji dla podanej liczby komputerów. Każdy komputer otrzymał numer, który go identyfikuje. Opis konfiguracji to lista procesów, działających na poszczególnych maszynach. Oto objaśnienie skrótów:


Tabela 6.5: Zestawienie testowanych konfiguracji
L. KOMPUT. NR 1 NR 2 NR 3 NR 4
1 SG SOD 20xSO - - -
2 SG SOD 5xSO 20xSO - -
3 SG SOD 20xSO 20xSO -
4 SG SOD 20xSO 20xSO 20xSO


Dla każdej testowanej konfiguracji mierzona była liczba obsłużonych żądań w ciągu sekundy. Otrzymane wyniki zawiera tabela 6.6.


Tabela 6.6: Wyniki uzyskane przy rozproszonym przetwarzaniu żądań
liczba komputerów   1     2     3     4  
liczba obsług. żądań na sek. 18 30 46 54


Z zestawienia wynika, że w początkowej fazie testu aplikacja dobrze się skaluje. Jednak przy dodawaniu kolejnych serwerów obsługujących obiekty użytkowników, serwer obiektów dzielonych staje się wąskim gardłem. Dlatego dalsze skalowanie aplikacji wymaga uruchomienia większej liczby serwerów obiektów dzielonych[*].

6 Podsumowanie

W rozdziale zostały opisane testy, których zadaniem było porównanie wydajności aplikacji WWW tworzonych przy pomocy standardowych narzędzi oraz aplikacji generowanych przez translator TLCC. Kluczowymi elementami, które wpływają na prędkość obsługi żądań przez programy napisane w TLCC są: efektywność przechowywania trwałych obiektów oraz narzuty związane z wykorzystaniem systemu CORBA. Testy wykazały, że mechanizmy te są efektywne i nadają się do użycia w aplikacjach WWW. Ponadto w zastosowaniach, które wymuszają częste zmiany wielkości przechowywanych danych (takich jak grupy tematyczne), rozwiązanie wykorzystujące TLCC jest szybsze od bazy danych.

W końcowej części rozdziału został opisany test, przeprowadzony z rzeczywistą aplikacją, napisaną w TLCC. Potwierdził on, że system ten nadaje się do tworzenia sprawnie działających serwisów WWW.


next up previous contents
Next: 7 Zakończenie Up: Język do tworzenia aplikacji Previous: 5 Porównanie   Spis rzeczy
Paweł Lenk 2002-12-10