Bellek sızdıran işlemleri otomatik olarak nasıl öldürebilirim?


8

Hafıza sızdıran süreçlerle ilgili problemlerim var. Sabit diskimin takas dosyalarıyla doldurulmasına neden oluyorlar /private/var/vm.

Sızıntı yapan süreçlerin işletim sistemi tarafından öldürülmesini istiyorum . 20 dakika sonra beliren bir diyalogla ilgilenmiyorum, uygulamaların öldürülmesini öneriyor ve hatta sızan birini bile göstermiyor.

rssVe datasınırlarını ayarlamaya çalıştım /etc/launchd.confama bir etkisi yoktu.

Bu benim /etc/launchd.conf:

limit data 8589934592 8589934592
limit rss 8589934592 8589934592

İşte launchctl limitçıktı:

% launchctl limit
    cpu         unlimited      unlimited
    filesize    unlimited      unlimited
    data        8589934592     8589934592
    stack       8388608        67104768
    core        0              unlimited
    rss         8589934592     8589934592
    memlock     unlimited      unlimited
    maxproc     709            1064
    maxfiles    256            unlimited

Bu benim .zshrc:

ulimit -t 600
ulimit -d 512000
ulimit -v 1024000

Ve ulimit -açıktı (ZSH olarak):

% ulimit -a
    -t: cpu time (seconds)         600
    -f: file size (blocks)         unlimited
    -d: data seg size (kbytes)     512000
    -s: stack size (kbytes)        8192
    -c: core file size (blocks)    0
    -v: address space (kb)         1000
    -l: locked-in-memory size (kb) unlimited
    -u: processes                  709
    -n: file descriptors           256

Yine de topbana bu süreç hakkında ne söylüyor:

PID  COMMAND      %CPU  TIME     #TH  #WQ  #POR #MRE RPRVT  RSHRD  RSIZE  VPRVT  VSIZE  PGRP PPID
886  process      30.8  01:16.40 1/1  0    17   332  2259M+ 184K   2072M- 19G+   38G    882  885

Belgelenmiş bellek sınırlama yöntemlerinden hiçbirinin gerçekten işe yaramadığı görülüyor. Kaçırdığım ek bir mekanizma var mı?


230 GiB ?! Umarım ondalık bir noktayı kaçırmışsınızdır.
duci9y

@ duci9y Hayır :-(
sam hocevar

3
Bu durumda, umarım birisi probleminizi düzeltir. Dualarımda olacaksın.
duci9y

Sonunda, IRC'deki insanlar bana neden llvm-g ++ yerine clang ++ kullanmam gerektiği konusunda ders vermeye başladığından ve sadece sivri nesnelerle onları vurmak istememize neden olduğu için sızıntı sürecinin ne olduğundan bahsetmiştim.
sam hocevar

Sivri nesneler yanıyor.
duci9y

Yanıtlar:


3

Ben yerleşik bir bellek boyutu (veya belki de toplam vm boyutu, böylece herhangi bir disk belleği dışarı sayfaları dahil) tanımladığım bir eşik daha büyük (işlem miktarına, kullanılabilir toplam bellek ve belki de CPU kullanılabilirliği). İşlem veya bellek boyutu listesini kazmak için topveya ile biraz bash betiği kullanılabilir ps.

Bu filtrelenmiş listeden, işlem PID başına leakskomutu (bkz. Adam 1 sızıntıları ) kullanırdım. Komut tarafından bildirilen toplam sızan bellek miktarı başka bir eşikten daha yüksekse, onu öldürür ve yeniden doğardım.

NOT : Ne yaptığınızı bilmeden herhangi bir OS / Sistem işlemini öldürmemeye dikkat etmelisiniz. Bu durumu önlemek için, listeyi "beyaz liste" yaklaşımını kullanarak filtrelemeniz gerekebilir.


1

Çoğu platformda ulimit beklendiği gibi çalışmaz.

Bu bir masaüstü uygulaması değilse, suçluyu https://github.com/arya/bluepill gibi uygun bir süreç süpervizörü ile çalıştırın.

Bu bir masaüstü uygulamasıysa uygulama geliştiricilerine başvurun. Geri bildirim gerekli ve önemlidir.

Mac için OOM katil GUI'sindeki UX korkunç. Her bir işlemin koç kullanımı için orantılı bir çubuk grafikle en büyük azalan sıralama olmalıdır. Ayrıca, çözüldüğünde tüm duraklatılmış işlemleri otomatik olarak SIGCONT yapmalıdır.


1
Birkaç uygulama ile sorun yaşadım, ama devenin arkasını kıran saman Apple'ın oldu llvm-g++. Sorun Radar'da bildirildi. Merak ediyorum: başka hangi platformda çalışmayan var ulimit? Neredeyse 20 yıldır Unix'in çeşitli tatlarını kullanıyorum ve bir tane gördüğümü hatırlamıyorum.
sam hocevar

-2

Yeniden başlatmalarda buna ihtiyacınız varsa yalnızca launchctl limitkomutu kullanmalısınız .

Uygulamanın belleğini sınırlamanız gerekiyorsa, yığın segmentini de sınırlamanız gerekir.


Çıktıda görebileceğiniz gibi, hem yığın boyutu hem de veri boyutu sınırlıdır. Çünkü soru soruldu launchctl limitmu değil çalışır.
sam hocevar

ulimitkullandığınız gerçekten ihtiyacınız olduğu gibi çalışmıyor . launchctl limityapar.
Eir Nym

ve limitlerde aydınlatılması gereken bir an daha: program limitlere ulaştığında uyarı alır. ancak yumuşak limit eylemi başarılı bir şekilde yürütülür, zorla - başarısız olur. Dolayısıyla, program sabit sınırın ötesinde bellek isterse, bellek ayrılmaz.
Eir Nym

launchctl limityok değil çalışmak, ya da ben soruyu soran olmaz.
sam hocevar

uygulama boyutunu nasıl ölçersiniz?
Eir Nym
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.