2012-10-23 10 views
8

Niedawno dowiedziałem się o jemalloc, jest to alokator pamięci używany przez firefox. Próbowałem włączyć integrację jemalloc do mojego systemu przez nadpisanie nowego operatora delete i wywołanie odpowiedników jemalloc malloc i free tj jemmicoc i je_free. Napisałem aplikację testową, która wykonuje 100 milionów alokacji. Uruchomiłem aplikację zarówno z malloc glibc jak i jemalloc, podczas gdy praca z jemalloc zajmuje mniej czasu na takie alokacje, wykorzystanie procesora jest dość wysokie, ponadto wydruk stopy pamięci jest również większy w porównaniu do malloc. Po przeczytaniu tego dokumentu na jemalloc analysis wydawało się, że jemalloc może mieć footprints większy niż malloc, ponieważ wykorzystuje techniki optymalizacji prędkości niż pamięci. Jednak nie mam żadnych wskaźników do użycia procesora z Jemalloc. Chciałbym powiedzieć, że pracuję na maszynie wieloprocesorowej, której szczegóły podano poniżej.Wykorzystanie procesora i pamięci przez jemalloc w porównaniu z malloc glibc

procesor 11 vendor_id: GenuineIntel procesora rodziny 6 Model 44 nazwa modelu Intel (R) Xeon (R) X5680 procesora @ 3,33 GHz krokowy 2 procesora MHz: wielkość 3325,117 cache: 12288 KB fizyczne ID: 1 rodzeństwa 12 rdzenia ID: 10 rdzeni procesora 6 apicid: 53 FPU: tak fpu_exception: tak poziom CPUID 11 WP: tak flagi: FPU VME de PSE TSC msr PAE jaw CX8 apic sep mtrr PGE MCA cmov pat pse36 clflush dts ACPI mmx fxsr SSE SSE2 ss ht tm syscall nx pdpe1gb rdtscp lm constant_tsc ida nonstop_tsc Arat PNI monitorować ds_cpl VMX SMX est TM2 ssse3 CX16 xtpr sse4_1 sse4_2 popcnt lahf_lm bogomipsy: 6649,91 wielkości clflush: 64 cache_alignment: 64 rozmiary: 40 bitów adresu fizycznych, 48 bitów wirtualnych zarządzania zasilania [8]

ja pomocą góry -c -b -d -p 24670 1,10 | awk -v czas = $ TIME '{czas wydruku, ",", 9 $}', aby śledzić użycie procesora.

Czy ktoś miał podobne doświadczenia podczas integracji Jemlloc?

Dzięki!

Odpowiedz

1

To pytanie może nie należeć do tego miejsca, ponieważ w przypadku rozwiązań stosowanych w świecie rzeczywistym, nie powinno być istotne, co inni użytkownicy znaleźli na różnych urządzeniach/środowiskach/scenariuszach użytkowania. Powinieneś przetestować system docelowy i zobaczyć, co ci odpowiada.

Jeśli chodzi o większy obszar pamięci, jedną z najbardziej klasycznych optymalizacji wydajności w informatyce jest kompromitacja pamięci czasu. To znaczy, buforowanie pewnych wyników dla późniejszego wyszukiwania i zapobieganie częstym ponownym obliczeniom. Ponadto, ponieważ jest to prawdopodobnie dużo bardziej złożone, prawdopodobnie byłoby o wiele więcej wewnętrznych księgowości. Taki rodzaj kompromisu powinien być mniej lub bardziej spodziewany, szczególnie przy wybieraniu między wariantami tak niskiego poziomu a powszechnie stosowanymi modułami rdzeniowymi. Musisz dostosować charakterystykę wydajności do twoich cech użytkowania, ponieważ zwykle nie ma srebrnej kuli.

Być może zechcesz również spojrzeć na Google'a TCMalloc, który jest dość blisko, choć uważam, że Jemalloc jest nieco bardziej wydajny w sensie ogólnym, a także powoduje mniejszą fragmentację sterty w czasie.

+0

dzięki za komentarze Preet. Próbowałem dowiedzieć się, czy ktoś miał podobne obserwacje na jakiejkolwiek innej maszynie wieloprocesorowej. Całkowicie zgadzam się z tobą, że dokładna wydajność byłaby całkowicie zależna od sprzętu, jednak zastanawiałem się, czy wzór wykorzystania procesora powinien być taki sam, tj. Wyższy dla jemalloc w środowisku wieloprocesorowym env. – deb

1

Aerospike zaimplementował jemalloc na naszej bazie danych NoSQL i publicznie opublikował implementację około rok temu z wersji 3.3.x.Właśnie dzisiaj Psi Mankoski opublikował an article on High Scalability o tym, dlaczego i jak to zrobiliśmy, i poprawie wydajności, jaką dało w porównaniu z malloc GlibC.

Rzeczywiście zauważyliśmy spadek wykorzystania pamięci RAM ze względu na sposób, w jaki mogliśmy wykorzystać możliwość debugowania jemalloc, aby zminimalizować fragmentację pamięci RAM. W środowisku produkcyjnym serwer% Free Memory był często "spicky graph", a przed wdrożeniem JEMalloc często wzrósł aż o 54%. Po wdrożeniu można zaobserwować zmniejszenie wykorzystania pamięci RAM w 4-miesięcznym okresie analizy. Pamięć RAM% wolnej pamięci zaczęła "płasko" i była znacznie bardziej przewidywalna, zawisając pomiędzy ~ 22-40% w zależności od węzła serwera.

Jak mówi Preet, z czasem było znacznie mniej fragmentacji, co oznacza mniejsze wykorzystanie pamięci RAM. Artykuł Psi podaje "dowód w puddingu" za takim stwierdzeniem.

19

Jeden mądry człowiek powiedział na CppCon, że nigdy nie musisz zgadywać o wydajności. Musisz zmierzyć to zamiast tego. Próbowałem użyć jemalloc z wielowątkową aplikacją dla systemu Linux. Był to niestandardowy serwer protokołu na poziomie aplikacji (przez TCP/IP). Ta aplikacja C++ używała trochę kodu Javy przez JNI (prawie 5% czasu używał Java, a 95% czasu używał kodu C++). Uruchomiłem dwie instancje aplikacji w trybie produkcyjnym. Każdy miał 150 wątków. Po 72 godzinach od uruchomienia glibc jeden używany 900 M pamięci i jemalloc jeden używany 2,2 G pamięci. Nie widzę znaczącej różnicy wykorzystania procesora. Rzeczywista wydajność (średni czas wyświetlania żądań klienta) była prawie taka sama dla obu instancji. Tak więc w moim teście glibc było znacznie lepiej niż jemalloc. Oczywiście, jest to moja specyficzna aplikacja. Wniosek: Jeśli masz powody, by sądzić, że zarządzanie pamięcią aplikacji jest nieskuteczne z powodu fragmentacji, musisz wykonać test podobny do tego, który opisałem. Jest to jedyne wiarygodne źródło informacji dla Twoich konkretnych potrzeb. Jeśli jemalloc jest zawsze lepsza niż glibc, glibc spowoduje, że jemalloc stanie się oficjalnym przydziałem. Jeśli glibc jest zawsze lepsza, jemalloc przestanie istnieć. Kiedy konkurenci istnieją przez długi czas równolegle, oznacza to, że każdy ma własną niszę użytkowania.

0

Zajmuję się tworzeniem prostej bazy danych NoSQL.
(https://github.com/nmmmnu/HM4)

jemalloc vs standardowej malloc

Podczas korzystania jemalloc, zmniejszenie wydajności, ale pamięci "rozdrobnienia" zmniejsza się także. Jemalloc również wydaje się zużywać mniej pamięci na szczycie, ale różnica wynosi 5-6%.

Co mam na myśli z fragmentacją pamięci jest następująca.

  • Najpierw przeznaczyć wiele par klucz (5-7 GB pamięci)
  • Potem patrzę na wykorzystanie pamięci.
  • Następnie zwalniam wszystkie pary i każdą inną pamięć używaną przez mój plik wykonywalny. Kolejność przydziału jest taka sama jak kolejność deallokacji.
  • Wreszcie sprawdzam użycie pamięci ponownie.

W standardowym malloc, ussage jest prawie jak na szczycie. (Szczególnie sprawdziłem dla pamięci mmap i nie ma jej).

Z użyciem jemalloc jest minimalne.


informacje premia - tcmalloc

Ostatni raz sprawdzane tcmalloc, to było naprawdę bardzo szybko - prawdopodobnie ponad 10% poprawę standardowego malloc.

Na szczycie zużywa mniej pamięci niż standardowe malloc, ale więcej niż jemalloc.

Nie pamiętam fragmentacji pamięci, ale było to dalekie od wyniku jemalloc.