Politechnika Krakowska Im. Tadeusza Ko±ciuszki
Transkrypt
Politechnika Krakowska Im. Tadeusza Ko±ciuszki
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 asocja- cyjnymi (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 MirrorWeb 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ów- noleglonego 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