एक प्रक्रिया के मेमोरी उपयोग को आमंत्रित करें और ट्रैक करें


14

मैं एक मेमोरी-खपत प्रोग्राम चलाना चाहता हूं और समय के साथ इसके मेमोरी उपयोग को ट्रैक करना चाहता हूं। कार्यक्रम कुछ ही सेकंड में समाप्त हो जाता है।

इस पिछले प्रश्न ने sysstat पैकेज का सुझाव दिया । हालांकि इसकी pidstatउपयोगिता आंशिक रूप से वही है जो मैं चाहता हूं, यह मेरी 2 जरूरतों को पूरा करने में विफल है:

  • यह कम से कम अंतराल को स्वीकार करता है 1s, लेकिन मैं छोटे ग्रैन्युलैरिटी को मापना चाहता हूं। ( 0.1sठीक होना चाहिए)
  • यह केवल एक मौजूदा प्रक्रिया को ट्रैक करता है, जबकि मैं हमेशा कॉपी को कॉपी और पेस्ट करने के लिए मौजूद नहीं हो सकता।

क्या इनवोक-एंड-माप कार्य को बेहतर करने के लिए कुछ वैकल्पिक स्क्रिप्ट / उपयोगिताओं हैं?


1
लगता है जैसे आपको अपने आप को प्रक्रिया के मेमोरी उपयोग को डंप करने के लिए एक साधारण सा पायथन या बैश स्क्रिप्ट लिखना चाहिए (आप बस पहले पूर्णांक देख सकते हैं /proc/$PID/statm), और फिर 100ms तक सोएं और दोहराएं। आप सिर्फ पीआईडी statmसे जुड़े को क्यों नहीं फेंक सकते cat, शायद अतिरिक्त / अनावश्यक मानों को फ़िल्टर करने के लिए कुछ रेगेक्स का उपयोग करें, और बस एक करें sleep 0.01? कुछ ऑपरेटिंग सिस्टम उप-द्वितीय sleepमानों की अनुमति नहीं देंगे , इसलिए उस स्थिति में, आपको पायथन रूट लेना होगा (और timeइसके बजाय स्लीपिंग लाइब्रेरी के पायथन का उपयोग करें )।
ब्रेकथ्रू

वहाँ कई हैं तरीके
मुनीश

जवाबों:


11

यह वही करना चाहिए जो आपको चाहिए। यह /proc/$PID/statmऔर प्रिंट से जानकारी प्राप्त करता है man procfs:

              size       total program size
                         (same as VmSize in /proc/[pid]/status)
              resident   resident set size
                         (same as VmRSS in /proc/[pid]/status)
              share      shared pages (from shared mappings)
              data       data + stack

लिपी:

#!/usr/bin/env bash 

## Print header
 echo -e "Size\tResid.\tShared\tData\t%"
 while [ 1 ]; do
    ## Get the PID of the process name given as argument 1
     pidno=`pgrep $1`
    ## If the process is running, print the memory usage
     if [ -e /proc/$pidno/statm ]; then
     ## Get the memory info
      m=`awk '{OFS="\t";print $1,$2,$3,$6}' /proc/$pidno/statm`
     ## Get the memory percentage
      perc=`top -bd .10 -p $pidno -n 1  | grep $pidno | gawk '{print \$10}'`
     ## print the results
      echo -e "$m\t$perc";
    ## If the process is not running
     else
      echo "$1 is not running";
     fi
 done

आप स्क्रिप्ट को कॉल कर सकते हैं, इसे इनपुट के रूप में एक प्रक्रिया नाम दे सकते हैं। उदाहरण के लिए:

$ memusage.sh firefox
Size    Resid.  Shared  Data    %
517193  261902  9546    400715  12.8
517193  261902  9546    400715  12.8
517193  261902  9546    400715  12.8
517193  262100  9546    400715  12.8
517193  262100  9546    400715  12.8
517193  262100  9546    400715  12.8
517209  261899  9546    400731  12.8
517209  261899  9546    400731  12.8

टिप्पणियाँ:

  • यह मानता है कि निर्दिष्ट नाम के साथ केवल एक ही चलने की प्रक्रिया है।

@ björnen संपादन के लिए धन्यवाद। आप काफी सही हैं, मैं manवहां गलत था, मुझे नहीं पता कि आपका संपादन क्यों अस्वीकार कर दिया गया था।
टेराडन

1

सालों बाद मैंने पाया कि इसके लिए वेलग्रिंड (भी) एक उपकरण है:

# record memory usage

$ valgrind --tool=massif bash -c "sleep 5; echo hey";
==5281== Massif, a heap profiler
==5281== Copyright (C) 2003-2015, and GNU GPL'd, by Nicholas Nethercote
==5281== Using Valgrind-3.12.0 and LibVEX; rerun with -h for copyright info
==5281== Command: bash -c sleep\ 5;\ echo\ hey
==5281==
hey
==5281==

# print the usage (5281 was the pid of bash, your filename will be different)
$ ms_print massif.out.4682

नोट: वाल्ग्रिंड अवलोकन करने से अधिक है: इसे कुछ कोड इंजेक्ट करने और मेमोरी का स्नैपशॉट लेने की आवश्यकता है। इससे आंकड़ों की शुद्धता को नुकसान पहुंच सकता है।

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