SORU
2 EYLÜL 2009, ÇARŞAMBA


Python alt işlemi.Popen "OSError: [Hata 12] bellek" tahsis;

Not:Bu soru aslında here istendi ama kelle zaman kabul edilebilir bir cevap değil aslında bulunmuş olsa bile doldu. Tekrar soruyorum tüm detayları asıl soruya verilen de dahil olmak üzere bu soruyu duyuyorum.

Bir python betiği sınıf fonksiyonlar kümesi sched modülü: her 60 saniyede çalışıyor

# sc is a sched.scheduler instance
sc.enter(60, 1, self.doChecks, (sc, False))

Senaryoyu daemonised bir işlem kodu here kullanarak çalışıyor.

DoChecks bir parçası olarak çağrılan sınıf yöntemleri bir dizi sistem istatistikleri için sistem işlevleri çağırmak için subprocess modülünü kullanın:

ps = subprocess.Popen(['ps', 'aux'], stdout=subprocess.PIPE).communicate()[0]

Bu aşağıdaki hata ile kilitleniyor: tüm senaryoyu bir süre için iyi çalışır

File "/home/admin/sd-agent/checks.py", line 436, in getProcesses
File "/usr/lib/python2.4/subprocess.py", line 533, in __init__
File "/usr/lib/python2.4/subprocess.py", line 835, in _get_handles
OSError: [Errno 12] Cannot allocate memory

Senaryo çöktü sonra serbest m sunucu üzerinde çıktı

$ free -m
                  total       used       free     shared     buffers    cached
Mem:                894        345        549          0          0          0
-/  buffers/cache:  345        549
Swap:                 0          0          0

Sunucu 5.3 Otomotiv çalışıyor. Ne de başka bir kullanıcı aynı sorunu raporlama ile kendi Otomotiv-benim kutuları yeniden kuramıyorum.

Bir kaç şey özgün soru önerdiği gibi bu hata ayıklama için çalıştık:

  1. Önce m serbest çıkış kaydı ve Popen aramadan sonra. Yani bellek kullanımı yavaş yavaş çalışır komut olarak kullanılan değil, bellekte önemli bir değişiklik yok.

  2. Ama bu hiçbir fark yaptı close_fds=Popen çağrısı Gerçek ekledim - senaryo hala aynı hata ile kaza yaptı. here here önerdi.

  3. Önerilen here hem RLİMİT_DATA ve RLİMİT_AS (-1, -1) gösterdiği rlimits kontrol ettim.

  4. An article takas alanı olması, ama aslında takas talep üzerine sağlanan (web ana bilgisayara göre) ve bu da sahte bir neden here olarak önerildi neden olabileceğini ileri sürdü.

  5. Süreçlerini kullanarak davranışı nedeniyle kapatıldı .() iletişim Python kaynak kodu ve yorum here desteklenmiş olarak.

Tüm kontroller getProcesses işlevi line 442 tanımlanan GitHub here üzerinde bulunabilir. Bu doChecks tarafından denir() satırı başlayarak 520.

Senaryoyu kazadan önce şu çıktı: trace ile çalıştırıldı

recv(4, "Total Accesses: 516662\nTotal kBy"..., 234, 0) = 234
gettimeofday({1250893252, 887805}, NULL) = 0
write(3, "2009-08-21 17:20:52,887 - checks"..., 91) = 91
gettimeofday({1250893252, 888362}, NULL) = 0
write(3, "2009-08-21 17:20:52,888 - checks"..., 74) = 74
gettimeofday({1250893252, 888897}, NULL) = 0
write(3, "2009-08-21 17:20:52,888 - checks"..., 67) = 67
gettimeofday({1250893252, 889184}, NULL) = 0
write(3, "2009-08-21 17:20:52,889 - checks"..., 81) = 81
close(4)                                = 0
gettimeofday({1250893252, 889591}, NULL) = 0
write(3, "2009-08-21 17:20:52,889 - checks"..., 63) = 63
pipe([4, 5])                            = 0
pipe([6, 7])                            = 0
fcntl64(7, F_GETFD)                     = 0
fcntl64(7, F_SETFD, FD_CLOEXEC)         = 0
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0xb7f12708) = -1 ENOMEM (Cannot allocate memory)
write(2, "Traceback (most recent call last"..., 35) = 35
open("/usr/bin/sd-agent/agent.py", O_RDONLY|O_LARGEFILE) = -1 ENOMEM (Cannot allocate memory)
open("/usr/bin/sd-agent/agent.py", O_RDONLY|O_LARGEFILE) = -1 ENOMEM (Cannot allocate memory)
open("/usr/lib/python24.zip/agent.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.4/agent.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.4/plat-linux2/agent.py", O_RDONLY|O_LARGEFILE) = -1 ENOMEM (Cannot allocate memory)
open("/usr/lib/python2.4/lib-tk/agent.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.4/lib-dynload/agent.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.4/site-packages/agent.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
write(2, "  File \"/usr/bin/sd-agent/agent."..., 52) = 52
open("/home/admin/sd-agent/daemon.py", O_RDONLY|O_LARGEFILE) = -1 ENOMEM (Cannot allocate memory)
open("/usr/bin/sd-agent/daemon.py", O_RDONLY|O_LARGEFILE) = -1 ENOMEM (Cannot allocate memory)
open("/usr/lib/python24.zip/daemon.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.4/daemon.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.4/plat-linux2/daemon.py", O_RDONLY|O_LARGEFILE) = -1 ENOMEM (Cannot allocate memory)
open("/usr/lib/python2.4/lib-tk/daemon.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.4/lib-dynload/daemon.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.4/site-packages/daemon.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
write(2, "  File \"/home/admin/sd-agent/dae"..., 60) = 60
open("/usr/bin/sd-agent/agent.py", O_RDONLY|O_LARGEFILE) = -1 ENOMEM (Cannot allocate memory)
open("/usr/bin/sd-agent/agent.py", O_RDONLY|O_LARGEFILE) = -1 ENOMEM (Cannot allocate memory)
open("/usr/lib/python24.zip/agent.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.4/agent.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.4/plat-linux2/agent.py", O_RDONLY|O_LARGEFILE) = -1 ENOMEM (Cannot allocate memory)
open("/usr/lib/python2.4/lib-tk/agent.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.4/lib-dynload/agent.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.4/site-packages/agent.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
write(2, "  File \"/usr/bin/sd-agent/agent."..., 54) = 54
open("/usr/lib/python2.4/sched.py", O_RDONLY|O_LARGEFILE) = 8
write(2, "  File \"/usr/lib/python2.4/sched"..., 55) = 55
fstat64(8, {st_mode=S_IFREG|0644, st_size=4054, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7d28000
read(8, "\"\"\"A generally useful event sche"..., 4096) = 4054
write(2, "    ", 4)                     = 4
write(2, "void = action(*argument)\n", 25) = 25
close(8)                                = 0
munmap(0xb7d28000, 4096)                = 0
open("/usr/bin/sd-agent/checks.py", O_RDONLY|O_LARGEFILE) = -1 ENOMEM (Cannot allocate memory)
open("/usr/bin/sd-agent/checks.py", O_RDONLY|O_LARGEFILE) = -1 ENOMEM (Cannot allocate memory)
open("/usr/lib/python24.zip/checks.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.4/checks.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.4/plat-linux2/checks.py", O_RDONLY|O_LARGEFILE) = -1 ENOMEM (Cannot allocate memory)
open("/usr/lib/python2.4/lib-tk/checks.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.4/lib-dynload/checks.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.4/site-packages/checks.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
write(2, "  File \"/usr/bin/sd-agent/checks"..., 60) = 60
open("/usr/bin/sd-agent/checks.py", O_RDONLY|O_LARGEFILE) = -1 ENOMEM (Cannot allocate memory)
open("/usr/bin/sd-agent/checks.py", O_RDONLY|O_LARGEFILE) = -1 ENOMEM (Cannot allocate memory)
open("/usr/lib/python24.zip/checks.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.4/checks.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.4/plat-linux2/checks.py", O_RDONLY|O_LARGEFILE) = -1 ENOMEM (Cannot allocate memory)
open("/usr/lib/python2.4/lib-tk/checks.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.4/lib-dynload/checks.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.4/site-packages/checks.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
write(2, "  File \"/usr/bin/sd-agent/checks"..., 64) = 64
open("/usr/lib/python2.4/subprocess.py", O_RDONLY|O_LARGEFILE) = 8
write(2, "  File \"/usr/lib/python2.4/subpr"..., 65) = 65
fstat64(8, {st_mode=S_IFREG|0644, st_size=39931, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7d28000
read(8, "# subprocess - Subprocesses with"..., 4096) = 4096
read(8, "lso, the newlines attribute of t"..., 4096) = 4096
read(8, "code < 0:\n        print >>sys.st"..., 4096) = 4096
read(8, "alse does not exist on 2.2.0\ntry"..., 4096) = 4096
read(8, " p2cread\n        # c2pread    <-"..., 4096) = 4096
write(2, "    ", 4)                     = 4
write(2, "errread, errwrite)\n", 19)    = 19
close(8)                                = 0
munmap(0xb7d28000, 4096)                = 0
open("/usr/lib/python2.4/subprocess.py", O_RDONLY|O_LARGEFILE) = 8
write(2, "  File \"/usr/lib/python2.4/subpr"..., 71) = 71
fstat64(8, {st_mode=S_IFREG|0644, st_size=39931, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7d28000
read(8, "# subprocess - Subprocesses with"..., 4096) = 4096
read(8, "lso, the newlines attribute of t"..., 4096) = 4096
read(8, "code < 0:\n        print >>sys.st"..., 4096) = 4096
read(8, "alse does not exist on 2.2.0\ntry"..., 4096) = 4096
read(8, " p2cread\n        # c2pread    <-"..., 4096) = 4096
read(8, "table(self, handle):\n           "..., 4096) = 4096
read(8, "rrno using _sys_errlist (or siml"..., 4096) = 4096
read(8, " p2cwrite = None, None\n         "..., 4096) = 4096
write(2, "    ", 4)                     = 4
write(2, "self.pid = os.fork()\n", 21)  = 21
close(8)                                = 0
munmap(0xb7d28000, 4096)                = 0
write(2, "OSError", 7)                  = 7
write(2, ": ", 2)                       = 2
write(2, "[Errno 12] Cannot allocate memor"..., 33) = 33
write(2, "\n", 1)                       = 1
unlink("/var/run/sd-agent.pid")         = 0
close(3)                                = 0
munmap(0xb7e0d000, 4096)                = 0
rt_sigaction(SIGINT, {SIG_DFL, [], SA_RESTORER, 0x589978}, {0xb89a60, [], SA_RESTORER, 0x589978}, 8) = 0
brk(0xa022000)                          = 0xa022000
exit_group(1)                           = ?

CEVAP
11 Kasım 2012, Pazar


Genel bir kural (vanilya çekirdekleri gibi), fork/clone ya nedeniyle 12* occur specifically *ile hataları gibiTanrı için dürüst bir yetersiz bellek durumu(, , , *, **mpol_dupalloc_piddup_task_struct13 17* vb. croak), veya security_vm_enough_memory_mm başarısız oldu çünküenforcing overcommit policy.

Başlangıç tarafından kontrol vmsize işlemi başarısız çatal, çatal girişimi, ve sonra karşılaştırmak için boş bellek miktarıdır (fiziksel ve takas) olarak ilgisi var onu overcommit politikası (fiş numaraları.)

Özellikle senin durumunda, Virtuozzo additional checks overcommit enforcement olduğunu unutmayın. Ayrıca, ne kadar gerçekten, emin değilimiçindekonteyner, swap and overcommit configuration zorlama. sonucunu etkilemek amacıyla ()

Aslında ileriye taşımak için artık, derimiki seçenek kaldı:

  • daha büyük bir örneği geçin ya
  • biraz kodlama çaba harcadıdaha etkili bir senaryo bellek denetlemeayak izi

NOTkodlama çaba eğer amock kaçıyorsun. ama başka biri aynı sunucu üzerinde başka bir örneği birlikte yerleştirilmesi değil ortaya çıkarsa hiçbir faydası olabilir

Bellek-bilge, bunu zaten biliyoruzsubprocess.Popen 20*/clone *kullanır* *60, her zaman sensin sen söyle yanibir kez daha fazla bellek gibi Python gibi isteyen zaten yiyorduyani o zaman 22 ** cılız bir 10 KB free ps gibi yürütülebilir için ek) yüzlerce,. Olumsuz overcommit bir politika durumunda, yakında ENOMEM göreceksin.

Ana sayfa tablosu vb olmayan fork alternatif. kopyalama sorunu vfork posix_spawn. Ama eğer hissetmiyorum gibi yeniden parçalar subprocess.Popen açısından vfork/posix_spawn, kullanmayı düşünün suprocess.Popen sadece bir kez, başında script (Python bellek ayak izi en az)sonra bir döngü içinde başka ne olursa olsun 33*/ps/sleep *ve çalışan bir kabuk spawnparalel komut; anket komut çıktısı veya oku eşzamanlı olarak, belki ayrı bir iş parçacığı varsa başka şeyler ile ilgilenmen için zaman uyumsuz olarak ... veri çatırdayan Python ama bırakın bölmek için alt süreci.

ANCAKözellikle sizin durumunuzda ps free yürütmesini tamamen atlayabilirsiniz;doğrudan bilgi procfs Python için hazır olduğunuKendin veya existing libraries and/or packages. üzerinden erişim için hangisini seçerseniz seçin ps free çalışmakta sadece araçlar olsaydı, o zaman yapabilirsinizuzak subprocess.Popen ile tamamen.

Son olarak, ne yaparsan yap kadarıyla subprocess.Popen hala duvara eninde sonunda vuracaktır script sızıntıları hafıza ise son derece endişeli. Bu bir göz tutmak ve check for memory leaks.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • androidandme

    androidandme

    10 Mart 2009
  • Rachel Talbott

    Rachel Talbo

    26 Ocak 2011
  • rtisticsdev

    rtisticsdev

    31 Mayıs 2012