Optymalizacja programów Open-Source. Optymalizacja czasu uruchamiania programu. Krzysztof Lichota

Podobne dokumenty
Programowanie w asemblerze Linkowanie

Optymalizacja programów Open Source. Profilery wysokiego poziomu część 2. Krzysztof Lichota

Optymalizacja programów Open Source. Profilery wysokiego poziomu część 1. Krzysztof Lichota

Optymalizacja programów Open-Source. Pamięć część 1. Krzysztof Lichota

Student 1. Loguje się do wirtualnego dziekanatu 2. Najlepiej z przeglądarki Mozilla Firefox i musi mieć wyłączone blokowanie wyskakujących okienek.

MATERIAŁY DO ZAJĘĆ I. Podstawowe pojęcia. Algorytm. Spis treści Przepis

Procesy pojęcia podstawowe. 1.1 Jak kod źródłowy przekształca się w proces

Spis treści. S t r o n a 2

SPIS TREŚCI: KARTY GRAFICZNE... 15

OPTIMA PC v Program konfiguracyjny dla cyfrowych paneli domofonowy serii OPTIMA ELFON. Instrukcja obsługi. Rev 1

Windows 10 - Jak uruchomić system w trybie

PDF TO FTP ZADANIA PROGRAMU:

Skrócony przewodnik OPROGRAMOWANIE PC. MultiCon Emulator

Zawartość. Wstęp. Moduł Rozbiórki. Wstęp Instalacja Konfiguracja Uruchomienie i praca z raportem... 6

5.2. Pierwsze kroki z bazami danych

nowe idee nowe inspiracje City Network wersja demonstracyjna

Programowanie niskopoziomowe

I. Informacje ogólne. Jednym z takich systemów jest Mambo.

Instalacja programu:

IdyllaOS. Prosty, alternatywny system operacyjny. Autor: Grzegorz Gliński. Kontakt:

Wstęp 5 Rozdział 1. SUSE od ręki 13

Viatoll Calc v1.3. Viatoll Calc. Instrukcja użytkownika. Strona 1

MentorGraphics ModelSim

SYSTEMY OPERACYJNE I SIECI KOMPUTEROWE

Skrócony przewodnik OPROGRAMOWANIE PC. MultiCon Emulator

Wprowadzenie do SAS. Wprowadzenie. Historia SAS. Struktura SAS 8. Interfejs: SAS Explorer. Interfejs. Część I: Łagodny wstęp do SAS Rafał Latkowski

Systemy operacyjne i sieci komputerowe. 1 SYSTEMY OPERACYJNE I SIECI KOMPUTEROWE. Etapy uruchamiania systemu

Optymalizacja programów Open-Source. Dostęp do dysku. Krzysztof Lichota

WOJEWÓDZTWO PODKARPACKIE

Włączanie/wyłączanie paska menu

Divar - Archive Player. Instrukcja obsługi

Programowanie Strukturalne i Obiektowe Słownik podstawowych pojęć 1 z 5 Opracował Jan T. Biernat

Ustawienia personalne

Programowanie Systemów Wbudowanych

Kernel Kompilacja jądra

PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec

Laboratorium 1 Temat: Przygotowanie środowiska programistycznego. Poznanie edytora. Kompilacja i uruchomienie prostych programów przykładowych.

Programowanie obiektowe

Wprowadzenie do biblioteki klas C++


SYSTEMY OPERACYJNE: STRUKTURY I FUNKCJE (opracowano na podstawie skryptu PP: Królikowski Z., Sajkowski M. 1992: Użytkowanie systemu operacyjnego UNIX)

SERWER AKTUALIZACJI UpServ

SYSTEMY OPERACYJNE I laboratorium 3 (Informatyka stacjonarne 2 rok, semestr zimowy)

Bibliotek grid została stworzona aby wykorzystywać funkcje programu R ( oraz wprowadzone do programu R) do tworzenia odwzorowań typu grid oraz siatek

Omega Plus. Wersja

Internet wymagania dotyczące konfiguracji

Przewodnik instalacji i rozpoczynania pracy. Dla DataPage+ 2013

najlepszych trików Excelu

Wirusy w systemie Linux. Konrad Olczak

Co nowego w systemie Kancelaris 3.31 STD/3.41 PLUS

UNIFON podręcznik użytkownika

Opis konfiguracji ST do współpracy z kolektorem DENSO BHT 8000

Ćwiczenie 6. Wiadomości ogólne.

PRZEWODNIK PO ETRADER PEKAO ROZDZIAŁ I. JAK ZACZĄĆ PRACĘ Z ETRADER PEKAO? SPIS TREŚCI

etrader Pekao Podręcznik użytkownika Jak zacząć pracę z etrader Pekao?

Dodawanie stron do zakładek

Menu Plik w Edytorze symboli i Edytorze widoku aparatów

Moduł rozliczeń w WinSkład (od wersji 18.40)

Instalacja programu Warsztat 3 w sieci

dr inż. Jarosław Forenc

Zmiana logo. Dziękujemy za wybór naszych rozwiązań. apjoo od Apláuz. Wspólnie przebrniemy przez proces konfiguracji strony www i wstawiania treści.

Expo Composer Garncarska Szczecin tel.: info@doittechnology.pl. Dokumentacja użytkownika

S P I S T R E Ś C I. Instrukcja obsługi

Monitorowanie wydajność w bazie Oracle11g

1. Podstawy...P Polecenia podstawowe...p... 18

Przewodnik instalacji i rozpoczynania pracy. dla DataPage+ 2012

Programy LeftHand - Obsługa plików JPK. Luty 2017

Instrukcja instalacji oprogramowania Systemu e-kt

Robert Barański, AGH, KMIW Writing TDM and TDMS Files in LabVIEW v1.0

1 Moduł Inteligentnego Głośnika

Za pomocą niniejszej instrukcji baza programu MAK zostanie przygotowania do eksportu na METALIB.

xmlns:prism= c. <ContentControl prism:regionmanager.regionname="mainregion" />

Struktury systemów operacyjnych

1. Aplikacja LOGO! App do LOGO! 8 i LOGO! 7

Rejestr VAT Optivum, Centralny VAT VULCAN

Cechy systemu X Window: otwartość niezależność od producentów i od sprzętu, dostępny kod źródłowy; architektura klient-serwer;

Instrukcja aktualizacji programu Integra 7

po uruchomieniu instalator pyta o język. My potwierdzamy, że ma być polski (czyli dalej) teraz jest okno <Witamy w kreatorze> klikamy <dalej>

Budowa systemów komputerowych

Produkcja by CTI. Proces instalacji, ważne informacje oraz konfiguracja

Edytor materiału nauczania

INSTRUKCJA OBSŁUGI OPROGRAMOWANIA VMS. Spis treści Instalacja Instrukcje użytkowania i obsługi... 3

Wskazówki dot. konfigurowania Windows 7 do pracy z Aktynem

Programowanie obiektowe. Literatura: Autor: dr inŝ. Zofia Kruczkiewicz

OBSŁUGA I KONFIGURACJA SIECI W WINDOWS

AKTYWNY SAMORZĄD. Instrukcja użytkownika.

Uruchomienie aplikacji Plan lekcji w przeglądarce Internet Explorer

Tytuły Wykonawcze. Opis systemu tworzenia dokumentacji TW-1

Programy LeftHand - Obsługa plików JPK. Wrzesień 2016

Instalowanie VHOPE i plików biblioteki VHOPE

Klient poczty elektronicznej - Thunderbird

Obrazek 1: Interfejs DT. DT Help File v1.3

Instrukcja obsługi programu Profile GT

Przewodnik użytkownika (instrukcja) AutoMagicTest

KOMPUTEROWY SYSTEM WSPOMAGANIA OBSŁUGI JEDNOSTEK SŁUŻBY ZDROWIA KS-SOMED INSTRUKCJA OBSŁUGI

AUTOMATYKA PRZEMYSŁOWA

Wstęp 5 Rozdział 1. Instalacja systemu 13. Rozdział 2. Logowanie i wylogowywanie 21 Rozdział 3. Pulpit i foldery 25. Rozdział 4.

Instrukcja instalacji i obsługi programu Szpieg 3

Instrukcja logowania do systemu e-bank EBS

Transkrypt:

Optymalizacja programów Open-Source Optymalizacja czasu uruchamiania programu Krzysztof Lichota lichota@mimuw.edu.pl

Wprowadzenie

Dlaczego czas uruchomienia programu jest ważny Użytkownik chce zacząć pracę z programem w danej chwili, bo chce coś zrobić, nie chce czekać długo na uruchomienie programu Zbyt długi czas uruchomienia programu obniża jego użyteczność np. zanim uruchomi się przeglądarka WWW możemy zapomnieć co chcieliśmy sprawdzić w Internecie Jeśli program uruchamia się długo, użytkownik ma tendencję do unikania uruchamiania go i szuka zastępników

Co się dzieje w trakcie uruchomienia programu 1.Program macierzysty wykonuje fork() (tanie, bo Linux ma stosuje copy on write przy kopiowaniu pamięci procesu) 2.Proces potomny wykonuje exec(), co powoduje wymazanie pamięci procesu, wmapowanie nowego pliku wykonywalnego i skok do jego procedury wejścia 3.Uruchamiany jest dynamiczny linker, który dolinkowuje biblioteki dynamiczne i łączy je z programem (drogie) 4.Następuje skok do funkcji main().

Co się dzieje w trakcie uruchomienia programu (2) 1.Program wczytuje swoją konfigurację, o ile ją ma. 2.Program inicjalizuje swoje struktury potrzebne do działania. 3.Program doładowuje dynamiczne biblioteki np. na podstawie konfiguracji. 4.Program komunikuje się z demonami i usługami systemowymi. 5.Program tworzy swój interfejs graficzny. 6.Użytkownik może zacząć korzystać z programu.

Kosztowne operacje w trakcie uruchomienia programu Linkowanie intensywnie wykorzystuje CPU i pamięć (w tym również doładowywanie bibliotek w trakcie działania za pomocą dlopen(), np. wtyczek) Wczytywanie wmapowanych plików on demand, np. przy linkowaniu, na początku działania losowe I/O w plikach Wczytywanie plików konfiguracyjnych i innych plików niezbędnych do działania (ikon, tłumaczeń, itp.) losowe I/O po systemie plików, dużo operacji stat()

Dynamiczne linkowanie

Dynamiczne linkowanie W trakcie uruchomienia programu w formacie ELF uruchamiany jest dynamiczny linker, który łączy program z dynamicznymi bibliotekami (i dynamiczne biblioteki ze sobą) pod adresami, który zostały im przydzielone w przestrzeni adresowej Dynamiczne linkowanie wymaga poprawienia pewnych miejsc w przestrzeni adresowej procesu poprawka zwiększa czas uruchomienia i liczbę stron pamięci używanych przez proces

GOT Odwołania do funkcji i symboli wewnątrz biblioteki nie są poprawiane używane jest adresowanie względne (PIC position independent code) Odwołania do kodu i danych z innej biblioteki idą przez GOT (Global Offset Table) tablicę wskaźników do symboli używanych w innej bibliotece Program używa adresowania względem rejestru bazowego, który wskazuje na GOT GOT jest poprawiany w trakcie uruchamiania programu przez dynamiczny linker, jeśli adres biblioteki w pamięci się zmienił od czasu linkowania

PLT i lazy binding Ponieważ nie wszystkie symbole odwołujące się do kodu są używane od razu przez program, stosowane jest leniwe rozwiązywanie symboli symbol jest wyliczany dopiero gdy nastąpi skok do danej funkcji Używana jest do tego tablica PLT (Process Linkage Table), która zawiera adres pod który należy skoczyć Początkowo PLT zawiera puste wpisy, które powodują rozwiązanie symbolu i poprawienie wpisu w tablicy tak, że kolejne skoki już są pod właściwy adres

PLT i lazy binding (2) Lazy binding skraca czas uruchomienia programu, ale kosztem późniejszych przestojów Można wyłączyć lazy binding ustawiając zmienną środowiskową LD_BIND_NOW=1

Łancuchy bibliotek Zgodnie z semantyką wyszukiwania symboli w plikach ELF tworzony jest łańcuch bibliotek, które mogą zawierać symbol Ten łańcuch jest określony przez ścieżki podane przy linkowaniu programu, ścieżki używane przez dynamiczny linker (/etc/ld.so.conf), zmienne środowiskowe LD_LIBRARY_PATH i LD_PRELOAD Daje to dużą elastyczność, ale sprawia, że wyszukiwanie symbolu jest kosztowne

Wyszukiwanie symbolu w bibliotece W każdym miejscu łańcucha symbol jest wyszukiwany po nazwie (potencjalnie bardzo długiej) Symbole są poustawiane w tablice haszujące liczba symboli ma wpływ na czas sprawdzenia czy symbol jest zdefiniowany w danej bibliotece Wyszukanie symbolu składa się z wielu niepomyślnych wyszukań, bo np. symbol zdefiniowany w bibliotece libc może być najpierw wyszukiwany w bibliotece Qt, X, itd. Symbole często różnią się dopiero na ostatnich znakach (z powodu wymagań ABI C++)

Czas przetwarzania relokacji Relokacje dzielą się na nazwane i względne Względne to dodanie pewnego przesunięcia (np. adresu biblioteki) w określonym miejscu (stosunkowo tanie) Nazwane to wyszukanie nazwy symbolu w łańcuchu bibliotek i poprawienie miejsca (drogie) Czas dynamicznego linkowania to O(R+nr), gdzie: R to liczba relokacji względnych r to liczba relokacji po nazwie n to liczba bibliotek dynamicznych

Linkowanie programów w C++ Tablice funkcji wirtualnych dla klas w C++ zawierają wskaźniki do metod dziedziczonych z innych klas, potencjalnie z innych bibliotek, np. każdy element interfejsu w KDE dziedziczy pośrednio po klasie QWidget z biblioteki Qt Wskaźniki w tablicach funkcji wirtualnych są relokowane i musi to być wykonane przy uruchomieniu programu, ponieważ nie ma możliwości sprawdzenia, czy symbol będzie używany Dlatego programy w C++ mają dużo relokacji i od razu przy uruchomieniu

Podglądanie działań linkera LD_DEBUG=symbols <program> pokazuje gdzie linker szuka poszczególnych symboli LD_DEBUG=statistics <program> pokazuje statystyki dynamicznego linkera LD_DEBUG=help <program> pokazuje listę opcji

Wnioski Żeby skrócić czas linkowania, należy: zmniejszyć liczbę bibliotek i/lub zmniejszyć liczbę symboli do przeszukania i/lub zmniejszyć długość symboli i/lub usunąć potrzebę relokacji i/lub zamienić relokacje nazwane na względne

Ograniczanie widoczności symboli Domyślnie wszystkie funkcje i zmienne w C/C++ są eksportowane Ograniczając liczbę eksportowanych symboli zmniejszamy czas wyszukania symboli przy linkowaniu W standardzie C, żeby zablokować eksportowanie symbolu z pliku należy zadeklarować zmienną/funkcję jako static (Uwaga! W klasach C++ to słowo oznacza co innego) Od wersji gcc 4.0 istnieje możliwość domyślnego ukrywania symboli za pomocą opcji kompilatora fvisibility=hidden

Ograniczanie widoczności symboli (2) Potrzebne symbole (funkcje, zmienne, klasy, metody) można uwidocznić za pomocą: attribute ((visibility ("default"))) Istnieje też możliwość zdefiniowania mapy eksportowanych symboli dla programu przy linkowaniu za pomocą opcji version script linkera

Inne sztuczki dotyczące linkowania prelink wykonanie relokacji bibliotek do wyliczonych pozycji (unika w ogóle relokacji, nie działa dla dlopen()) objprelink1/2 zamiana relokacji nazwanych na względne i inne sztuczki kdeinit w systemie istnieje program z dolinkowanymi bibliotekami, który przy uruchomieniu programu dostaje sygnał, żeby się sforkować i załadować program skompilowany jako biblioteka quickstartery utrzymywanie gotowego do wykonania programu w pamięci w ukryciu (np. OpenOffice)

Zmiana działania programu w trakcie startu

Ogólne zasady optymalizacji startu Odwlec wszystko, co nie jest niezbędne do działania programu na jak najpóźniej Nie zatrzymywać wykonania programu w oczekiwaniu na jakieś zdarzenie (np. na nawiązanie połączenia sieciowego) Jeśli musimy zrobić coś kosztownego (np. sięgnąć do dysku), to starać się zrobić za jednym zamachem maksymalnie dużo, by potem to procentowało np. wczytać od razu całą bibliotekę do pamięci

Odwlekanie Jeśli nasz program może obyć się przez jakiś czas bez pewnej czynności (np. jakiegoś połączenia sieciowego, sprawdzania pisowni w dokumencie), odkładamy ją na później albo wykonujemy w tle Jeśli nasz program nie może kontynuować bez danej funkcji, komunikujemy się z procesem w tle i czekamy na jego zakończenie Wady odwlekania: po uruchomieniu programu może on intensywnie wykonywać odwleczone czynności (np. uruchomienie Windows XP)

Odwlekanie (2) Przykład: okno otwierania pliku jest potrzebne dopiero gdy użytkownik kliknie przycisk otwierania pliku, więc można tę funkcję wydzielić do osobnej biblioteki i wczytywać ją dopiero, gdy będzie potrzebna Przykład (negatywny): blokowanie pisania w OpenOffice na czas wczytania modułu sprawdzania pisowni Przykład (hipotetyczny): wczytywanie w tle kanałów RSS

Caching Stosowane jeśli wygenerowanie początkowego stanu programu jest kosztowne Przy zamykaniu zapisujemy przetworzone dane Przy kolejnym uruchomieniu zamiast generować dane na nowo wczytujemy dane zapisane przy zamykaniu

Caching Przykłady: prekompilowane moduły.pyc w Pythonie sparsowane pliki w KDevelopie generowanie grafiki z plików SVG w programach KDE skalowanie tapety baza utworów w Amaroku (hipotetycznie) zapisywanie sparsowanej strony HTML w przeglądarce, wygenerowanego fraktala w programie do fraktali, itp.

Generowanie fragmentaryczne Jeśli program musi coś pokazać, generujemy tylko to, co konieczne do pierwszego wyświetlenia, resztę robimy w tle albo kiedy wymusi to działanie użytkownika Przykłady: wczytywanie znaczników plików mp3 w WinAmpie pokazywanie dużych obrazków (w każdym sensownym programie graficznym) (hipotetycznie) odczytywanie szczegółowych informacji o plikach w katalogu w menedżerze plików

Prefetching Jeśli wiemy, że w trakcie uruchomienia programu będziemy potrzebować jakiegoś pliku (np. biblioteki), zlecamy wczytanie go z wyprzedzeniem i wszystkich potrzebnych części, żeby system mógł sobie to w miarę wolnych zasobów wykonać Optymalnie jest zlecić to z jak najniższym priorytetem, żeby nie opóźniało żądań wysyłanych na bieżąco Nie można przesadzić z ilością tak wczytywanych plików, żeby nie zarżnąć systemu i żeby wczytane zostały w potrzebnej nam kolejności

Prefetching (2) Przykład: ręczny prefetching bibliotek w OpenOffice.org 2.1 Przykład: mój projekt na Google Summer of Code: http://code.google.com/p/prefetch/

Bibliografia http://www.die.net/doc/linux/man/man8/ld linux.8.html http://www.iecc.com/linker/linker10.html i pozostałe z http://www.iecc.com/linker/ http://people.redhat.com/drepper/dsohowto.pdf? http://objprelink.sourceforge.net/objprelink.html http://people.redhat.com/jakub/prelink.pdf http://people.redhat.com/drepper/dsohowto.pdf http://go oo.org/~michael/ooostartup.pdf http://lwn.net/articles/192624/ http://web.archive.org/web/20060425103355/http://www.s