एक लाइनक्स / यूनिक्स प्रक्रिया की पीक मेमोरी उपयोग


376

क्या कोई उपकरण है जो कमांड-लाइन चलाएगा और पीक रैम के उपयोग की रिपोर्ट करेगा?

मैं / usr / bin / time के अनुरूप कुछ कल्पना कर रहा हूं

जवाबों:


28

यहां एक-लाइनर है जिसे किसी भी बाहरी स्क्रिप्ट या उपयोगिताओं की आवश्यकता नहीं है और आपको Valgrind या समय जैसे किसी अन्य प्रोग्राम के माध्यम से प्रक्रिया शुरू करने की आवश्यकता नहीं है, इसलिए आप इसे पहले से चल रही किसी भी प्रक्रिया के लिए उपयोग कर सकते हैं:

grep VmPeak /proc/$PID/status

( $PIDउस प्रक्रिया के पीआईडी ​​से बदलें जिसमें आप रुचि रखते हैं)


4
अगर मुझे पीआईडी ​​नहीं पता है तो क्या होगा? उदाहरण के लिए, जब कार्यक्रम समय की एक छोटी राशि (<1s)
चलाता है

4
"VmHWM: पीक निवासी सेट का आकार" रैम उपयोग को मापने के लिए अधिक उपयोगी हो सकता है (VmPeak के बजाय जिसमें बहुत सी अन्य चीजें भी शामिल हैं)।
JFS

@jfs यह वास्तव में निर्भर करता है कि आप क्या जानना चाहते हैं। IIRC VmPeak वर्चुअल मेमोरी सहित अधिकतम कुल मेमोरी उपयोग है, जबकि VmHWM पीक रैम उपयोग है। इसलिए यदि आप जानना चाहते हैं कि आपके प्रोग्राम ने कुल कितनी मेमोरी मांगी है, तो VmPeak का उपयोग करें; यदि आप जानना चाहते हैं कि किसी निश्चित समय में आपके वास्तविक रैम का कितना उपयोग किया गया है, तो VHHWM का उपयोग करें।
एरोबर्टेक

1
@diralik यदि आप स्वयं द्वारा लिखे गए प्रोग्राम की जाँच कर रहे हैं, तो आप "/ proc / self / status" फ़ाइल में देखने के लिए कोड की एक पंक्ति एम्बेड कर सकते हैं।
6

404

[ संपादित करें : Ubuntu 14.04 पर काम करता है: /usr/bin/time -v command पूर्ण पथ का उपयोग करना सुनिश्चित करें।]

ऐसा लगता /usr/bin/timeहै कि आपको यह जानकारी दी गई है, यदि आप पास -v(यह Ubuntu 8.10 पर है)। देखें, उदाहरण के लिए, Maximum resident set sizeनीचे:

$ / usr / बिन / समय -v ls /
....
        कमांड की समय सीमा: "ls /"
        उपयोगकर्ता समय (सेकंड): 0.00
        सिस्टम समय (सेकंड): 0.01
        सीपीयू का प्रतिशत इस नौकरी को मिला: 250%
        बीता हुआ (दीवार घड़ी) समय (h: mm: ss या m: ss): 0: 00.00
        औसत साझा पाठ आकार (किबेट्स): 0
        औसत अनसेक्ड डेटा साइज (kbytes): 0
        औसत स्टैक आकार (kbytes): 0
        औसत कुल आकार (kbytes): 0
        अधिकतम निवासी सेट आकार (kbytes): 0
        औसत निवासी सेट आकार (kbytes): 0
        प्रमुख (आवश्यक I / O) पृष्ठ दोष: 0
        माइनर (एक फ्रेम को पुनः प्राप्त करना) पृष्ठ दोष: 315
        स्वैच्छिक संदर्भ स्विच: 2
        अनैच्छिक संदर्भ स्विच: 0
        स्वैप: 0
        फाइल सिस्टम इनपुट: 0
        फ़ाइल सिस्टम आउटपुट: 0
        सॉकेट संदेश भेजे गए: 0
        सॉकेट संदेश प्राप्त हुए: 0
        संकेत दिए गए: 0
        पृष्ठ का आकार (बाइट्स): 4096
        बाहर निकलने की स्थिति: 0

4
संभवतः यह हमेशा 0 लौटाता है क्योंकि ls बहुत कुछ नहीं कर रहा है। एक अधिक CPU गहन कमांड का प्रयास करें।
जॉनसन

17
मैन पेज से: समय के अनुसार दिखाई जाने वाली अधिकांश जानकारी वेट 3 (2) सिस्टम कॉल से ली गई है। संख्याएँ केवल उतनी ही अच्छी हैं जितनी प्रतीक्षा 3 (2) द्वारा लौटाई गई हैं। उन सिस्टमों पर जिनके पास प्रतीक्षा 3 (2) कॉल नहीं है जो स्थिति की जानकारी देता है, इसके बजाय समय (2) सिस्टम कॉल का उपयोग किया जाता है। हालांकि, यह प्रतीक्षा 3 (2) की तुलना में बहुत कम जानकारी प्रदान करता है, इसलिए उन प्रणालियों पर समय के अधिकांश संसाधनों को शून्य के रूप में रिपोर्ट करता है।
लोथर

79
"बैश: -v: कमांड नहीं मिला" का अर्थ है बैश समय का उपयोग करने के लिए इसे अपनाता है। /bin/time -vइसे हल करता है।
gcb

3
यह सुनिश्चित करने के लिए एक त्वरित जांच करने के लिए लायक होगा कि आउटपुट समझ में आता है। ग्नू समय में एक बग है जहां यह 4x वास्तविक स्मृति उपयोग की रिपोर्ट करेगा: stackoverflow.com/questions/10035232/…
इयान

24
@skalee time -lMacOS पर प्रयास करें , समान आउटपुट देता है।
वोल्कर स्टोलज

96

(यह एक पहले से ही उत्तर, पुराना सवाल है .. लेकिन सिर्फ रिकॉर्ड के लिए :)

मैं यांग की पटकथा से प्रेरित था, और इस छोटे उपकरण के साथ आया था, जिसका नाम मेमसग था । मैंने बस बहुत कम जीवित प्रक्रियाओं को संभालने के लिए नमूना दर को बढ़ाकर 0.1 कर दिया है। किसी एक प्रक्रिया की निगरानी करने के बजाय, मैंने इसे प्रक्रिया समूह के rss योग को माप दिया। (हाँ, मैं बहुत सारे अलग-अलग प्रोग्राम लिखता हूँ जो एक साथ काम करते हैं) यह वर्तमान में मैक ओएस एक्स और लिनक्स पर काम करता है। उपयोग के समान होना था time:

memusg ls -alR /> / dev / null

यह केवल क्षण के लिए चोटी दिखाता है, लेकिन मैं अन्य (किसी न किसी) आंकड़ों को रिकॉर्ड करने के लिए मामूली एक्सटेंशन में दिलचस्पी रखता हूं।

किसी भी गंभीर रूपरेखा को शुरू करने से पहले सिर्फ एक बार देखने के लिए इस तरह के सरल उपकरण का उपयोग करना अच्छा है।


1
सभी जो अभी भी PS का उपयोग करते हैं और केवल मनाया शीर्ष मेमोरी का निर्धारण करने के लिए अच्छे हैं। वास्तविक शीर्ष मेमोरी नहीं है। आप हमेशा एक अंतराल और दूसरे के बीच कुछ याद कर सकते हैं।
gcb

6
मेमस्ग स्क्रिप्ट के आउटपुट के लिए इकाइयाँ क्या हैं? बाइट्स? किलोबाइट?
डैनियल स्टैंडेज सेप

1
@ डैनियलस्टैंडेज: शायद किलोबाइट्स में। यह केवल उन मूल्यों को देखता है ps -o rss=जहां rss मेरे बीएसडी मैन पेज से प्रक्रिया की वास्तविक मेमोरी (निवासी सेट) आकार (1024 बाइट इकाइयों में) है।
netj

3
@gcb तो क्या, जब आप नमूने को मापते हैं तो आपको यही मिलता है।
वोल्कर स्टोलज़

2
जवाब में दिए गए मेमसग का लिंक टूटा हुआ लग रहा है। वैसे भी, / usr / बिन / समय यह बहुत अच्छी तरह से करता है।
टॉम कॉर्निज

65

एक-लाइनर:

valgrind --tool=massif --pages-as-heap=yes --massif-out-file=massif.out ./test.sh; grep mem_heap_B massif.out | sed -e 's/mem_heap_B=\(.*\)/\1/' | sort -g | tail -n 1

एक प्रक्रिया में सभी मेमोरी को मापने के लिए --पेज-ए-हीप का उपयोग नोट करें। अधिक जानकारी यहाँ: http://valgrind.org/docs/manual/ms-manual.html


14
time, मैं तुम्हे छोड़ रहा हूँ।
jbeard4

1
आसान स्क्रिप्ट, लेकिन मुझे मेरे स्लैकवेयर सिस्टम पर सॉर्ट-जी चाहिए (मुझे लगता है कि आप उच्चतम मूल्य की तलाश कर रहे हैं)।
निक कोलमैन

3
के लिए +1 valgrind --massif। आप उस ms_printटूल का भी उपयोग कर सकते हैं जो इसके लिए उपयोगी आउटपुट (समय के साथ उपयोग के एएससीआई चार्ट सहित) के लिए आता है
एली बेन्द्स्की

7
मासिफ की तुलना में बहुत अधिक ओवरहेड है time, जैसे कमांड पर कम से कम 10 गुना अधिक समय लेना ls
टिमोथी गु

8
यह वास्तव में बहुत बड़े पैमाने पर है। इस जवाब में धीमेपन का उल्लेख होना चाहिए। कमांड जिसे मैं सामान्य रूप से मापना चाहता हूं, उसे पूरा करने में 35 सेकंड लगते हैं। मैंने इसे आधे घंटे से अधिक समय पहले मापने के लिए यह वेलग्राइंड कमांड चलाया है, और यह अभी भी पूरा नहीं हुआ है ...
Unagi

35

लिनक्स पर:

/usr/bin/time -v <program> <args>" अधिकतम निवासी सेट आकार " का उपयोग करें और देखें ।

(बैश साथ भ्रमित होने की नहीं timeनिर्मित आदेश! तो का उपयोग पूर्ण पथ , /usr/bin/time)

उदाहरण के लिए:

> /usr/bin/time -v ./myapp
        User time (seconds): 0.00
        . . .
        Maximum resident set size (kbytes): 2792
        . . .

BSD, MacOS पर:

उपयोग करें /usr/bin/time -l <program> <args>, " अधिकतम निवासी सेट आकार " की तलाश में:

>/usr/bin/time -l ./myapp
        0.01 real         0.00 user         0.00 sys
      1440  maximum resident set size
      . . .

sudo apt-get install time
रॉल्फ

2
क्या यह मैदान पहले से ही दो साल पहले एक उत्तर द्वारा कवर नहीं किया गया है ?
चार्ल्स डफी

34

शायद (ग्नू) समय (1) पहले से ही आप क्या चाहते हैं। उदाहरण के लिए:

$ /usr/bin/time -f "%P %M" command
43% 821248

लेकिन अन्य प्रोफाइलिंग टूल आपको जो खोज रहे हैं उसके आधार पर अधिक सटीक परिणाम दे सकते हैं।


मैं हमेशा इसके साथ शून्य प्राप्त करने लगता हूं, यहां तक ​​कि बड़े आदेशों के लिए भी
jes5199

मुझे चर परिणाम मिलते हैं, जैसे 400% 0, और 0% 0 एक ही कार्यक्रम पर .. हो सकता है कि सटीक होने के लिए बड़ी अवधि के लिए चलाया जाए?
लिरन ओरवी

मुझे नहीं पता कि क्या सुझाव देना है। उपरोक्त कोड वही है जो मुझे एक लेटेक्स कमांड चलाने के लिए मिला था जो इतिहास में हुआ था। जैसा कि मैं कहता हूं, अन्य उपकरणों के साथ अधिक सटीक परिणाम प्राप्त किए जा सकते हैं।
जॉनसन

2
यह कम से कम CentOS (और इस प्रकार, मैं शर्त लगाता हूं, आरएचईएल) सिस्टम पर भी काम करता है। % P असंबंधित आँकड़े (% CPU) देता है जो अनुसूचक पर निर्भर करता है और इस प्रकार काफी परिवर्तनशील होता है।
Blaisorblade

2
@ डिलेटमैन: timeउपयोग करते समय एक अंतर्निहित कमांड है csh। यदि आप सटीक मार्ग का उपयोग करते हैं, तो यह आपको बाहरी कमांड चलाने की अनुमति देगा। जहाँ तक मुझे पता है, केवल GNU संस्करण प्रारूप विकल्प का समर्थन करता है।
जॉन Ericson

18

/ usr / बिन / समय शायद वही करता है जो आप चाहते हैं, वास्तव में। कुछ इस तरह।

 / usr / bin / time --format = '(% Xtext +% Ddata% Mmax)'

विवरण के लिए समय (1) देखें ...


1
मैं हमेशा इसके साथ शून्य प्राप्त करना चाहता हूं, यहां तक ​​कि बड़े आदेशों के लिए भी
jes5199

jes5199, Liran, उपरोक्त टिप्पणियों को देखकर लगता है कि समय (1) कुछ linuxes पर मेमोरी रिपोर्टिंग के लिए टूट सकता है ...
simon

Ubuntu 16.04 पर, पाठ और डेटा शून्य हैं, लेकिन अधिकतम गैर-शून्य है और सार्थक मूल्य पैदा करता है। मैं इससे खुश हूं।
स्टीफन गौरिचोन

मुझे उम्मीद है कि Mmax का मतलब वहाँ है जो हम इसका मतलब चाहते हैं .... मैन पेज उस बारे में थोड़ा सा है
matanster

17

MacOS सिएरा उपयोग पर:

/usr/bin/time -l commandToMeasure

आप grepजो चाहते हैं उसे लेने के लिए उपयोग कर सकते हैं ।


5
इस! मैंने सचमुच एक घंटे का समय बिताया है, जो मुझे इंस्ट्रूमेंट अखंडता के साथ एक मेमोरी प्रोफाइल देने के लिए Instruments.app और dtrace को चालू करने की कोशिश कर रहा है (इसे बंद नहीं कर सकता), जबकि मुझे बस जरूरत थी बस इस साधारण कमांड की। एक छोटा नोट, आप command time -lइसके बजाय उपयोग कर सकते हैं /usr/bin/time -lजो आपके शेल को वास्तव timeमें बिलिन फ़ंक्शन के बजाय एक बाइनरी कॉल करने का कारण होगा । (हाँ, commandएक प्लेसहोल्डर नहीं है, command timeबस की तुलना में अलग है time।)
जकूब अर्नोल्ड

16

यदि प्रक्रिया कम से कम कुछ सेकंड के लिए चलती है, तो आप निम्नलिखित बैश स्क्रिप्ट का उपयोग कर सकते हैं, जो दिए गए कमांड लाइन को चलाएगा फिर पीक आरएसएस ( rssकिसी अन्य विशेषता के लिए विकल्प जिसमें आप रुचि रखते हैं) को स्थानांतरित करने के लिए प्रिंट कर सकते हैं। यह कुछ हद तक हल्का है, और यह psउबंटू 9.04 (जो मैं इसके लिए नहीं कह सकता time) में शामिल के साथ मेरे लिए काम करता है ।

#!/usr/bin/env bash
"$@" & # Run the given command line in the background.
pid=$! peak=0
while true; do
  sleep 1
  sample="$(ps -o rss= $pid 2> /dev/null)" || break
  let peak='sample > peak ? sample : peak'
done
echo "Peak: $peak" 1>&2

1
इस विधि का प्रमुख दोष यह है कि यदि प्रक्रिया कम अवधि (जैसे अंत के पास) के लिए बहुत अधिक मेमोरी आवंटित करती है, तो इसका पता नहीं लगाया जा सकता है। नींद का समय कम करने से थोड़ी मदद मिल सकती है।
vinc17


8

ठीक है, यदि आप वास्तव में मेमोरी पीक और कुछ अधिक गहराई वाले आंकड़े दिखाना चाहते हैं, तो मैं एक प्रोफाइलर जैसे वैलेरिंड का उपयोग करने की सलाह देता हूं । एक अच्छा वैलेग्रिड फ्रंट-एंड गली है



5

यहाँ (अन्य उत्तरों के आधार पर) एक बहुत ही सरल स्क्रिप्ट है जो पहले से चल रही प्रक्रिया को देखता है। आप इसे तर्क की प्रक्रिया के रूप में देखना चाहते हैं:

#!/usr/bin/env bash

pid=$1

while ps $pid >/dev/null
do
    ps -o vsz= ${pid}
    sleep 1
done | sort -n | tail -n1

उदाहरण उपयोग:

max_mem_usage.sh 23423


1

Heaptrack KDE टूल है जिसमें GUI और टेक्स्ट इंटरफ़ेस है। मैं इसे किसी प्रक्रिया के मेमोरी उपयोग को समझने के लिए वैलग्राइंड की तुलना में अधिक उपयुक्त मानता हूं क्योंकि यह अधिक विवरण और फ्लेमोग्राफ प्रदान करता है। यह तेज़ भी है क्योंकि यह उस वैलग्राइंड की कम जाँच करता है। और यह आपको चरम मेमोरी उपयोग देता है।

वैसे भी, ट्रैकिंग rss और vss भ्रामक है क्योंकि पृष्ठों को साझा किया जा सकता है, इसीलिए ऐसा है memusg। क्या तुम सच में क्या करना चाहिए की राशि को ट्रैक है Pssमें /proc/[pid]/smapsया उपयोग pmapGNOME सिस्टम-मॉनिटर ऐसा करता था लेकिन यह बहुत महंगा था।


1

पहिया को फिर से आविष्कार करना, हाथ से बने बैश स्क्रिप्ट के साथ। त्वरित और साफ।

मेरे उपयोग का मामला: मैं एक ऐसी लिनक्स मशीन की निगरानी करना चाहता था जिसमें कम रैम हो और जब वह भारी उपयोग के लिए चलती हो तो प्रति कंटेनर उपयोग का एक स्नैपशॉट लेना चाहती थी।

#!/usr/bin/env bash

threshold=$1

echo "$(date '+%Y-%m-%d %H:%M:%S'): Running free memory monitor with threshold $threshold%.."

while(true)
    freePercent=`free -m | grep Mem: | awk '{print ($7/$2)*100}'`    
  do

  if (( $(awk 'BEGIN {print ("'$freePercent'" < "'$threshold'")}') ))
  then
       echo "$(date '+%Y-%m-%d %H:%M:%S'): Free memory $freePercent% is less than $threshold%"
       free -m
       docker stats --no-stream
       sleep 60  
       echo ""  
  else
       echo "$(date '+%Y-%m-%d %H:%M:%S'): Sufficient free memory available: $freePercent%"
  fi
  sleep 30

done

नमूना उत्पादन:

2017-10-12 13:29:33: थ्रेशोल्ड 30% के साथ मुफ्त मेमोरी मॉनिटर चलाना ।।

2017-10-12 13:29:33: पर्याप्त मुफ्त मेमोरी उपलब्ध: 69.4567%

2017-10-12 13:30:03: पर्याप्त मुफ्त मेमोरी उपलब्ध: 69.4567%

2017-10-12 16:47:02: मुफ्त मेमोरी 18.9387% 30% से कम है

आपका कस्टम कमांड आउटपुट


1

MacOS पर, आप इसके बजाय DTrace का उपयोग कर सकते हैं। "इंस्ट्रूमेंट्स" ऐप उसके लिए एक अच्छा GUI है, यह XCode afaik के साथ आता है।


0

'htop' यह देखने के लिए सबसे अच्छा कमांड है कि कौन सी प्रक्रिया कितनी रैम का उपयोग कर रही है .....

अधिक विस्तार के लिए http://manpages.ubuntu.com/manpages/precise/man1/htop.1.html


3
htop PEAK के उपयोग को सूचीबद्ध नहीं करता है। केवल CURRENT उपयोग। (जब तक आपको कुछ पता न हो मैं नहीं करता। जैसा कि मैंने कल इस सटीक परिदृश्य के लिए htop में देखा है।)
Katastic Voyage

-2

कृपया प्रश्न का उत्तर अवश्य दें। विवरण प्रदान करें और अपने शोध को साझा करें!

क्षमा करें, मैं यहां पहली बार हूं और केवल प्रश्न पूछ सकता हूं ...

उपयोग किए गए सुझाव:

valgrind --tool=massif --pages-as-heap=yes --massif-out-file=massif.out ./test.sh; grep mem_heap_B massif.out | sed -e 's/mem_heap_B=\(.*\)/\1/' | sort -g | tail -n 1

फिर:

grep mem_heap_B massif.out
...
mem_heap_B=1150976
mem_heap_B=1150976
...

यह एक ही topसमय में कमांड शो से बहुत अलग है :

14673 gu27mox   20   0 3280404 468380  19176 R 100.0  2.9   6:08.84 pwanew_3pic_com

Valgrind से मापा इकाइयों क्या हैं ??

/usr/bin/time -v ./test.shजवाब कभी नहीं - आप सीधे करने के लिए निष्पादन योग्य खिलाने चाहिए /usr/bin/timeकी तरह:

/usr/bin/time -v  pwanew_3pic_compass_2008florian3_dfunc.static  card_0.100-0.141_31212_resubmit1.dat_1.140_1.180   1.140 1.180 31212


    Command being timed: "pwanew_3pic_compass_2008florian3_dfunc.static card_0.100-0.141_31212_resubmit1.dat_1.140_1.180 1.140 1.180 31212"

    User time (seconds): 1468.44
    System time (seconds): 7.37
    Percent of CPU this job got: 99%
    Elapsed (wall clock) time (h:mm:ss or m:ss): 24:37.14
    Average shared text size (kbytes): 0
    Average unshared data size (kbytes): 0
    Average stack size (kbytes): 0
    Average total size (kbytes): 0
    Maximum resident set size (kbytes): 574844
    Average resident set size (kbytes): 0
    Major (requiring I/O) page faults: 74
    Minor (reclaiming a frame) page faults: 468880
    Voluntary context switches: 1190
    Involuntary context switches: 20534
    Swaps: 0
    File system inputs: 81128
    File system outputs: 1264
    Socket messages sent: 0
    Socket messages received: 0
    Signals delivered: 0
    Page size (bytes): 4096
    Exit status: 0
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.