Politechnika Krakowska Im. Tadeusza Ko±ciuszki Wydziaª Fizyki, Matematyki i Informatyki 23 stycznia 2012 Programowanie rozproszone i równolegªe niestacjonarne magisterskie uzupeªniaj ce. Dokumentacja MirrorWeb Author: Artur Bednarczyk, Krystian Heród Studenci pierwszego roku, studiów niestacjonarnych Stopnie«drugi. Spis tre±ci I Wprowadzenie 2 II Wykorzystane technologie 2 1 Technologia libcurl (curl) 3 2 Technologia boost::regex 3 3 Biobioteka STL 5 4 Technologia OpenMP 5 III Najwa»niejsze funkcje programu 6 IV Testowanie wydajno±ci aplikacji MirrorWeb z wykorzystaniem OpenMP 8 1
V Instalacja, konguracja i kompilacja aplikacji MirrorWeb 9 VI Wnioski 9 VII Bibliograa 9 Cz ± I Wprowadzenie Celem projektu byªo stworzenie programu do pobierania zadanej strony www z wykorzystaniem ±rodowiska umo»liwiaj cego przyspieszenie dziaªania tego programu poprzez zrównoleglenie pewnego obszaru danej aplikacji. Projekt zostaª stworzony w zgodno±ci ze specykacja która oparta jest w j zyku C++. Ze wzgl du powielanie wykonywania tych samych czynno±ci w p tli, rozs dnym rozwi zaniem byªo wykorzystanie ±rodowiska OpenMP. Podstawowymi problemami do rozwi zania byªo poª czenie z serwerem, dzi ki któremu uzyskamy dost p do zawarto±ci strony gªównej. Rozwi zaniem byªo wykorzystanie biblioteki curl, która daje nam t i wiele wi cej mo»liwo±ci. Kiedy uzyskali±my ju» dost p do tzw. masterpage, kolejnym zagadnieniem byªo przeszukiwanie pliku w poszukiwaniu wyra»e«, mówi cych o odno±nikach i plikach, aby mo»na byªo odtworzy struktur i wygl d strony. W dalszej cz ±ci, opisane zostan pokrótce wykorzystane technologie i przedstawiony sposób rozwi zania napotkanych problemów. Nast pnym etap przedstawia wykres który ilustruje zale»no± czasu od ilo±ci wykorzystanych w tków przy zrównolegleniu oblicze«danego programu. Wnioski ko«cowe które zostaªy zawarte w danej dokumentacji, przedstawi zalety i wady wyko»ystywanych technologi. Cz ± II Wykorzystane technologie W danej pracy wyko»ystali±my kilka z poznanych nam ±rodowisk które które umo»liwiaªy usprawnienie dziaªania danej aplikacji do pobierania stron internetowych za po±rednictem protokoªu sieciowego HTTP. 2
1 Technologia libcurl (curl) curl jest bibliotek która zostaªa napisana w j zyku C, posiada ona bardzo du»y stopnie«integracji z interfejsami dla ponad 30 innych j zykó programowaniatakich np. jak : Ada95, Basic, C, C++, Java,.NET, Object Pascal, Pascal, Perl, PHP, Phyton, Ruby, Visual Basic. Bibioteka ta w znacznym stopniu uªatwia prac tworzenia aplikacji korzystania z takich protokoªów jak HTTP, HTTPS, FTP, SFTP, FTPS, TFTP, SCP, Telnet, certykaty HTTPS, ciasteczka (cookies), upload FTP. Biblioteka tak udost pniona jest na licencji MIT. W naszej pracy wykorzystali±mi dan bibliotek libcurl do komunikacji z serwerem po przez protokuª sieciowy HTTP. 2 Technologia boost::regex Technologia któr wykorzystali±my przy problematyce porównywania wczytanych znakówa dokªadniej przy przetwarzaniu tekstu zawartego w danym pliku jest biblioteka boost::regex która daªa nam mo»liwo± integracji j zyka C++ wyrarze«regularnych. Do skªadowania podstawowy deklracji w postacji wyra»e«regularnych mamy dost pne trzy formy, a mianowici : Perl (jako domy±lna) POSIX roszerzona (porównywalna do egrep czy awk) POSIX podstawowa (porównywalna do grep cz emacs) Podstawowa skªadnia w Perl'u:. dowolny znak ^ pocz tek linii $ koniec linii ( ) pocz tek i koniec znaczonego grupowania (?: ) pocz tek i koniec nieznaczonego grupowania * powtórzenie atomu zero lub wi cej razy + powtórzenie atomu jeden lub wi cej razy? powtórzenie atomu zero lub jeden raz n powtórzenie atomu dokªadnie n razy n, powtórzenie atomu n lub wi cej razy n,m powtórzenie atomu od n do m razy 3
alternatywa [znaki^odrzuty] dopuszczalny znaki i niedopuszczalne odrzuty \< \> \b pocz tek, koniec sªowa i którekolwiek z nich \d <=> [[:digit:]] cyfra \l <=> [[:lower:]] maªa litera \s <=> [[:space:]] spacja \u <=> [[:upper:]] du»a litera \w <=> [[:word:]] znak "sªowny" (alfanumeryczny lub _) \D <=> [^[:digit:]] nie: cyfra \L <=> [^[:lower:]] nie: maªa litera \S <=> [^[:space:]] nie: spacja \U <=> [^[:upper:]] nie: du»a litera \W <=> [^[:word:]] nie :znak "sªowny" (?#komentarz) ignorowany (komentarz) (?=wzorzec) "zjada" 0 znaków tylko je»eli wzorzec si zgadza (?!wzorzec) "zjada" 0 znaków tylko je»eli wzorzec nie pasuje Dana technologia posiada równierz tzw. szablony klas, które umo»liwiaj skªadowanie wyra» «regularnych w formie parametru a pó¹niej wzale»no±ci od u»ytej klasy/funkcji danej biblioteki porównuj lub nawet zamieniaj miejscami np: odpowiednie strinigi w danym pliku. Jedne z gªówniejszych klas danej bilbioteki boost::regex, s : regex_match(), dopasowywanie parametrów regex_search(), przeszukiwanie parametrów regex_replace(), zast powanie parametrów regex_token_iterator(), dzielenie parametrów 4
3 Biobioteka STL Za po±rednictwem danej blibioteki STL aplikacja MirrorWeb wykorzystuje takie jej elementy jak zbiór i stos. (eng. set, stack). Zbiorem nazywamy struktur danych opart na formie drzewa. Ka»dy element w danym zbiorze jest posortowany wedªug pewnego klucza. Forma drzewa zapewnia nam szybki dost p do wyszukiwania elementów w podanym zbiorze. Jednym z kluczowych problemów jakie posiada set stanowi modykacja danego zbioru, mianowicie w mom cie gdy chcieliby±my przenie± dowolny element z danego zbioru musimy go usun a potem wprowadzi jeszcze raz. Korzystaj c z terminologii STL-a zbiory s to tzw. kontenerami asocjacyjnymi (o zmiennej dªugo±ci, pozwalaj cymi na operowanie elementami przy u»yciu kluczy). Operacje jakie wykorzystali±my za po±rednictwem zbioru to: insert() - wstawianie elementu do zbioru Kolejn struktur która zawarli±my przy tworzenia danej aplikacji Mirror- Web jest struktura stosu. Stos stanowiª dobre rozwi zanie dla elementów które s gromadzone w postaci stringów. Operacje jakie wykorzystali±my za po±rednictwem stosu to: push() - wstawianie nowego elementu na szczyt stosu pop() - zdejmowanie elementu ze szczytu stosu 4 Technologia OpenMP Technologia OpenMP jest elementem który sªu»y do implementacji wielow tkowo±ci, czyli umo»liwia zrównoleglanie programu komputerowego, w którem gªówny w tek rozgaª zia si na kilka w tków. W tki pracuj wspóªbie»nie i mog zosta przydzielone przez ±rodowisko uruchomieniowe ró»nym procesorom. Fragment kodu, który ma by wykonywany równolegle, jest w kodzie ¹ródªowym oznaczany odpowiedni dyrektyw preprocesora. Tu» przed wykonanie tak zaznaczonego kodu gªówny w tek rozgaª zia si na okre±lon liczb nowych w tków. Ka»dy w tek posiada unikalny identykator tzw. id), którego warto± mo»na odczyta funkcj omp_get_thread_num(). Gdy przetwarzanie zrównoleglonego kodu w tki dojdzie do ko«ca pozostaªe wª czaj si z powrotem do w tku gªównego, który samotnie kontynuuje dziaªanie programu i w innym miejscu mo»e ponownie rozdzieli si na nowe w tki. Domy±lnie wszystkie w tki przetwarzaj zrównoleglon cz ± kodu niezale»- nie od siebie. Do podziaªu zadania pomi dzy w tki sªu» specjalne konstrukcje podziaªu zadania. Za przydziaª w tków do poszczególnych procesorów odpowiada ±rodowisko uruchomieniowe, które stosuje algorytm uwzgl dniaj cy m.in. aktualne obci»enie poszczególnych procesorów oraz caªej maszyny. Liczba nowych w tków mo»e 5
by okre±lona tu» przed uruchomieniem programu za po±rednictwem zmiennych ±rodowiskowych lub w kodzie ¹ródªowym za pomoc specjalnych funkcji. Dzi ki temu,»e standard OpenMP zostaª uzgodniony przez gªównych producentów sprz tu i oprogramowania komputerowego, charakteryzuje si on przeno±no±ci, skalowalno±ci, elastyczno±ci i prostot u»ycia. Dlatego mo»e by stosowany do tworzenia aplikacji równolegªych dla ró»nych platform, od komputerów klasy PC po superkomputery. OpenMP mo»na stosowa do tworzenia aplikacji równolegªych na klastrach komputerów wieloprocesorowych. W tym przypadku zwykle stosuje si rozwi - zanie hybrydowe, w którym programy s uruchamiane na klastrach komputerowych pod kontrol alternatywnego interfejsu MPI, natomiast do urównoleglenia pracy w zªów klastrów wykorzystuje si OpenMPI. Alternatywny sposób polega na zastosowaniu specjalnych rozszerze«openmp dla systemów pozbawionych pami ci wspóªdzielonej (np. Cluster OpenMP Intela). Gªówne funkcje które zostaªy zawarte przy tworzeniu aplikacji MirrorWeb to: omp_set_num_threads(), ustawia liczbe w tków #pragma omp parallel private(x), ustawia pocz tek obczaru kodu który zostanie zrównoleglony oraz przyjmuje parametr X jako prywatny argument, #pragma omp for schedule(static) nowait, ustala pocz tek obszaru zrównoleglenia dla p tli for z parametrym statycznym funkcji schedule a wykonanie danej pragmy nie zale»y od innych funkcji, nowiat (nie czeka) Cz ± III Najwa»niejsze funkcje programu Jedn z najbardziej znacz cych funkcji które realizuje technologia curl jest pobieranie tzw. masterpage, która przyjmuje url w postaci zmiennej typu char, nast pnie pobiera przetworzony kod strony i zapisuje go w postaci pliku. Realizacja pobierania pierwszej strony opisuje poni»sza funkcja: FILE * le = (FILE *)fopen(mylename,"w+"); if(!le) perror("nie udalo sie otworzyc pliku, dzialanie programu zostalo zakonczone!"); exit(0); //culr glowny element pobierajacy pierwsza strone CURL *handle = curl_easy_init(); curl_easy_setopt(handle,curlopt_url,urlstronastartowa.c_str()); curl_easy_setopt(handle,curlopt_writefunction, write_data); 6
//zapis do pliku curl_easy_setopt(handle,curlopt_writedata, le); curl_easy_perform(handle); curl_easy_cleanup(handle); fclose(le); Funkcja która przekazuje linijka po linijce wczytany ci g znaków do nast pnej funkcji parsuj cej o nazwie parsujliniestrony() odpowiada poni»szy kod: Myle.open (mylename); //wczytuje i zapisuje linijka po linijce (string) if (Myle.is_open()) while (Myle.good()) getline(myle,line); parsujliniestrony(line,urlstronastartowa); Myle.close(); Za po±rednictwem wyra»enia regularnego, //inicjalizacja paternu boost::regex rxlinki("href=\""); boost::regex rxplik("src=\""); //porownywanie wczytanych stringow z paternem bool valid = boost::regex_search(linia.c_str(), res, rxlinki); funkcja parsujliniestrony(line,urlstronastartowa) analizuje dostarczony kawaªek pliku i wstawia go do opowiedniej struktury, stosu, zbioru : if (valid) string link = res[0].second; int i = link.nd('"'); link.resize(i); linki.push(link); odwiedzonestrony.insert(link); valid = boost::regex_search(linia.c_str(), res, rxplik); if (valid) string link = res[0].second; int i = link.nd('"'); link.resize(i); //Dodaje jeden znak do tre±ci napisu, zwi kszaj c jego rozmiar (koncepcja operatora) pliki.push_back(urlstronastartowa+"/"+link); Obszar który zrównoleglamy za po±rednictwem technologi OpenMP odpowiada za stworzenie, przekazenie i zakmni nie pliku w którym potencjalny plik zostaª ±ci gniety. //obszar równoleglenia danych (rozdawanie watka pliki do zapisu) 7
omp_set_num_threads(32); #pragma omp parallel private(thread_number) #pragma omp for schedule(static) nowait for (i=0; i<count; i++) thread_number = omp_get_thread_num(); string urlpliku = pliki.at(i); CURL *handle = curl_easy_init(); sprintf(plik,"pobranyplik%d.dat",i); cout<<plik<<endl; cout<<urlpliku<<endl; cout<<"watek: "<<thread_number<<endl; FILE * le = (FILE *)fopen(plik,"w+"); curl_easy_setopt(handle,curlopt_url,urlpliku.c_str()); curl_easy_setopt(handle,curlopt_writefunction, write_data); curl_easy_setopt(handle,curlopt_writedata, le); curl_easy_perform(handle); curl_easy_cleanup(handle); fclose(le); StopTime = clock(); cout<<"czas zapisu: "<<StopTime/10000<<" sekunda"<<endl; //Koniec obszaru równoleglenia Cz ± IV Testowanie wydajno±ci aplikacji MirrorWeb z wykorzystaniem OpenMP 8
Cz ± V Instalacja, konguracja i kompilacja aplikacji MirrorWeb Biblioteki które zostaªy zaimplementowane w ±rodowiko Systemu Ubuntu 11.10 x64 (libcurl,libboost) sudo apt-get install libcurl4-gnutls-dev sudo apt-get install libboost-all-dev (+/- 100-300mb) Sposób kompilacji danego kodu ¹ródªowego g++-4.6 -fopenmp MirrorWeb.cpp -lboost_regex-mt -lcurl -o MirrorWeb Cz ± VI Wnioski Program stworzony z wykorzystaniem przedstawionych technologii speªnia pocz tkowe zaªo»enia i okre±lone wymagania. Wykorzystane technologie umo»liwiaj poprawne i skuteczne dziaªanie programu. Podczas testowania mo»emy zauwa»y»e wykorzystanie zrównoleglenia obszarów programu, przyspiesza jego prac i dziaªanie. Cz ± VII Bibliograa Literatura [1] B. Karlsson, Wi cej ni» C++. Wprowadzenie do bibliotek Boost, Helion, Gliwice 2006 9
[2] Boost C++ Libraries - Boost.Regex documentation (http://www.boost.org/) [3] OpenMP, http://computing.llnl.gov/tutorials/openmp/ Author:Blaise Barney, Lawrence Livermore National Laboratory 10