Autor: Arkadiusz Firus (219426) 0. Wstep 0a Dane techniczne. Program optymalizowany: ClamAV (www.clamav.net) Komputer na ktorym dokonywano testow: Laptop HP nx7300 RU605ES Procesor Intel Core Duo T2250 taktowanie: 1.73GHz cache: 2MB architektura: 32bit liczba rdzeni 2 Pamiec 1GB System operacyjny Gentoo Linux Jadro 2.6.22-gentoo-r2 gcc 4.1.2 glibc 2.5-r4 Dane do testow: Katalog zawierajacy 2268 plikow wykonywalnych o lacznym rozmiarze 254MB (kopia katalogu /usr/bin) 0b Wybor programu do testowania. Zdecydowalem sie wybrac jako program do optymalizacji jedyny znany mi program antywirusowy oparty na otwartym kodzie. Powodem dla ktorgo wybralem wlasnie te aplikacje sa moje wlasne zainteresowania, a mianowicie bezpieczenstwo. Poniewaz wiekszosc aplikacji tego typu z ktorymi mialem stycznosc raczej nie nadaje sie do optymalizowania (sa to glownie programy zbierajace informacje o ruchu sieciowym, skanery portow itp) ze wzgledu na swoja prosta budowe, dlatego zabralem sie za optymalizowanie programu ClamAV. 1. Optymalizacje 1a Zrownoleglenie Glowna opymalizacja jaka wprowadzilem bylo dopisanie obslugi wielowatkowej. W chwili obecnej program jest w stanie skanowac kilka plikow na raz co znaczaco przyspieszylo jego dzialanie (wiecej w punkcie 2). Program sam okresla ile dodatkowych watkow powinien utworzyc na podstawie liczby procesorow obecnych w systemie (liczba procesorow jest sprawdzana w momencie wywolania programu). Mozna rowniez przekazac liczbe watkow jako parametr wywolania programu. Testy pokazaly, ze optymalna liczba watkow dla konfiguracji sprzetowej opisanej powyzej to 6 watkow skanujacych + 1 zarzadzajacy. Dlatego jesli program sam okresla liczbe watkow to jest ona ustawiana na 3*liczba_procesorow + 1. Niestety nie dysponuje inna konfiguracja sprzetowa do przeprowadzenia testow wydajnosciowych, by bardziej zoptymalizowac funkcje wyliczajaca liczbe watkow (testy na serwerze students ciezko uznac za miarodajne). 1b Pamiec Dodatkowa optymalizacja wprowadzona przezemnie jest optymalizacja zerowania pamieci. Usunalem z kilku miejsc zbedne zerowanie (wyzerowana pamiec zostaje nadpisana innymi danymi) jak rowniez zamienilem funkcje sluzaca do zerowania. Pierwotnie byla to funkcja memset obecnie jest to funkcja bzero. Testy wydajnosciowe przeprowadzalem na architekturze opisanej powyzej (tu zysk byl okolo 4%, jak rowniez na serwerze students (choc wyniki nie sa miarodajne) to testy pokazaly zysk okolo 1,5%). Nie wiem czy ta zmiane mozna nazwac optymalizacja, bo podejrzewam, ze na roznych architektorach ta zmiana moze powodowac nawet spowolnienie dzialania programu. 1c Straty wynikle z optymalizacji Do okreslenia liczby procesorow korzystam z funkcji: sysconf(_SC_NPROCESSORS_CONF) Sama funkcja sysconf znajduje sie w standardzie POSIX, jednak argument _SC_NPROCESSORS_CONF juz nie. Co wiecej nie jest nawet wymieniany w niektorych wersjach podrecznika systemowego (np w mojej wersji mana tego argumentu nie ma). Przez ta zmiane kod staje sie mniej przenosny miedzy platformami, Niestety nie znam lepszej metody okreslenia liczby procesorow obecnych w systemie (odczytanie tej wartosci z pliku /proc/cpuinfo nie wydaje mi sie lepszym rozwiazaniem). 2. Wyniki Caly test byl przeprowadzany na architekturze opisanej w punkcie 0a. Test na 6 krotnym przeskanowaniu folderu z danymi za pomoca orginalnej i mojej programu bez pomiaru czasu dzialania programu (dzialanie to ma na celu przekopiowanie zawartosci wszystkich plikow z danymi do pamieci RAM). Nastepnie te same dane byly skanowane 100 krotnie na zmiane przez oryginalna wersje programu i moja (50 razy przez jedna wersje) tym razem juz z pomiarem czasu dzialania. Calkowity czas dzialania wersji oryginalnej programu to 1901.26 sekund co daje sredni czas przeskanowania katalogu rowny 38.02 sekundy. Calkowity czas dzialania mojej wersji programu to 1427.11 sekund co daje sredni czas przeskanowania katalogu rowny 28.54 seknudy. Zysk z optymalizacji wynosi 25% 3, Wnioski i uwagi Chyba najwazniejsza rzecza jakiej nauczylem sie podczas prob optymalizacji to pisanie kodu podzielonego na funkcje. Czytanie funkcji, ktora zajmuje 200 linii nie nalezy do przyjemnosci. Poza tym drobnym mankamentem kod programu ClamAV byl bardzo przyjazny dla czytelnika. Nauczylem sie rowniez przy okazji w jaki sposob dzialaja programy antywirusowe co, mam nadzieje, jeszcze mi sie przyda.