किसी एकल प्रक्रिया के CPU / मेमोरी उपयोग की निगरानी कैसे करें?


170

मैं वास्तविक समय में एक प्रक्रिया की मेमोरी / सीपीयू उपयोग की निगरानी करना चाहूंगा। समान topरूप से केवल एक ही प्रक्रिया पर लक्षित, अधिमानतः कुछ प्रकार के इतिहास ग्राफ के साथ।


आप कौन से स्मृति आँकड़े चाहते हैं? यहां उनमें से बहुत सारे हैं।
vwduder

एक निश्चित समय सीमा में मेमोरी का उपयोग, वर्तमान उपयोग, अधिकतम उपयोग, औसत।
जोश के

जवाबों:


139

लिनक्स पर, topवास्तव में एक प्रक्रिया पर ध्यान केंद्रित करने का समर्थन करता है, हालांकि यह स्वाभाविक रूप से एक इतिहास ग्राफ नहीं है:

top -p PID

यह मैक ओएस एक्स पर एक अलग सिंटैक्स के साथ भी उपलब्ध है:

top -pid PID

9
और जब से आप हर बार पीआईडी ​​को नहीं देखना चाहते हैं, तो कुछ ऐसा प्रयास करें top -p `pgrep -f /usr/bin/kvm`
स्टीफन लासवर्स्की

मैं कुछ व्यक्तिगत प्रक्रियाओं की निगरानी करने के लिए कैक्टि का उपयोग करता हूं, लेकिन एक पूर्ण विकसित कैक्टि इंस्टॉलेशन ध्वनियों को यहां पूछी गई सरल स्थिति के लिए बहुत जटिल लगता है।
स्टीफन लासिवस्की

@Stefan: मैं मान रहा हूँ कि मुझे उस रिमोट को चलाना होगा?
जोश के

@ जोश: हाँ आपको एक अन्य सर्वर पर कैक्टि (जिसमें MySQL, Apache और कुछ अन्य पैकेज की आवश्यकता होती है) को चलाने की आवश्यकता होगी। अधिकांश डिस्ट्रोस पर, यम या एप्ट-गेट का उपयोग करके इंस्टॉल करना बहुत सरल है।
स्टेफन लासवर्स्की

@Stefan यदि आप रिमोटली चेक करना चाहते हैं तो आप ssh @ रिमोटहोस्ट 'टॉप -p PID> ~ hostname_pid.txt कर सकते हैं; exit'and
klerk

61

htopके लिए एक महान प्रतिस्थापन है top। यह है ... रंग! सरल कीबोर्ड शॉर्टकट! तीर कुंजियों का उपयोग करके सूची स्क्रॉल करें! पीआईडी ​​पर ध्यान दिए बिना और छोड़ने के बिना एक प्रक्रिया को मार डालो! कई प्रक्रियाओं को चिह्नित करें और उन सभी को मार डालें!

सभी सुविधाओं के बीच, मैनपेज कहता है कि आप एक प्रक्रिया का पालनF करने के लिए दबा सकते हैं।

वास्तव में, आपको प्रयास करना चाहिए htop। मैंने topफिर कभी शुरुआत नहीं की , पहली बार इस्तेमाल करने के बाद htop

एकल प्रक्रिया प्रदर्शित करें:

htop -p PID


7
Htop के लिए +1। यह एक नए सिस्टम पर स्थापित किए गए पहले प्रोग्राम में से एक है। यह मेरे जीवन को बहुत आसान बनाता है। पेड़ का दृश्य भी बहुत उपयोगी है।
बार्थेलेमी

9
topरंग भी हैं। प्रेस करें z
tshepang

2
आप सही हे! topरंग है! बहुत बुरा इसके रंग काफी बेकार हैं, विशेषकर जब तुलना की जाती है htop(जो अन्य उपयोगकर्ताओं की प्रक्रिया को धूमिल करता है और कार्यक्रम का नाम उजागर करता है)।
डेनिलसन सा मैया

1
और htop -p PID@Michael Mrozek द्वारा दिए गए उदाहरण की तरह ही काम करेगा।
शोर मचाया

1
तब केवल शीर्ष का उपयोग करने का कारण है, क्योंकि htop उपलब्ध नहीं है या स्थापित नहीं किया जा सकता है। यही कारण है कि htop बनाया गया था, बहुत अधिक सुविधाएँ प्रदान करने के लिए।
लेप

59

psrecord

निम्नलिखित कुछ प्रकार के इतिहास ग्राफ को संबोधित करता है । पायथन psrecordपैकेज ठीक यही करता है।

pip install psrecord                             # local user install
sudo apt-get install python-matplotlib python-tk # for plotting; or via pip

एकल प्रक्रिया के लिए यह निम्नलिखित है (द्वारा रोका गया Ctrl+C):

psrecord $(pgrep proc-name1) --interval 1 --plot plot1.png

कई प्रक्रियाओं के लिए चार्ट को सिंक्रनाइज़ करने के लिए निम्न स्क्रिप्ट सहायक है:

#!/bin/bash    
psrecord $(pgrep proc-name1) --interval 1 --duration 60 --plot plot1.png &
P1=$!
psrecord $(pgrep proc-name2) --interval 1 --duration 60 --plot plot2.png &
P2=$!
wait $P1 $P2
echo 'Done'

चार्ट जैसा दिखता है: psccord उदाहरण

memory_profiler

पैकेज आरएसएस-केवल नमूने (प्लस कुछ अजगर विशिष्ट विकल्प) प्रदान करता है। यह अपने बच्चों की प्रक्रियाओं के साथ प्रक्रिया को भी रिकॉर्ड कर सकता है (देखें mprof --help)।

pip install memory_profiler
mprof run /path/to/executable
mprof plot

डिफ़ॉल्ट रूप से यह एक Tkinter- आधारित ( python-tkजिसकी आवश्यकता हो सकती है) चार्ट एक्सप्लोरर को निर्यात किया जा सकता है:

mprof

ग्रेफाइट-स्टैक और आँकड़े

यह एक साधारण एक बार के परीक्षण के लिए एक ओवरकिल लग सकता है, लेकिन कुछ दिन की डिबगिंग की तरह कुछ के लिए, निश्चित रूप से, उचित है। एक आसान ऑल-इन-वन raintank/graphite-stack(ग्राफाना के लेखकों से) छवि psutilऔर statsdग्राहक। procmon.pyएक कार्यान्वयन प्रदान करता है।

$ docker run --rm -p 8080:3000 -p 8125:8125/udp raintank/graphite-stack

फिर लक्ष्य प्रक्रिया शुरू करने के बाद दूसरे टर्मिनल में:

$ sudo apt-get install python-statsd python-psutil # or via pip
$ python procmon.py -s localhost -f chromium -r 'chromium.*'

फिर http: // लोकलहोस्ट: 8080 , प्रमाणीकरण के रूप में ग्राफ्टाना को खोलते हुए , admin:adminडेटा स्रोत को स्थापित करने के लिए https: // localhost , आप इस तरह एक चार्ट तैयार कर सकते हैं:

ग्राफ्टाना चार्ट

ग्रेफाइट-स्टैक और टेलीग्राफ

पाइथन स्क्रिप्ट के बजाय मेट्रिक्स को स्टैट्सड telegraf(और procstatइनपुट प्लगइन) भेजने के लिए सीधे मैट्रिक्स को ग्रेफाइट में भेजने के लिए इस्तेमाल किया जा सकता है।

न्यूनतम telegrafविन्यास जैसा दिखता है:

[agent]
  interval = "1s"

[[outputs.graphite]]
  servers = ["localhost:2003"]
  prefix = "testprfx"

[[inputs.procstat]]
  pid_file = "/path/to/file/with.pid"

फिर लाइन चलाएं telegraf --config minconf.conf। ग्राफ्राफ नाम को छोड़कर, ग्राफ्टाना भाग समान है।

sysdig

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


pgrep systemd आउटपुट की कई पंक्तियाँ दे रहा है, और इस प्रकार psrecord को बग देता है, क्या किया जाना चाहिए? मैं बस किसी भी प्रक्रिया के साथ परीक्षण करना चाहता हूं।
यूरालपबी

1
@EralpB pgrep --helpबचाव के लिए। कम से कम --newestऔर है --oldest
साज

2
यह स्वीकृत उत्तर होना चाहिए, क्योंकि यह वास्तव में एक मेमोरी यूसेज हिस्ट्री प्लॉट देता है। Psrecord विधि के लिए ध्यान दें, Ctrl+Cpsrecord प्रक्रिया पर बस एक भूखंड को बचाने के बिना क्विट करता है, आपको प्रक्रिया-अंडर-टेस्ट को समाप्त करने की आवश्यकता है।
user2561747

8

एक स्क्रिप्ट पर उस जानकारी का उपयोग करने के लिए आप ऐसा कर सकते हैं:

calcPercCpu.sh

#!/bin/bash
nPid=$1;
nTimes=10; # customize it
delay=0.1; # customize it
strCalc=`top -d $delay -b -n $nTimes -p $nPid \
  |grep $nPid \
  |sed -r -e "s;\s\s*; ;g" -e "s;^ *;;" \
  |cut -d' ' -f9 \
  |tr '\n' '+' \
  |sed -r -e "s;(.*)[+]$;\1;" -e "s/.*/scale=2;(&)\/$nTimes/"`;
nPercCpu=`echo "$strCalc" |bc -l`
echo $nPercCpu

उपयोग की तरह: calcPercCpu.sh 1234जहां 1234 पीआईडी ​​है

निर्दिष्ट $ nPid के लिए, यह संपूर्ण 1 सेकंड में सीपीयू के उपयोग के 10 स्नैपशॉट का औसत मापेगा (प्रत्येक * nTimes = 10 में 0.1 s की देरी); यह उसी क्षण में जो हो रहा है उसका एक अच्छा और तेज सटीक परिणाम प्रदान करता है।

चर को अपनी आवश्यकताओं के अनुरूप करें।


Uhm, 1 के सीपीयू उपयोग की निगरानी के लिए 10 प्रक्रियाएं?
xebeche

@xebeche "यह 10 स्नैपशॉट के औसत को मापेगा" "nTimes = 10; # इसे अनुकूलित करें " :)
कुंभ राशि पावर

मेरा मतलब है कि मुझे यह पसंद नहीं है कि आप 1 नंबर ( $nPercCpu): शेल, टॉप, grep, sed, कट ... bc प्राप्त करने के लिए 10 प्रक्रियाओं को कॉल करें । उदाहरण के लिए यदि आप इन सभी में से 1 मर्ज या अवाक स्क्रिप्ट में विलय कर सकते हैं तो कई नहीं।
xebeche

@xebeche शांत, मौजूदा एक बेहतर कमांड को जोड़ने के लिए स्वतंत्र महसूस करें (एक विकल्प के रूप में), आपको मेरी उत्सुकता मिली :)
कुंभ राशि पावर

1
मैंने अपना जवाब जोड़ दिया है । Btw, ध्यान दें औसत की गणना क्योंकि में कोई मतलब नहीं है कि topके उत्पादन है औसत से अधिक $delay। सी एफ CPU उपयोग की गणना कैसे करें
xebeche

5

मैं आम तौर पर दो का उपयोग करता हूं:

  1. एचपी कैलीपर : मॉनिटरिंग प्रक्रियाओं के लिए इसका बहुत अच्छा उपकरण यह है कि आप कॉल ग्राफ और अन्य निम्न स्तर की जानकारी भी जांच सकते हैं। लेकिन कृपया इसे केवल निजी उपयोग के लिए नि: शुल्क नोट करें।

  2. daemontools : UNIX सेवाओं के प्रबंधन के लिए उपकरणों का एक संग्रह


6
मैंने सालों तक डेमोनटूल का इस्तेमाल किया। यह अन्य प्रक्रियाओं के लिए पर्यवेक्षक / प्रहरी के रूप में बहुत अच्छा है। यह एक प्रक्रिया के लिए सीपीयू / मेमोरी उपयोग की निगरानी करने में आपकी सहायता कैसे करता है?
स्टीफन लासिवस्की

3

उपयोग करना topऔर awkकोई भी आसानी से बना सकता है जैसे कि% CPU ( $9) +% MEM ( $10) उपयोग का अल्पविराम से अलग किया गया लॉग जिसे बाद में किसी भी आँकड़े और रेखांकन उपकरण में खिलाया जा सकता है।

top -b -d $delay -p $pid | awk -v OFS="," '$1+0>0 {
print strftime("%Y-%m-%d %H:%M:%S"),$1,$NF,$9,$10; fflush() }'

आउटपुट जैसा होगा

2019-03-26 17:43:47,2991,firefox,13.0,5.2
2019-03-26 17:43:48,2991,firefox,4.0,5.2
2019-03-26 17:43:49,2991,firefox,64.0,5.3
2019-03-26 17:43:50,2991,firefox,71.3,5.4
2019-03-26 17:43:51,2991,firefox,67.0,5.4

$delayहालांकि, यह बड़े के लिए अच्छे परिणाम नहीं देगा , क्योंकि मुद्रित टाइमस्टैम्प वास्तव में $delayपीछे है क्योंकि topआउटपुट कैसे काम करता है। बहुत अधिक विस्तार में जाने के बिना, इसके आस-पास का 1 सरल तरीका यह है कि प्रदान किए गए समय को लॉग करें top:

top -b -d $delay -p $pid | awk -v OFS="," '$1=="top"{ time=$3 }
$1+0>0 { print time,$1,$NF,$9,$10; fflush() }'

फिर टाइमस्टैम्प सटीक है, लेकिन आउटपुट में अभी भी देरी होगी $delay


2

यदि आप प्रक्रिया नाम जानते हैं तो आप उपयोग कर सकते हैं

top -p $(pidof <process_name>)

8
यह बहुत ज्यादा है जो स्वीकार किए जाते हैं जवाब, वर्षों पहले से, और इसकी पहली टिप्पणी कहती है।
धग

1

यदि आपके पास एक कट-डाउन लिनक्स वितरण है जहां शीर्ष में प्रति प्रक्रिया (-p) विकल्प या संबंधित विकल्प नहीं हैं, तो आप प्रति प्रक्रिया CPU उपयोग की जानकारी प्राप्त करने के लिए अपनी प्रक्रिया के नाम के लिए शीर्ष कमांड के आउटपुट को पार्स कर सकते हैं।

while true;  do top -bn1 | awk '/your_process_name/ {print  $8}' ; sleep 1; done

8 मेरे एम्बेडेड लिनक्स वितरण में शीर्ष कमांड के आउटपुट में सीपीयू उपयोग प्रति प्रक्रिया का प्रतिनिधित्व करता है


1

टिप्पणी करने के लिए पर्याप्त प्रतिष्ठा नहीं है, लेकिन psrecord के लिए आप इसे सीधे भी कह सकते हैं, प्रोग्रामेटिक तरीके से, सीधे पायथन में:

from psrecord.main import monitor
monitor(<pid number>, logfile = "./test.log", plot="./fig.png", include_children=True)

0

यदि आपको किसी विशिष्ट प्रक्रिया की अवधि के लिए औसत की आवश्यकता है, तो शीर्ष के संचयी -c विकल्प का प्रयास करें:

top -c a -pid PID

मैक 10.8.5 के लिए "-c" शीर्ष में पाया गया।

वैज्ञानिक लिनक्स के लिए, विकल्प -S है, जिसे अंतःक्रियात्मक रूप से सेट किया जा सकता है।


आप संभवतः topइस सुविधा को प्रदान करने वाले संस्करण के बारे में और विवरण जोड़ना चाहेंगे । फेडोरा 19 पर मेरा संस्करण नहीं है। उबंटू 13.04 पर भी।
SLM

आप सही कह रहे हैं!, मैं कुछ उपयोगी पाकर बहुत खुश था, मैं भूल गया कि मैं घर पर अपने मैक में था।
कीलेथ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.