🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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
#51484
Author: Marcin Gryszkalis
Date: Wed, 01 Jul 2009 04:56
25 lines
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
#51486
Author: Adam Osuchowski
Date: Sun, 05 Jul 2009 23:45
28 lines
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
#51487
Author: Marcin Gryszkalis
Date: Thu, 09 Jul 2009 20:48
49 lines
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
#51488
Author: Adam Osuchowski
Date: Tue, 14 Jul 2009 20:52
39 lines
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
#51489
Author: Marcin Gryszkalis
Date: Tue, 21 Jul 2009 00:09
21 lines
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