Bagaimana cara saya membunuh proses yang bocor memori secara otomatis?

8

Saya memiliki masalah dengan proses yang membocorkan memori. Mereka menyebabkan hard drive saya diisi dengan file swap /private/var/vm.

Saya ingin proses bocor untuk dibunuh saat dilihat oleh OS . Saya tidak tertarik dengan dialog yang muncul setelah 20 menit, menyarankan aplikasi untuk dimatikan, dan bahkan tidak menunjukkan yang bocor.

Saya telah mencoba mengatur rssdan datamembatasi /etc/launchd.conftetapi tampaknya tidak berpengaruh.

Ini milik saya /etc/launchd.conf:

limit data 8589934592 8589934592
limit rss 8589934592 8589934592

Berikut launchctl limithasilnya:

% 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

Ini milik saya .zshrc:

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

Dan ulimit -ahasilnya (dalam ZSH):

% 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

Namun inilah yang topmemberitahu saya tentang prosesnya:

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

Sepertinya tidak ada satu pun metode batasan memori yang didokumentasikan yang benar-benar berfungsi. Apakah ada mekanisme tambahan yang mungkin saya lewatkan?

sam hocevar
sumber
230 GiB ?! Saya sangat berharap Anda melewatkan titik desimal.
duci9y
@ duci9y Tidak :-(
sam hocevar
3
Dalam hal itu, saya sangat berharap seseorang memperbaiki masalah Anda. Anda akan berdoa saya.
duci9y
Saya akhirnya menghapus menyebutkan tentang apa proses kebocoran itu karena orang-orang di IRC mulai menguliahi saya mengapa saya harus menggunakan clang ++ daripada llvm-g ++ dan itu hanya membuat saya ingin memukul mereka dengan benda-benda runcing.
sam hocevar
Benda runcing terbakar.
duci9y

Jawaban:

3

Saya akan membuat skrip sederhana yang akan memfilter proses setiap proses dengan ukuran memori resident (atau mungkin total ukuran vm, jadi termasuk halaman paged out) lebih besar dari ambang yang saya tentukan (tergantung pada jumlah proses, total memori yang tersedia dan mungkin juga ketersediaan CPU). Seseorang dapat menggunakan sedikit skrip bash dengan salah satu topatau psuntuk menggali daftar proses dan ukuran memori.

Dari daftar yang difilter ini, saya akan menggunakan leaksperintah (lihat man 1 kebocoran ) per proses PID. Jika jumlah total memori yang bocor yang dilaporkan oleh perintah lebih tinggi daripada ambang lainnya, saya kemudian akan membunuh dan respawn.

CATATAN : Anda harus berhati-hati untuk tidak membunuh proses OS / Sistem tanpa mengetahui apa yang Anda lakukan. Untuk menghindari situasi ini, Anda mungkin harus menyaring daftar menggunakan pendekatan "daftar putih".

Huygens
sumber
1

ulimit pada sebagian besar platform tidak berfungsi seperti yang diharapkan.

Jika ini bukan aplikasi desktop, jalankan pelaku dengan pengawas proses yang tepat seperti https://github.com/arya/bluepill

Jika ini adalah aplikasi desktop, hubungi pengembang aplikasi. Umpan balik diperlukan dan penting.

UX pada GUI pembunuh OOM untuk Mac mengerikan. Itu harus diurutkan terbesar menurun dengan grafik batang proporsional untuk penggunaan ram masing-masing proses. Selain itu, ini harus secara otomatis SIGCONT semua proses yang dijeda ketika diselesaikan.

dhchdhd
sumber
1
Saya punya masalah dengan beberapa aplikasi, tetapi sedotan yang mematahkan punggung unta adalah milik Apple llvm-g++. Masalahnya dilaporkan di Radar. Saya ingin tahu: platform apa yang tidak berfungsi ulimit? Saya telah menggunakan beberapa rasa Unix selama hampir 20 tahun dan saya tidak ingat melihatnya.
sam hocevar
-2

Jika Anda membutuhkan ini di reboot, Anda harus menggunakan hanya launchctl limitperintah.

Jika Anda perlu membatasi memori aplikasi, Anda juga harus membatasi segmen tumpukan.

Eir Nym
sumber
Seperti yang Anda lihat di output, ukuran stack dan ukuran data terbatas. Saya mengajukan pertanyaan karena launchctl limittidak tidak bekerja.
sam hocevar
ulimitAnda menggunakan benar - benar tidak berfungsi seperti yang Anda butuhkan. launchctl limittidak.
Eir Nym
dan momen lain untuk dinyalakan dalam batas: ketika program mencapai batas ia menerima peringatan. tetapi dengan soft limit action akan dieksekusi dengan sukses, dengan hard - itu akan gagal. Jadi jika program meminta memori melampaui batas, tidak ada memori yang akan dialokasikan.
Eir Nym
launchctl limittidak tidak bekerja, atau aku tidak akan mengajukan pertanyaan.
sam hocevar
bagaimana Anda mengukur ukuran aplikasi?
Eir Nym