Thread View: pl.comp.lang.perl
5 messages
5 total messages
Started by Marcin Gryszkalis
Wed, 01 Jul 2009 04:56
optymalizacja zajętości pamięci
Author: Marcin Gryszkalis
Date: Wed, 01 Jul 2009 04:56
Date: Wed, 01 Jul 2009 04:56
25 lines
1896 bytes
1896 bytes
Witam Musiałem na szybko napisać programik i żeby nie tracić czasu to zrobiłem to w oparciu o perlowe wątki (ithreads). Wiedziałem, że tworzenie wątków perlowych jest wolne (tu akurat nie ma zanczenia bo ilość wątków jest stałą i są tworzone raz na starcie) i że względem pamięci niezbyt optymalne (ze względu na kopiowanie) ale za to program zdążył powstać - co mogłoby się nie udać gdybym zrobił jakiś oddzielny wielowątkowy proces w c + kontroler w perlu czy jakieś inne kombiacje. No i teraz zastanawiam się jak zmniejszyć obciążenie pamięci. W tej chwili dla 100 wątków całość zajmuje jakieś 300MB pamięci (v5.8.9 built for i386-freebsd-thread-multi-64int) i czyli jakieś 3MB na wątek. Po pierwsze - czy macie jakieś ogólne "dobre rady" co do zmniejszenia obciążenia pamięci. Po drugie - czy da się jakoś w miarę łatwo określić co zajmuje pamięć? Próbowałem użyć Devel::FindGlobals ale z miernym skutkiem - największe co pokazał to %Exporter::Cache - raptem 50KB. pozdrawiam -- Marcin Gryszkalis, PGP 0x9F183FA3 jabber jid:mg@fork.pl, gg:2532994 http://the.fork.pl
Re: optymalizacja zajętości pamięci
Author: Adam Osuchowski
Date: Sun, 05 Jul 2009 23:45
Date: Sun, 05 Jul 2009 23:45
28 lines
2424 bytes
2424 bytes
Marcin Gryszkalis wrote: > No i teraz zastanawiam się jak zmniejszyć obciążenie pamięci. W tej chwili > dla 100 wątków całość zajmuje jakieś 300MB pamięci (v5.8.9 built for > i386-freebsd-thread-multi-64int) i czyli jakieś 3MB na wątek. > > Po pierwsze - czy macie jakieś ogólne "dobre rady" co do zmniejszenia > obciążenia pamięci. Zainteresuj się funkcją set_stack_size(). To jest tak naprawdę wraper na funkcję pthread_attr_setstacksize() z libpthread. Można też podać parametr stack_size przy ,,use threads'' albo ustawić zmienną środowiskową PERL5_ITHREADS_STACK_SIZE. > Po drugie - czy da się jakoś w miarę łatwo określić co zajmuje pamięć? > Próbowałem użyć Devel::FindGlobals ale z miernym skutkiem - największe co > pokazał to %Exporter::Cache - raptem 50KB. Tak naprawdę to nic. :) Te 3MB na wątek, o których piszesz, to jest pamięc zarezerwowana na stos i TLS wątku i często leżąca odłogiem, a nawet nie zaalokowana (może Ci wyjść, że wielowątkowy proces teoretycznie zajmuje więcej niż masz pamięci w komputerze). Jeżeli nie będziesz tworzył jakichś strasznie głębokich rekurencji, a perl nie będzie tworzył zbyt wielu zmiennych automatycznych (w sensie C, a nie wiem jak to wygląda dokładnie w perlu), to spokojnie możesz zjechać z tą wartością nawet do kilkudziesięciu/kilkuset kB. Ja kiedyś na potrzeby aplikacji typu serwer z ok. 1000 wątków, która obsługiwała jakiś tam protokół sieciowy i grzebała po bazie ustawiłem 64kB i starczyło. Najlepiej będzie jak dobierzesz tę wartość eksperymentalnie.
Re: optymalizacja zajętości pamięci
Author: Marcin Gryszkalis
Date: Thu, 09 Jul 2009 20:48
Date: Thu, 09 Jul 2009 20:48
49 lines
2911 bytes
2911 bytes
Witam Adam Osuchowski wrote: > Zainteresuj się funkcją set_stack_size(). To jest tak naprawdę wraper na > funkcję pthread_attr_setstacksize() z libpthread. Można też podać > parametr stack_size przy ,,use threads'' albo ustawić zmienną środowiskową > PERL5_ITHREADS_STACK_SIZE. To już zrobiłem. także na wszelki wypadek dodatkowo przed samym uruchomieniem przez ulimit -s > >> Po drugie - czy da się jakoś w miarę łatwo określić co zajmuje pamięć? >> Próbowałem użyć Devel::FindGlobals ale z miernym skutkiem - największe co >> pokazał to %Exporter::Cache - raptem 50KB. > > Tak naprawdę to nic. :) Te 3MB na wątek, o których piszesz, to jest > pamięc zarezerwowana na stos i to już załatwiliśmy > TLS wątku i ale masz na myśli coś na niskim poziomie (biblioteki) czy :shared na poziomie perla? > często leżąca odłogiem, > a nawet nie zaalokowana (może Ci wyjść, że wielowątkowy proces > teoretycznie zajmuje więcej niż masz pamięci w komputerze). prawdę mówiąc nie zdąrzyłem przetestować ile faktycznie mogę wątków stworzyć, ale te 3MB są widoczne jako RSS. > Jeżeli nie > będziesz tworzył jakichś strasznie głębokich rekurencji, a perl nie > będzie tworzył zbyt wielu zmiennych automatycznych (w sensie C, a nie > wiem jak to wygląda dokładnie w perlu), to spokojnie możesz zjechać z tą > wartością nawet do kilkudziesięciu/kilkuset kB. Tak też było dla aplikacji w C, ze stosem schodziłem nawet do 8kB ale niestety tutaj tak nie bardzo się udaje - dlatego chciałbym wiedzieć, który moduł mi te 3MB zjadł, bo być może da się coś wyciąć znacząco i odchudzić. Wiem, że nie pozbędę się struktur typu %INC ale niektóre moduły potrafią zajmować niepotrzebnie dużo pamięci i można łatwo to obejść (np. parsować ręcznie plik linia po linii zamiast używać modułu do parsowania, który dla własnej wygody wczytuje go w całości do pamięci). No tylko nie wiem jak to zrobić :) pozdrawiam -- Marcin Gryszkalis, PGP 0x9F183FA3 jabber jid:mg@fork.pl, gg:2532994 http://the.fork.pl
Re: optymalizacja zajętości pamięci
Author: Adam Osuchowski
Date: Tue, 14 Jul 2009 20:52
Date: Tue, 14 Jul 2009 20:52
39 lines
3167 bytes
3167 bytes
Marcin Gryszkalis wrote: > ale masz na myśli coś na niskim poziomie (biblioteki) czy :shared na > poziomie perla? Na niskim, to co jest alokowane przez libpthread albo nawet przez jądro. > prawdę mówiąc nie zdąrzyłem przetestować ile faktycznie mogę wątków > stworzyć, ale te 3MB są widoczne jako RSS. RSS to jest suma wielkości stron pamięci, które są aktualnie w fizycznym RAMie, a nie na swapie. Może się więc to zmieniać w zależności od stanu środowiska i nie ma bezpośrednio wpływu na tę wartość ilość wątków. Ogólnie, informacje z topa czy z /proc/<pid>/status (bo top w zasadzie z tego korzysta) są IMHO mało adekwatne, ponieważ nie rozróżniają stron anonimowych i R/W, czyli tych, które fizycznie zajmują pamięć pojedynczego procesu (obojętne RAM czy swap), od niemodyfikowalnych stron zamapowanych z jakiegoś pliku (czyli z kodem wykonywalnym lub danymi R/O), które są współdzielone między procesami i tak naprawdę w pamięci znajdują się tylko w jednej kopii dla całego systemu, a naliczane są osobno każdemu procesowi, który ich używa. Lepiej już przeanalizować jest zawartość /proc/<pid>/maps, w którym jest to rozbite na poszczególne zakresy, i samemu policzyć. > Tak też było dla aplikacji w C, ze stosem schodziłem nawet do 8kB ale > niestety tutaj tak nie bardzo się udaje - dlatego chciałbym wiedzieć, który > moduł mi te 3MB zjadł, bo być może da się coś wyciąć znacząco i odchudzić. > Wiem, że nie pozbędę się struktur typu %INC ale niektóre moduły potrafią > zajmować niepotrzebnie dużo pamięci i można łatwo to obejść (np. parsować > ręcznie plik linia po linii zamiast używać modułu do parsowania, który dla > własnej wygody wczytuje go w całości do pamięci). > > No tylko nie wiem jak to zrobić :) Od perla 5.6, czyli od kiedy wprowadzono nowy model wątków, każdy wątek posiada własny niezależny interpreter perla, który ma własną przestrzeń danych (za wyjątkiem zmiennych dzielonych). Dotyczy to również modułów, tak więc jeżeli jakiś moduł zajmuje Ci 1MB w jednym wątku, to jak nagle stworzysz 300 wątków, to będziesz miał zajęte 300MB. Nie da się więc tak prosto określić, który zajmuje najwięcej.
Re: optymalizacja zajętości pamięci
Author: Marcin Gryszkalis
Date: Tue, 21 Jul 2009 00:09
Date: Tue, 21 Jul 2009 00:09
21 lines
1852 bytes
1852 bytes
Adam Osuchowski wrote: > Od perla 5.6, czyli od kiedy wprowadzono nowy model wątków, każdy wątek > posiada własny niezależny interpreter perla, który ma własną przestrzeń > danych (za wyjątkiem zmiennych dzielonych). Dotyczy to również modułów, > tak więc jeżeli jakiś moduł zajmuje Ci 1MB w jednym wątku, to jak nagle > stworzysz 300 wątków, to będziesz miał zajęte 300MB. Nie da się więc tak > prosto określić, który zajmuje najwięcej. No a ja właśnie bym chciał wiedzieć ile który moduł... Dla potomności: - jest kilka wpisów w faq http://perldoc.perl.org/5.8.9/perlfaq3.html#How-can-I-make-my-Perl-program-take-less-memory? http://perldoc.perl.org/5.8.9/perlfaq3.html#How-can-I-free-an-array-or-hash-so-my-program-shrinks? - jest też ciekawy moduł Devel::MemUsed i bazowy Devel::Mallinfo pozdrawiam -- Marcin Gryszkalis, PGP 0x9F183FA3 jabber jid:mg@fork.pl, gg:2532994 http://the.fork.pl
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads