मैं मेमोरी को लीक करने वाली प्रक्रियाओं को स्वचालित रूप से कैसे मार सकता हूं?


8

मुझे मेमोरी को लीक करने वाली प्रक्रियाओं के साथ समस्या है। वे मेरी हार्ड ड्राइव को स्वैप फाइलों में भर देते हैं /private/var/vm

मैं ओएस द्वारा दृष्टि से मारे जाने वाली प्रक्रियाओं को लीक करना चाहूंगा । मुझे 20 मिनट के बाद दिखाई देने वाले संवाद में दिलचस्पी नहीं है, मारने के लिए एप्लिकेशन का सुझाव देता है, और जो लीक हो रहा है वह भी नहीं दिखाता है।

मैंने rssऔर dataसीमाएँ निर्धारित करने की कोशिश की है, /etc/launchd.confलेकिन इसका असर नहीं हुआ।

यह मेरा है /etc/launchd.conf:

limit data 8589934592 8589934592
limit rss 8589934592 8589934592

यहाँ launchctl limitउत्पादन है:

% 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

यह मेरा है .zshrc:

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

और ulimit -aआउटपुट (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

फिर भी यहाँ है जो topमुझे इस प्रक्रिया के बारे में बताता है:

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

ऐसा लगता है कि प्रलेखित स्मृति सीमा विधियों में से कोई भी वास्तव में काम नहीं करता है। क्या कोई अतिरिक्त तंत्र है जो मुझे याद हो सकता है?


230 GiB ?! मुझे वास्तव में उम्मीद है कि आप एक दशमलव बिंदु से चूक गए हैं।
duci9y

@ duci9y Nope :-(
sam hocevar

3
उस मामले में, मैं वास्तव में आशा करता हूं कि कोई आपकी समस्या को ठीक करेगा। आप मेरी प्रार्थना में होंगे।
duci9y

मैंने अंततः इस बात का उल्लेख हटा दिया कि लीक करने की प्रक्रिया क्या थी क्योंकि IRC पर लोगों ने मुझे व्याख्यान देना शुरू कर दिया था कि मुझे llvm-g ++ के बजाय क्लैंग ++ का उपयोग क्यों करना चाहिए और इससे मुझे केवल नुकीली वस्तुओं से मारना है।
सैम होसेवर

अग्नि पर नुकीली वस्तु।
duci9y

जवाबों:


3

मैं एक सरल स्क्रिप्ट बनाऊंगा, जो किसी निवासी स्मृति आकार (या शायद कुल vm आकार, इसलिए किसी भी पृष्ठांकित पृष्ठ सहित) के साथ किसी भी प्रक्रिया को फ़िल्टर करेगी, जो कि मैं एक सीमा से बड़ा है जिसे मैं परिभाषित करता हूं (प्रक्रिया की मात्रा के आधार पर, कुल मेमोरी उपलब्ध है और शायद सीपीयू उपलब्धता भी)। topया तो psप्रक्रिया के साथ या मेमोरी साइज़ की सूची खोदने के लिए या तो थोड़ी सी bash स्क्रिप्ट का उपयोग किया जा सकता है ।

इस फ़िल्टर की गई सूची से, मैं PID प्रक्रिया के अनुसार leaksकमांड ( मैन 1 लीक्स देखें ) का उपयोग करूंगा । यदि कमांड द्वारा बताई गई लीक की गई मेमोरी की कुल मात्रा अभी तक एक और सीमा से अधिक है, तो मैं इसे मारूंगा और इसका जवाब दूंगा।

नोट : आपको यह ध्यान रखना चाहिए कि आप क्या करते हैं, यह जाने बिना किसी भी ओएस / सिस्टम प्रक्रियाओं को नहीं मारना चाहिए। इस स्थिति से बचने के लिए, आपको संभवतः "सफेद सूची" दृष्टिकोण का उपयोग करके सूची को फ़िल्टर करना चाहिए।


1

अधिकांश प्लेटफार्मों पर ulimit अपेक्षा के अनुरूप काम नहीं करता है।

यदि यह एक डेस्कटॉप ऐप नहीं है, तो अपराधी को उचित प्रक्रिया पर्यवेक्षक जैसे https://github.com/arya/bluepill से चलाएं

यदि यह एक डेस्कटॉप ऐप है, तो ऐप डेवलपर्स से संपर्क करें। प्रतिक्रिया आवश्यक और महत्वपूर्ण है।

मैक के लिए OOM किलर GUI पर UX भयानक है। यह प्रत्येक प्रक्रियाओं के राम प्रयोग के लिए आनुपातिक बार ग्राफ के साथ सबसे बड़ा क्रमबद्ध होना चाहिए। इसके अलावा, यह स्वचालित रूप से हल होने पर सभी रोका प्रक्रियाओं को SIGCONT करना चाहिए।


1
मैं कई अनुप्रयोगों के साथ समस्या थी, लेकिन ऊंट की पीठ को तोड़ने वाले पुआल Apple था llvm-g++। राडार में समस्या बताई गई। मैं जिज्ञासु: क्या अन्य मंच एक गैर काम कर रहा है ulimit? मैं लगभग 20 वर्षों से यूनिक्स के कई स्वादों का उपयोग कर रहा हूं और मुझे यह देखकर याद नहीं है।
सैम होसेवर

-2

यदि आपको रिबूट के पार इसकी आवश्यकता है तो आपको केवल launchctl limitकमांड का उपयोग करना चाहिए ।

यदि आपको एप्लिकेशन की मेमोरी को सीमित करने की आवश्यकता है तो आपको स्टैक सेगमेंट को भी सीमित करना चाहिए।


जैसा कि आप आउटपुट में देख सकते हैं, स्टैक आकार और डेटा आकार दोनों सीमित हैं। मैंने सवाल पूछा क्योंकि launchctl limitकाम नहीं करता।
सैम होसेवर

ulimitआप का उपयोग वास्तव में काम नहीं करता है जैसे कि आप की जरूरत है। launchctl limitकर देता है।
ईर निम

और एक और क्षण सीमा में रोशन होना: जब कार्यक्रम सीमा तक पहुंचता है तो यह चेतावनी प्राप्त करता है। लेकिन नरम सीमा कार्रवाई के साथ सफलता में निष्पादित किया जाएगा, कड़ी मेहनत के साथ - यह विफल हो जाएगा। इसलिए यदि प्रोग्राम हार्ड लिमिट से परे मेमोरी का अनुरोध करता है, तो कोई भी मेमोरी आवंटित नहीं की जाएगी।
इर निम

launchctl limitकाम नहीं करता है, या मैं सवाल नहीं पूछ रहा हूँ।
सैम होसेवर

आप आवेदन का आकार कैसे मापेंगे?
इर निम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.