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

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

Wstęp do programowania INP001213Wcl rok akademicki 2018/19 semestr zimowy. Wykład 4. Karol Tarnowski A-1 p.

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

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

ZASADY PROGRAMOWANIA KOMPUTERÓW

Co to jest sterta? Sterta (ang. heap) to obszar pamięci udostępniany przez system operacyjny wszystkim działającym programom (procesom).

Adam Kotynia, Łukasz Kowalczyk

TESTOWAĆ TESTOWAĆ TESTOWAĆ TESTOWAĆ TESTOWAĆ TESTOWAĆ TESTOWAĆ

Programowanie w języku C++

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

Podstawy programowania komputerów

Podstawy programowania. Wykład 6 Wskaźniki. Krzysztof Banaś Podstawy programowania 1

Zaawansowane programowanie w języku C++ Zarządzanie pamięcią w C++

Wskaźnik może wskazywać na jakąś zmienną, strukturę, tablicę a nawet funkcję. Oto podstawowe operatory niezbędne do operowania wskaźnikami:

dynamiczny przydział pamięci calloc() memset() memcpy( ) (wskaźniki!! )

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

Podstawy programowania. Wykład 7 Tablice wielowymiarowe, SOA, AOS, itp. Krzysztof Banaś Podstawy programowania 1

Zmienne i struktury dynamiczne

Lab 9 Podstawy Programowania

Wstęp do programowania

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

dr inż. Jarosław Forenc

4. Procesy pojęcia podstawowe

A Study of Java`s Non-Java Memory. Remigiusz Mytyk

Języki i metodyka programowania. Wskaźniki i tablice.

Wskaźniki i dynamiczna alokacja pamięci. Spotkanie 4. Wskaźniki. Dynamiczna alokacja pamięci. Przykłady

Kto mówi? Inżynier systemów wbudowanych Linux, ARMv7, ARMv8

Laboratorium nr 9. Temat: Wskaźniki, referencje, dynamiczny przydział pamięci, tablice dynamiczne. Zakres laboratorium:

NETBEANS PROFILER TOMASZ ŁUKASZUK

Podstawy programowania. Wykład 6 Złożone typy danych: struktury, unie. Krzysztof Banaś Podstawy programowania 1

CUDA Median Filter filtr medianowy wykorzystujący bibliotekę CUDA sprawozdanie z projektu

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy PRAWA PRZYJACIÓŁ KLASY. Dostęp z zewnątrz: Dostęp z wewnątrz:

Podstawy programowania. Wykład: 12. Struktury, unie, pola bitowe. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Podstawy programowania w języku C++

Zarządzanie pamięcią w systemie operacyjnym

Zarządzanie pamięcią

Wykład 1: Wskaźniki i zmienne dynamiczne

Jeśli chcesz łatwo i szybko opanować podstawy C++, sięgnij po tę książkę.

Działanie systemu operacyjnego

PRZYDZIAŁ PAMIĘCI OPERACYJNEJ

Wskaźniki. Informatyka

Podstawy programowania w języku C++

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6


Wskaźniki w C. Anna Gogolińska

Przetwarzanie Równoległe i Rozproszone

Architektura komputerów

Wskaźniki. nie są konieczne, ale dają językowi siłę i elastyczność są języki w których nie używa się wskaźników typ wskaźnikowy typ pochodny:

Programowanie współbieżne Wykład 2. Iwona Kochańska

Działanie systemu operacyjnego

Tablice w argumentach funkcji. Tablicy nie są przekazywane po wartości Tablicy są przekazywane przez referencje lub po wskaźniku

4. Procesy pojęcia podstawowe

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy KONSTRUKTORY

Komputery przemysłowe i systemy wbudowane

ISO/ANSI C - funkcje. Funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje

Systemy operacyjne System plików

Kompilator języka C na procesor 8051 RC51 implementacja

Działanie systemu operacyjnego

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

KURS C/C++ WYKŁAD 6. Wskaźniki

Wykład 4: Klasy i Metody

> C++ dynamiczna alokacja/rezerwacja/przydział pamięci. Dane: Iwona Polak. Uniwersytet Śląski Instytut Informatyki

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 26 marca kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 40

System plików JFS. 1 Najważniejsze informacje. Mateusz Zakrzewski. 18 stycznia JFS to skrót od Journalled File System.

1 Podstawy c++ w pigułce.

Laboratorium 6: Dynamiczny przydział pamięci. dr inż. Arkadiusz Chrobot dr inż. Grzegorz Łukawski

Poniższe funkcje opisane są w 2 i 3 części pomocy systemowej.

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 5. Karol Tarnowski A-1 p.

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Prezentacja systemu RTLinux

Podstawy programowania w języku C++

Programowanie w asemblerze Linkowanie

2 Przygotował: mgr inż. Maciej Lasota

Podstawy programowania w języku C++

PROE wykład 3 klasa string, przeciążanie funkcji, operatory. dr inż. Jacek Naruniec

Programowanie obiektowe. Materiały przygotował: mgr inż. Wojciech Frohmberg

Architektura komputerów

Futex (Fast Userspace Mutex) Łukasz Białek

Zarządzanie pamięcią operacyjną

Szablony klas, zastosowanie szablonów w programach

Plan. krótkie opisy modułów. 1 Uwagi na temat wydajności CPython a. 2 Podstawowe techniki poprawiające wydajność obliczeniową

Informatyka. Wy-08 Klasy. mgr inż. Krzysztof Kołodziejczyk

Pamięć. Jan Tuziemski Źródło części materiałów: os-book.com

Jak Windows zarządza pamięcią?

Podstawowe zagadnienia informatyki

zmienne stanowią abstrakcję komórek pamięci: programista może przechowywać dane w pamięci, nie martwiąc się o techniczne szczegóły (np.

4. Procesy pojęcia podstawowe

Podstawy programowania 2. Temat: Wprowadzenie do wskaźników. Przygotował: mgr inż. Tomasz Michno

3 Literatura. c Dr inż. Ignacy Pardyka (Inf.UJK) ASK SP.06 Rok akad. 2011/ / 22

Struktury. Przykład W8_1

Stałe, tablice dynamiczne i wielowymiarowe

Cwiczenie nr 1 Pierwszy program w języku C na mikrokontroler AVR

CODE::BLOCKS & VALGRIND OPRACOWAŁ MICHAŁ BETHKE

Tablice, funkcje - wprowadzenie

Wstęp. do języka C na procesor (kompilator RC51)

Struktura programu. Projekty złożone składają się zwykłe z różnych plików. Zawartość każdego pliku programista wyznacza zgodnie z jego przeznaczeniem.

System operacyjny MACH

Algorytmy i złożoności. Wykład 3. Listy jednokierunkowe

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 16 kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 27

Transkrypt:

Optymalizacja programów Open Source Pamięć część 3 Krzysztof Lichota lichota@mimuw.edu.pl

Alokacja pamięci

Dlaczego alokacja jest ważna dla wydajności Programy w języku wysokiego poziomu wykonują setki tysięcy alokacji, więc jest się o co bić Niefrasobliwa alokacja powoduje nadmierne zużycie pamięci, co przekłada się na wolniejsze działanie całego systemu Programy współbieżne często zatykają się właśnie w alokatorze, który staje się wąskim gardłem

Problemy z alokacją pamięci Standardowe alokatory alokują zazwyczaj nagłówek na każdy blok zaalokowanej pamięci (zwykle 8 bajtów) dla alokacji małych bloków daje to znaczący narzut Standardowe alokatory zaokrąglają alokację do równej granicy bajtów (np. do 8) Pola struktur w C są wyrównywane i zostają w strukturze puste miejsca (padding) Fragmentacja pamięci Niektóre alokatory nie zwracają pamięci do systemu operacyjnego nawet, gdy jej nie używają

Fragmentacja pamięci Alokowanie na przemian małych i dużych bloków, a potem zwolnienie małych powoduje powstanie dziur między dużymi, w których nie można zaalokować odrobinę większego bloku Taka pamięć jest marnowana, nie może zostać użyta, chociaż jest wolna, więc zużycie pamięci przez proces wzrasta

Rozmieszczenie pamięci na stronach Pamięć w systemie operacyjnym jest zarządzana stronami (na architekturze o wielkości 4KB) Jeśli chociaż 1 bajt na stronie jest używany, cała strona musi siedzieć w pamięci Dlatego używane dane nie powinny być porozrzucane po wielu stronach, tylko skupione na jednej

Problemy z wydajnością alokacji pamięci Alokator ogólnego przeznaczenia niekoniecznie pasuje do naszych zastosowań Standardowe alokatory mają na przykład globalny lock na wszystkie wątki, więc działają kiepsko przy dużym stopniu współbieżności Nawet alokator z lokalną pulą na wątek działa źle, kiedy jeden wątek alokuje struktury, a inny je zwalnia

Sposoby radzenia sobie z problemami z alokacją Zastąpienie standardowego alokatora C innym Zmiana parametrów zwykłego alokatora malloc() Użycie nowszej biblioteki C/C++ Zastąpienie operatora new w C++ (globalnie dla całego programu lub dla klasy) Niektóre biblioteki szablonów (np. STL) pozwalają podać alokator przy instancjacji szablonu Własne zarządzanie pamięcią Alokacja z puli Własny alokator dla zmiennych rozmiarów Alokacja bezpośrednio z systemu operacyjnego (mmap)

Uwagi Biblioteki wysokiego poziomu (np. glib) często mają własne alokatory lub funkcje do alokacji pamięci, więc przy pracy z takimi programami musimy zdawać sobie sprawę, że zarządzanie pamięcią odbywa się na innym poziomie Pakowanie struktur żeby zajmowały mniej pamięci może powodować spadek wydajności, bo struktury nie są wyrównane w pamięci

Padding i reorganizacja struktur Pola struktur są wyrównywane do odpowiedniej granicy bajtów, żeby przyspieszyć dostęp do pola (np. pola int są wyrównywane do 4 bajtów) Można zmniejszyć rozmiar struktury usuwając padding zmiana kolejności pól packed structs Najczęściej używane pola powinny się mieścić w jednej linii cache (16 bajtów) w celu przyspieszenia dostępu do pamięci

Pakowanie struktur Pakowanie struktur włącza się w GCC za pomocą atrybutu packed, który można zastosować do pola lub całej struktury, np: struct test_t { int a; char b; int c; } attribute (( packed )); Można też zmienić wyrównanie poszczególnych pól za pomocą atrybutu aligned

Reorganizacja struktur Struktury są tworzone w takiej kolejności jak jest podana w deklaracji pól Zmieniając kolejność na taką, by pola były od razu wyrównane do swojej właściwej granicy można zmniejszyć rozmiar struktury Rozmiar struktury nadal jest wyrównywany! struct test_1_t { char b; int c; char d; char e; }; //rozmiar = 12 struct test_2_t { int c; char b; char d; char e; }; //rozmiar = 8

Wykrywanie problemów alokacji

Wykrywanie problemów alokacji Ogólna liczba alokacji porównać pamięć raportowaną np. przez exmap/top z tym co pokazują profilery malloc() Ogólne statystyki mallinfo/malloc_stats Problemy z wydajnością zwykłe profilery Śledzenie liczby alokacji, rozmiarów i położenia (fragmentacji) kmtrace (trzeba sobie samemu napisać) Google heap profiler (ile alokujemy i skąd) Rozlokowanie pamięci memprof z łatą pokazującą położenie zaalokowanych bloków Brak kompleksowego narzędzia może warto napisać?

mallinfo/malloc_stats Funkcje pozwalające się z grubsza zorientować w tym jak alokator malloc() przydziela pamięć Należy zaincludować malloc.h i w odpowiednim momencie wywołać funkcję z kodu malloc_stats() wypisuje podstawowe informacje na wyjście programu mallinfo() podaje te informacje w postaci zmiennych

Sterowanie zachowaniem standardowego alokatora Można sterować zwykłym alokatorem malloc() w pewnym stopniu Można ustawić od jakiego rozmiaru pamięć alokowana jest za pomocą mmap() Można ustawić kiedy pamięć jest zwracana do systemu operacyjnego za pomocą sbrk() Można wyłączyć używanie mmap() do alokacji Więcej: http://www.linuxjournal.com/article/6390

Alokacja z puli

Alokacja z puli Przydzielamy duży blok normalnym alokatorem Dzielimy ten blok na fragmenty o stałej wielkości Zarządzamy tym blokiem własnym algorytmem (mapa bitowa, lista wolnych obszarów, itp.) Można inicjować każdy fragment tylko raz przy inicjalizacji puli (np. slab allocator w jądrze Linuksa) Przykład: boost::pool alokator ogólnego przeznaczenia pule dla obiektów

Memory compaction

Memory compaction Jeśli nasz sposób alokacji powoduje rozrzucanie zaalokowanej pamięci po znacznym obszarze, można się zastanowić nad sensownością relokacji używanych bloków do jednego obszaru (analogicznie do defragmentacji dysku) Wymaga wprowadzenia jednego poziomu przekierowania (wskaźnik do wskaźnika, tablica, słownik) Nie można trzymać bezpośrednich wskaźników do obszarów

tcmalloc

tcmalloc Alokator będący częścią pakietu Google perftools Działa szybciej niż zwykły alokator, ale zużywa trochę więcej pamięci Działa szybciej dla programów wielowątkowych, bo używa puli pamięci lokalnej dla wątku (unika częstej synchronizacji) W przeciwieństwie do niektórych wielowątkowych alokatorów pamięć z puli dla wątku wraca do puli globalnej i może być użyta w innych wątkach

Użycie tcmalloc Zastępuje malloc/free Można użyć za pomocą LD_PRELOAD: LD_PRELOAD=libtcmalloc.so program Można wlinkować bezpośrednio do programu za pomocą ltcmalloc Jeśli nie potrzebujemy Google heap profilera, to można wlinkować libtcmalloc_minimal zamiast libtcmalloc

Google heap profiler

Google heap profiler Przechwytuje odwołania do malloc(), free() i pokrewnych Wymaga użycia tcmalloc (alokatora z pakietu Google perftools) Może pokazać w których funkcjach jest alokowana pamięć (rozmiar, liczba obiektów) Wyniki pokazuje jako graf, analogicznie do Google profilera, za pomocą tego samego narzędzia (pprof)

Użycie Google heap profilera LD_PRELOAD="/usr/lib/libtcmalloc.so" HEAPPROFILE=heapprofile.out <polecenie> Stan jest zrzucany co określoną liczbę zaalokowanych bajtów do plików heapprofile.out.xxxx.heap Procesy potomne są śledzone, ich stan jest zrzucany do plików z końcówką równą pidowi Można zmienić co ile jest generowany zrzut za pomocą zmiennych środowiska HEAP_PROFILE_ALLOCATION_INTERVAL i HEAP_PROFILE_INUSE_INTERVAL

Generowanie wyników pprof <opcje> program_wykonywalny ślad Wynik jest wysyłany na stdout Przykład: pprof gif /usr/bin/gnuplot heapprofile.out.0001.heap >googleheapgnuplot.gif Przydatne opcje (oprócz tych ogólnych dla pprof): inuse_space pokazuje używaną pamięć w MB inuse_objects pokazuje liczbę używanych obiektów alloc_space pokazuje zaalokowaną w czasie całego życia programu pamięć (włączając już zwolnione obszary) alloc_objects analogicznie dla obiektów base porównuje ślad z podanym śladem

Uwagi Wszystkie uwagi dotyczące zwykłego Google profilera odnoszą sie do heap profilera (zgodność bibliotek, itp.) Opcja porównywania generuje bardzo duże obrazki trzeba uważać przy przeglądaniu, najlepiej generować do formatu wektorowego albo tekstowego

Bibliografia http://en.wikipedia.org/wiki/slab_allocator http://www.boost.org/libs/pool/doc/concepts.html http://www.boost.org/libs/pool/doc/interfaces.html http://www.sgi.com/tech/stl/allocators.html http://www.delorie.com/gnu/docs/glibc/libc_35.html http://www.delorie.com/gnu/docs/glibc/libc_32.html http://www.linuxjournal.com/article/6390 http://goog perftools.sourceforge.net/doc/heap_profiler.h http://goog perftools.sourceforge.net/doc/tcmalloc.html http://sig9.com/articles/gcc packed structures http://gcc.gnu.org/onlinedocs/gcc 3.3.3/gcc/Variable Att