Nie miałem czasu zajrzeć do źródła, ale oto kilka komentarzy:
Pytanie 1. Dlaczego przy tak potężnym serwerze system operacyjny nie zapewnia takiej pamięci aplikacji (była to jedyna uruchomiona aplikacja)?
Ponieważ maszyna wirtualna Erlang próbowała zużywać więcej niż dostępna wolna pamięć.
Pytanie 2. Emulator Erlanga i start został poinstruowany, aby mógł odrodzić tyle procesów, ile może potrzebować. wartość +P 13421779. Czy maszyna wirtualna Erlang nie może uzyskać dostępu do tej pamięci lub nie może jej przydzielić do swoich procesów?
Nie. Gdyby skończyły się procesy, maszyna wirtualna Erlang tak powiedziałaby (a maszyna wirtualna nadal byłaby uruchomiona):
=ERROR REPORT==== 18-Aug-2011::10:04:04 ===
Error in process <0.31775.138> with exit value: {system_limit,[{erlang,spawn_link, [erlang,apply,[#Fun<shell.3.130303173>,[]]]},{erlang,spawn_link,1},{shell,get_command,5}, {shell,server_loop,7}]}
Pytanie 3. Solaris widzi jeden proces:epmd, być może zawierający i rozpoczynający tysiące mikro wątków. Jakie konfiguracje mogą sprawić, że Solaris będzie w stanie nigdy nie zatrzymywać mojej aplikacji bez względu na to, jak bardzo jest „głodna pamięci”? Dostępna przestrzeń wymiany to 16 GB, RAM 20 GB, szczerze, coś musi być nie tak.
epmd
jest demonem mapowania portów Erlang. Jest odpowiedzialny za zarządzanie rozproszonym Erlangiem i nie ma nic wspólnego z Twoją indywidualną aplikacją Erlang. Procesy, których powinieneś szukać, będą nazywać się beam.smp
najprawdopodobniej. Pokazują one zużycie pamięci systemu operacyjnego przez maszynę wirtualną Erlang itp.
Pytanie 4. Jakie konfiguracje mogę wykonać w emulatorze Erlanga, aby uniknąć tych awaryjnych zrzutów pamięci, zwłaszcza gdy cała potrzebna pamięć jest dostępna na serwerze? Jak mam uruchamiać więcej aplikacji zużywających pamięć na tym serwerze, jeśli Erlang nadal nie może przydzielić takiej pamięci do prostego indeksatora systemu plików (cóż jest mocno współbieżny)?
Maszyna wirtualna Erlang powinna być w stanie wykorzystać całą dostępną pamięć w twoim komputerze. Jednak zależy to od tego, jak napisana jest Twoja aplikacja. Przyczyn wycieków pamięci może być wiele:
- Wypełnianie tabeli atomów (tworzysz zbyt wiele unikalnych atomów)
- Tabele ETS lub Mnesia nie są zbieranymi śmieciami (nie usuwasz starych, nieużywanych elementów)
- Za mało pamięci dla procesów (odradzasz zbyt wiele procesów)
- Utworzono zbyt wiele plików binarnych (możesz zachować nieużywane odniesienia do starych plików binarnych)