मैं वास्तविक समय में एक प्रक्रिया की मेमोरी / सीपीयू उपयोग की निगरानी करना चाहूंगा। समान topरूप से केवल एक ही प्रक्रिया पर लक्षित, अधिमानतः कुछ प्रकार के इतिहास ग्राफ के साथ।
मैं वास्तविक समय में एक प्रक्रिया की मेमोरी / सीपीयू उपयोग की निगरानी करना चाहूंगा। समान topरूप से केवल एक ही प्रक्रिया पर लक्षित, अधिमानतः कुछ प्रकार के इतिहास ग्राफ के साथ।
जवाबों:
लिनक्स पर, topवास्तव में एक प्रक्रिया पर ध्यान केंद्रित करने का समर्थन करता है, हालांकि यह स्वाभाविक रूप से एक इतिहास ग्राफ नहीं है:
top -p PID
यह मैक ओएस एक्स पर एक अलग सिंटैक्स के साथ भी उपलब्ध है:
top -pid PID
top -p `pgrep -f /usr/bin/kvm`।
hostname_pid.txt कर सकते हैं; exit'and
htopके लिए एक महान प्रतिस्थापन है top। यह है ... रंग! सरल कीबोर्ड शॉर्टकट! तीर कुंजियों का उपयोग करके सूची स्क्रॉल करें! पीआईडी पर ध्यान दिए बिना और छोड़ने के बिना एक प्रक्रिया को मार डालो! कई प्रक्रियाओं को चिह्नित करें और उन सभी को मार डालें!
सभी सुविधाओं के बीच, मैनपेज कहता है कि आप एक प्रक्रिया का पालनF करने के लिए दबा सकते हैं।
वास्तव में, आपको प्रयास करना चाहिए htop। मैंने topफिर कभी शुरुआत नहीं की , पहली बार इस्तेमाल करने के बाद htop।
एकल प्रक्रिया प्रदर्शित करें:
htop -p PID
topरंग भी हैं। प्रेस करें z।
topरंग है! बहुत बुरा इसके रंग काफी बेकार हैं, विशेषकर जब तुलना की जाती है htop(जो अन्य उपयोगकर्ताओं की प्रक्रिया को धूमिल करता है और कार्यक्रम का नाम उजागर करता है)।
htop -p PID@Michael Mrozek द्वारा दिए गए उदाहरण की तरह ही काम करेगा।
निम्नलिखित कुछ प्रकार के इतिहास ग्राफ को संबोधित करता है । पायथन 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'
पैकेज आरएसएस-केवल नमूने (प्लस कुछ अजगर विशिष्ट विकल्प) प्रदान करता है। यह अपने बच्चों की प्रक्रियाओं के साथ प्रक्रिया को भी रिकॉर्ड कर सकता है (देखें mprof --help)।
pip install memory_profiler
mprof run /path/to/executable
mprof plot
डिफ़ॉल्ट रूप से यह एक Tkinter- आधारित ( python-tkजिसकी आवश्यकता हो सकती है) चार्ट एक्सप्लोरर को निर्यात किया जा सकता है:
यह एक साधारण एक बार के परीक्षण के लिए एक ओवरकिल लग सकता है, लेकिन कुछ दिन की डिबगिंग की तरह कुछ के लिए, निश्चित रूप से, उचित है। एक आसान ऑल-इन-वन 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 फ़िल्टर नहीं कर सकता procinfo है लिखने का समय। हालांकि, यह एक कस्टम छेनी ( sysdigलुआ में लिखा गया एक विस्तार) के साथ संभव होना चाहिए ।
pgrep --helpबचाव के लिए। कम से कम --newestऔर है --oldest।
Ctrl+Cpsrecord प्रक्रिया पर बस एक भूखंड को बचाने के बिना क्विट करता है, आपको प्रक्रिया-अंडर-टेस्ट को समाप्त करने की आवश्यकता है।
एक स्क्रिप्ट पर उस जानकारी का उपयोग करने के लिए आप ऐसा कर सकते हैं:
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 की देरी); यह उसी क्षण में जो हो रहा है उसका एक अच्छा और तेज सटीक परिणाम प्रदान करता है।
चर को अपनी आवश्यकताओं के अनुरूप करें।
$nPercCpu): शेल, टॉप, grep, sed, कट ... bc प्राप्त करने के लिए 10 प्रक्रियाओं को कॉल करें । उदाहरण के लिए यदि आप इन सभी में से 1 मर्ज या अवाक स्क्रिप्ट में विलय कर सकते हैं तो कई नहीं।
topके उत्पादन है औसत से अधिक $delay। सी एफ CPU उपयोग की गणना कैसे करें
मैं आम तौर पर दो का उपयोग करता हूं:
एचपी कैलीपर : मॉनिटरिंग प्रक्रियाओं के लिए इसका बहुत अच्छा उपकरण यह है कि आप कॉल ग्राफ और अन्य निम्न स्तर की जानकारी भी जांच सकते हैं। लेकिन कृपया इसे केवल निजी उपयोग के लिए नि: शुल्क नोट करें।
daemontools : UNIX सेवाओं के प्रबंधन के लिए उपकरणों का एक संग्रह
उपयोग करना 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।
यदि आप प्रक्रिया नाम जानते हैं तो आप उपयोग कर सकते हैं
top -p $(pidof <process_name>)
यदि आपके पास एक कट-डाउन लिनक्स वितरण है जहां शीर्ष में प्रति प्रक्रिया (-p) विकल्प या संबंधित विकल्प नहीं हैं, तो आप प्रति प्रक्रिया CPU उपयोग की जानकारी प्राप्त करने के लिए अपनी प्रक्रिया के नाम के लिए शीर्ष कमांड के आउटपुट को पार्स कर सकते हैं।
while true; do top -bn1 | awk '/your_process_name/ {print $8}' ; sleep 1; done
8 मेरे एम्बेडेड लिनक्स वितरण में शीर्ष कमांड के आउटपुट में सीपीयू उपयोग प्रति प्रक्रिया का प्रतिनिधित्व करता है
टिप्पणी करने के लिए पर्याप्त प्रतिष्ठा नहीं है, लेकिन psrecord के लिए आप इसे सीधे भी कह सकते हैं, प्रोग्रामेटिक तरीके से, सीधे पायथन में:
from psrecord.main import monitor
monitor(<pid number>, logfile = "./test.log", plot="./fig.png", include_children=True)
यदि आपको किसी विशिष्ट प्रक्रिया की अवधि के लिए औसत की आवश्यकता है, तो शीर्ष के संचयी -c विकल्प का प्रयास करें:
top -c a -pid PID
मैक 10.8.5 के लिए "-c" शीर्ष में पाया गया।
वैज्ञानिक लिनक्स के लिए, विकल्प -S है, जिसे अंतःक्रियात्मक रूप से सेट किया जा सकता है।
topइस सुविधा को प्रदान करने वाले संस्करण के बारे में और विवरण जोड़ना चाहेंगे । फेडोरा 19 पर मेरा संस्करण नहीं है। उबंटू 13.04 पर भी।