තනි ක්‍රියාවලියක CPU / මතක භාවිතය නිරීක්ෂණය කරන්නේ කෙසේද?


198

එක් ක්‍රියාවලියක මතකය / සීපී භාවිතය තත්‍ය කාලීනව නිරීක්ෂණය කිරීමට මම කැමතියි. topඑක් ක්‍රියාවලියකට සමාන නමුත් ඉලක්ක කර ඇති, වඩාත් සුදුසු වන්නේ යම් ආකාරයක ඉතිහාස ප්‍රස්ථාරයක් සමඟ ය.


ඔබට අවශ්‍ය මතක සංඛ්‍යා ලේඛන මොනවාද? ඒවා ගොඩක් තියෙනවා.
vwduder

දී ඇති කාල රාමුවක් තුළ මතක භාවිතය, වත්මන් භාවිතය, උපරිම භාවිතය, සාමාන්‍යය.
ජොෂ් කේ

Answers:


159

ලිනක්ස් හි, topඇත්ත වශයෙන්ම ඉතිහාස ප්‍රස්ථාරයක් නොමැති වුවද, තනි ක්‍රියාවලියක් කෙරෙහි අවධානය යොමු කිරීමට සැබවින්ම සහාය දක්වයි:

top -p PID

මෙය වෙනස් වාක්‍ය ඛණ්ඩයක් සහිත මැක් ඕඑස් එක්ස් හි ද ඇත:

top -pid PID

9
සෑම විටම PID සොයා බැලීමට ඔබට අවශ්‍ය නොවනු ඇති බැවින්, එවැනි දෙයක් උත්සාහ කරන්න top -p `pgrep -f /usr/bin/kvm`.
ස්ටෙෆාන් ලසිව්ස්කි

සමහර තනි ක්‍රියාදාමයන් අධීක්ෂණය කිරීම සඳහා මම පතොක් භාවිතා කරමි, නමුත් පූර්ණ ලෙස පුපුරුවා හරින ලද පතොක් ස්ථාපනය කිරීම මෙහි දී අසන ලද සරල තත්වයට වඩා සංකීර්ණ යැයි පෙනේ.
ස්ටෙෆාන් ලසිව්ස්කි

Te ස්ටෙෆාන්: මම හිතන්නේ මට එය දුරස්ථව ධාවනය කළ යුතුයි.
ජොෂ් කේ

Os ජොෂ්: ඔව්, ඔබට වෙනත් සේවාදායකයක පතොක් (MySQL, Apache සහ තවත් පැකේජ කිහිපයක් අවශ්‍ය වේ) ධාවනය කිරීමට අවශ්‍ය වනු ඇත. බොහෝ ඩිස්ට්‍රෝ වල, Yum හෝ apt-get භාවිතා කර ස්ථාපනය කිරීම ඉතා සරල ය.
ස්ටෙෆාන් ලසිව්ස්කි

Ste ස්ටෙෆාන් ඔබට දුරස්ථව පරීක්ෂා කිරීමට අවශ්‍ය නම් ඔබට ssh @ remotehost 'top -p PID> ~ hostname_pid.txt; exit'and
klerk

89

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'

ප්‍රස්ථාර පෙනුමෙන්: psrecord උදාහරණය

memory_profiler

මෙම පැකේජය RSS පමණක් සාම්පලක් ගැනීම (ප්ලස් සමහර python, විශේෂිත විකල්ප) සපයයි. එහි දරුවන්ගේ ක්‍රියාවලි සමඟ ක්‍රියාවලිය පටිගත කළ හැකිය (බලන්න mprof --help).

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

පෙරනිමියෙන් මෙය 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: // localhost: 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. ප්‍රමිතික නම් හැර ග්‍රැෆනා කොටස සමාන වේ.

pidstat

pidstat( sysstatපැකේජයේ කොටසක් ) පහසුවෙන් විග්‍රහ කළ හැකි ප්‍රතිදානය නිපදවිය හැකිය. එය, ඔබ මෙම ක්රියාවලිය (ලිපින) වැඩිපුර ප්රමිතික අවශ්ය වන විට නඩුවේ ප්රයෝජනවත් උදා වඩාත් ප්රයෝජනවත් කණ්ඩායම් 3 (CPU, මතක හා තැටි) අඩංගු: %usr, %system, %guest, %CPU, minflt/s, majflt/s, VSZ, RSS, %MEM, kB_rd/s, kB_wr/s, kB_ccwr/s. මම එය විස්තර කළේ අදාළ පිළිතුරකිනි .


pgrep systemd මඟින් ප්‍රතිදාන රේඛා කිහිපයක් ලබා දෙන අතර එමඟින් psrecord දෝෂ කරයි, කළ යුත්තේ කුමක්ද? මට අවශ්‍ය වන්නේ ඕනෑම ක්‍රියාවලියක් සමඟ පරීක්ෂා කිරීමට ය.
EralpB

1
RalEralpB pgrep --helpගලවා ගැනීමට. අවම වශයෙන් --newestසහ --oldestඇත.
saaj

2
මෙය පිළිගත් පිළිතුර විය යුතුය, මන්ද එය සැබවින්ම මතක භාවිත ඉතිහාස කුමන්ත්‍රණයක් ලබා දෙයි. Psrecord ක්‍රමවේදය සඳහා සටහන Ctrl+C, බිම් කැබැල්ලක් සුරැකීමකින් තොරව psrecord ක්‍රියාවලියෙන් ඉවත්ව යන විට, ඔබ ක්‍රියාවලිය යටතේ පරීක්ෂණය අවසන් කළ යුතුය.
user2561747

1
psrecordහොඳින් වැඩ කළා, ස්තූතියි. GUI (X11) රහිත සේවාදායකයක එය වැඩ කිරීමට මට stackoverflow.com/a/37605654/3018750matplotlibrc හි විස්තර කර ඇති පරිදි වින්‍යාස කිරීමට සිදු විය
rkok

2
ඔබට විධානයක් ක්‍රියාත්මක කර එය psrecordවහාම පැතිකඩ කිරීමට අවශ්‍ය නම් සරල එක්-ලයිනර් : my-command & psrecord $! --interval 1 --plot plot1.png. $!අවසන් වරට ක්‍රියාත්මක කළ විධානයෙහි PID නැවත ලබා දෙයි, එබැවින් ඔබට අවශ්‍ය නොවේ pgrep. වෙන්වූ තනි &ලකුණු භාවිතා කිරීම my-command, එයින් අදහස් වන්නේ ධාවනය වීමට පෙර කවචය එය අවසන් වන තෙක් බලා නොසිටින psrecordබවයි.
ගුස්

67

htopයනු විශිෂ්ට ආදේශනයකි top. එහි ඇත ... වර්ණ! සරල යතුරුපුවරු කෙටිමං! ඊතල යතුරු භාවිතයෙන් ලැයිස්තුව අනුචලනය කරන්න! PID සැලකිල්ලට නොගෙන ක්‍රියාවලියකින් තොරව මරන්න! බහුවිධ ක්‍රියාවලීන් සලකුණු කොට ඒවා සියල්ලම මරා දමන්න!

සියලුම අංග අතර, ක්‍රියාවලියක් අනුගමනයF කිරීමට ඔබට එබිය හැකි බව මෑන්පේජ් පවසයි .

ඇත්තටම, ඔබ උත්සාහ කළ යුතුයි htop. topපළමු වතාවට පසුව මම නැවත ආරම්භ කළේ නැත htop.

තනි ක්‍රියාවලියක් පෙන්වන්න:

htop -p PID


7
Htop සඳහා +1. මෙය මම නව පද්ධතියක ස්ථාපනය කරන පළමු වැඩසටහනකි. එය මගේ ජීවිතය වඩාත් පහසු කරයි. ගස් දර්ශනය ද ඉතා පහසුය.
බාර්තෙලමි

9
topවර්ණ ද ඇත. ඔබන්න z.
tshepang

2
ඔයා හරි! topවර්ණ ඇත! එහි වර්ණ ඉතා නරක ය, විශේෂයෙන් සසඳන විට htop(වෙනත් පරිශීලකයින්ගේ ක්‍රියාවලීන් මැකී යන අතර වැඩසටහන් මූලික නම ඉස්මතු කරයි).
ඩෙනිල්සන් එස් මායා

1
ඉහළට ද ඉවත්ව නොයා ක්‍රියාවලි විනාශ කළ හැකිය. K ට පහර දෙන්න.
AvatarOfChronos

2
හා htop -p PIDදැන් @Michael Mrozek දෙනු ලැබූ ආදර්ශය මෙන් ද කටයුතු කරනු ඇත.
ශබ්ද නගා

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 යනු පිඩ් ය

නිශ්චිත P nPid සඳහා, එය තත්පර 1 ක කාලයක් තුළ cpu භාවිතයේ සාමාන්‍ය ස්නැප්ෂොට් 10 ක් මනිනු ඇත (එක් එක් තත්පර 0.1 ක ප්‍රමාදය * n ටයිම්ස් = 10); එය මේ මොහොතේ සිදුවෙමින් පවතින දේ පිළිබඳ හොඳ සහ වේගවත් නිවැරදි ප්‍රති result ලයක් සපයයි.

ඔබේ අවශ්‍යතාවයන් සඳහා විචල්‍යයන් වෙනස් කරන්න.


1 හි cpu භාවිතය අධීක්ෂණය කිරීම සඳහා ක්‍රියාවලි 10 ක්?
xebeche

@xebeche "එය ස්නැප්ෂොට් 10 ක සාමාන්‍යය මනිනු ඇත " "n ටයිම්ස් = 10; # එය රිසිකරණය කරන්න " :)
ඇක්වාරියස් පවර්

1
1 අංකය ( $nPercCpu) ලබා ගැනීම සඳහා ඔබ ක්‍රියාවලි 10 ක් කැඳවීමට මා කැමති නැතැයි මම අදහස් කළෙමි : ෂෙල්, ඉහළ, ග්‍රෙප්, සෙඩ්, කට් ... බීසී. බොහෝමයක් එසේ නොවේ නම් ඔබට 1 සෙඩ් හෝ අව්ක් ස්ක්‍රිප්ටයට ඒකාබද්ධ කළ හැකිය.
xebeche

exebeche cool, දැනට පවතින එකට වඩා හොඳ විධානයක් එක් කිරීමට සංස්කරණය කිරීමට නිදහස් වන්න (විකල්පයක් ලෙස), ඔබට මගේ කුතුහලය ඇති විය :)
Aquarius Power

2
මම මගේම පිළිතුරක් එකතු කර ඇත්තෙමි . BTW, නිසා සාමාන්ය ගණනය පලක් නැති බව සලකන්න topතේවලින් වේ සාමාන්ය කට $delay. සී. CPU භාවිතය ගණනය කරන්නේ කෙසේද
xebeche

5

මම සාමාන්‍යයෙන් පහත සඳහන් දෙක භාවිතා කරමි:

  1. HP කැලිපරය : ක්‍රියාවලි අධීක්ෂණය කිරීම සඳහා එහි ඉතා හොඳ මෙවලමක් වන අතර ඔබට ඇමතුම් ප්‍රස්ථාරය සහ අනෙකුත් පහත් මට්ටමේ තොරතුරු ද පරීක්ෂා කළ හැකිය. නමුත් එය නොමිලේ පුද්ගලික භාවිතය සඳහා පමණක් සටහන් කරන්න.

  2. daemontools : යුනික්ස් සේවා කළමනාකරණය සඳහා මෙවලම් එකතුවකි


7
මම අවුරුදු ගාණක් ඩීමොන්ටූල් පාවිච්චි කළා. වෙනත් ක්‍රියාදාමයන් සඳහා අධීක්ෂක / මුරකරු ලෙස එය විශිෂ්ටයි. එක් ක්‍රියාවලියක් සඳහා CPU / මතක භාවිතය නිරීක්ෂණය කිරීමට එය ඔබට උදව් කරන්නේ කෙසේද?
ස්ටෙෆාන් ලසිව්ස්කි

5

භාවිතා කිරීමෙන් 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

මෙය විශාල වශයෙන් හොඳ ප්‍රති results ල ලබා නොදෙන $delayනමුත් මුද්‍රිත කාලරාමුව සැබවින්ම $delayපිටුපසින් ඇත්තේ topප්‍රතිදානය ක්‍රියාත්මක වන ආකාරය නිසාය . වැඩි විස්තරයකට නොගොස්, මේ සඳහා සරල ක්‍රමයක් වන්නේ සපයන කාලය ලොග් කිරීමයි 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>)

10
මීට වසර ගණනාවකට පෙර සිට පිළිගත් පිළිතුර සහ එහි පළමු අදහස් දැක්වීම එයයි.
dhag

2

අදහස් දැක්වීමට ප්‍රමාණවත් කීර්තියක් නැත, නමුත් psrecord සඳහා ඔබට එය කෙලින්ම, ක්‍රමලේඛ ආකාරයකින්, කෙලින්ම පයිතන් ලෙස හැඳින්විය හැකිය:

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

2

මම මෙහි ටිකක් ප්‍රමාදයි, නමුත් මම පෙරනිමියෙන් මගේ විධාන රේඛා උපක්‍රමය බෙදා ගන්නෙමි ps

WATCHED_PID=$({ command_to_profile >log.stdout 2>log.stderr & } && echo $!);
while ps -p $WATCHED_PID --no-headers --format "etime pid %cpu %mem rss"; do 
   sleep 1 
done

මම මෙය එක් ලයිනර් ලෙස භාවිතා කරමි. මෙන්න පළමු පේළිය විධානයට වෙඩි තබා PID විචල්යයේ ගබඩා කරයි. එවිට ps විසින් ගත වූ කාලය, PID ප්‍රතිශත CPU භාවිතා කිරීම, ප්‍රතිශත මතකය සහ RSS මතකය මුද්‍රණය කරනු ඇත. ඔබට වෙනත් ක්ෂේත්‍රද එකතු කළ හැකිය.

ක්‍රියාවලිය අවසන් වූ වහාම, psවිධානය "සාර්ථකත්වය" ලබා නොදෙන අතර whileලූපය අවසන් වේ.

ඔබට පැතිකඩ කිරීමට අවශ්‍ය PID දැනටමත් ක්‍රියාත්මක වන්නේ නම් ඔබට පළමු පේළිය නොසලකා හැරිය හැක. අපේක්ෂිත හැඳුනුම්පත විචල්යයේ තබන්න.

ඔබට මේ වගේ ප්‍රතිදානයක් ලැබෙනු ඇත:

  00:00  7805  0.0  0.0  2784
  00:01  7805 99.0  0.8 63876
  00:02  7805 99.5  1.3 104532
  00:03  7805  100  1.6 129876
  00:04  7805  100  2.1 170796
  00:05  7805  100  2.9 234984
  00:06  7805  100  3.7 297552
  00:07  7805  100  4.0 319464
  00:08  7805  100  4.2 337680
  00:09  7805  100  4.5 358800
  00:10  7805  100  4.7 371736
  ....

1

ඔබට එක් ක්‍රියාවලියකට (-p) විකල්පයක් හෝ ඊට අදාළ විකල්පයන් නොමැති කප්පාදු ලිනක්ස් බෙදාහැරීමක් තිබේ නම්, එක් ක්‍රියාවලියකට CPU භාවිත තොරතුරු ලබා ගැනීම සඳහා ඔබේ ක්‍රියාවලි නාමය සඳහා ඉහළ විධානයේ ප්‍රතිදානය විග්‍රහ කළ හැකිය.

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

8 මගේ කාවැද්දූ ලිනක්ස් බෙදාහැරීමේ ඉහළ විධානයේ ප්‍රතිදානයේ එක් ක්‍රියාවලියකට CPU භාවිතය නිරූපණය කරයි


0

නිශ්චිත ක්‍රියාවලියක කාල සීමාවක් සඳහා ඔබට සාමාන්‍යය අවශ්‍ය නම්, ඉහළ සමුච්චිත -c විකල්පය උත්සාහ කරන්න:

top -c a -pid PID

මැක් 10.8.5 සඳහා ඉහළින් "-c a" හමු විය.

විද්‍යාත්මක ලිනක්ස් සඳහා, විකල්පය -S වේ, එය අන්තර්ක්‍රියාකාරීව සැකසිය හැකිය.


topඇත්ත වශයෙන්ම මෙම අංගය සපයන අනුවාදය (ය) පිළිබඳ වැඩිදුර තොරතුරු එක් කිරීමට ඔබට අවශ්‍ය වනු ඇත . ෆෙඩෝරා 19 හි මගේ අනුවාදය නැත. උබුන්ටු 13.04 හි ද එසේමය.
slm

1
ඔයා හරි!, ප්‍රයෝජනවත් දෙයක් සොයා ගැනීම ගැන මම ගොඩක් සතුටු වුනා, මට අමතක වුනා මම ගෙදර මගේ මැක් එකේ හිටියා කියලා.
කීලත්

0
pidstat -p 7994 2 

03:54:43 PM   UID       PID    %usr %system  %guest    %CPU   CPU  Command
03:54:45 PM     0      7994    1.50    1.50    0.00    3.00     1  AliYunDun
03:54:47 PM     0      7994    1.00    1.00    0.00    2.00     0  AliYunDun

සෑම තත්පර 2 කට වරක් මුද්‍රණ ක්‍රියාවලිය 7994 cpu භාවිතය

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.