2014-05-23 15 views
12

mam podobny problem do tego: Python subprocess.Popen "OSError: [Errno 12] Cannot allocate memory"Python os.fork OSError: [ERRNO 12] Nie można przydzielić pamięci (ale pamięć nie problem)

Mam proces demona, który działa OK na kilka minut, a następnie nie uruchamia programów powłoki za pośrednictwem popen2.Popen3(). Tworzy 20 wątków. Pamięć nie wydaje się być problemem; jest to jedyny program działający na komputerze, który ma 2G pamięci RAM i zużywa mniej niż 400M. Logowałem się na ru_maxrss, a to tylko 50M (przed i po podniesieniu OSError).

ulimit -a: 

core file size   (blocks, -c) 0 
data seg size   (kbytes, -d) unlimited 
scheduling priority    (-e) 0 
file size    (blocks, -f) unlimited 
pending signals     (-i) 15962 
max locked memory  (kbytes, -l) 64 
max memory size   (kbytes, -m) unlimited 
open files      (-n) 1024 
pipe size   (512 bytes, -p) 8 
POSIX message queues  (bytes, -q) 819200 
real-time priority    (-r) 0 
stack size    (kbytes, -s) 8192 
cpu time    (seconds, -t) unlimited 
max user processes    (-u) 15962 
virtual memory   (kbytes, -v) unlimited 
file locks      (-x) unlimited 

Mam również oglądanie free -m i ls /proc/$pid/fd | wc -l gdy jest uruchomiony, a żadna z nich nie wydaje się wskazywać, wyczerpanie zasobów. Oto typowy free -m podczas biegu:

   total  used  free  shared buffers  cached 
Mem:   2003  374  1628   0   46  154 
-/+ buffers/cache:  173  1830 
Swap:   283   0  283 

... a licznik fd jest około 90-100.

Hostem jest Ubuntu 12.04 (serwer jeos - minimal vm), Python 2.7.3, działający na hoście VMWare.

Zastanawiam się: co mam zrobić, aby zdiagnozować, dlaczego to się nie udaje? Czy mogę zebrać trochę statystyk zasobów? Czy muszę zejść do poziomu strace?

+0

Ile procesów obsługuje użytkownik? –

+0

Czy system jest skonfigurowany do nadmiernego zacofania? Rachunek pamięci obliczy taką samą ilość pamięci, jaką rodzic wykorzystuje przed rozwidleniem (klonowaniem) dziecka. Jak duża jest Twoja aplikacja przed rozwidleniem? – alvits

+0

1 proces, 20 wątków. Overcommit jest włączony. Nie wiem, jak duża jest moja aplikacja przed rozwidleniem; czy nie tak mówi nam ru_maxrss? Jeśli nie, to jak się dowiem? –

Odpowiedz

1

Hipoteza: jeśli twoja maszyna wirtualna jest 32-bitowa, może ci brakować przestrzeni adresowej.

Brak pamięci: przestrzeń adresowa. Pozwól mi wyjaśnić: w Linuksie wiele rzeczy (IO, karta graficzna, pliki mapowane w pamięci) zużywają przestrzeń adresową bez konieczności zużywania odpowiedniej ilości pamięci głównej.

Oto wyjaśnienie zagadnień pokrewnych:

http://us.download.nvidia.com/XFree86/Linux-x86/331.89/README/knownissues.html

(poszukaj "Kernel wirtualnej przestrzeni adresowej wyczerpania na platformie x86" sekcji, należy dmesg aby sprawdzić, czy to jest sytuacja)

ENOMEM błąd w wyniku mmap może bardzo dobrze oznaczać sytuację "niewystarczającej przestrzeni adresowej", a nie tylko "za mało pamięci", chociaż nie jestem pewien, jak zdiagnozować to w CPython. Jeśli masz jakieś duże pliki mmap ed w systemie przez dowolny proces na nim uruchomiony, dobrze ..

1

Sprawdź, czy masz wolne miejsce na dysku, to był problem w moim przypadku.

[email protected]:~$ df -h 
Filesystem   Size Used Avail Use% Mounted on 
/dev/sda1    16G 16G  0 100%/
tmpfs     2.0G  0 2.0G 0% /dev/shm 
/dev/sdb    296G 162G 119G 58% /home 
Powiązane problemy