วิธีการตรวจสอบการใช้งาน CPU / หน่วยความจำของกระบวนการเดียว?


170

ฉันต้องการตรวจสอบการใช้งานหน่วยความจำ / cpu ของกระบวนการแบบเรียลไทม์ คล้ายกับtopแต่กำหนดเป้าหมายเพียงหนึ่งกระบวนการโดยเฉพาะอย่างยิ่งกับกราฟประวัติของบางประเภท


คุณต้องการสถิติหน่วยความจำแบบใด มีจำนวนมาก
vwduder

การใช้หน่วยความจำในกรอบเวลาที่กำหนดการใช้งานปัจจุบันการใช้งานสูงสุดเฉลี่ย
Josh K

คำตอบ:


139

บน Linux topจริง ๆ แล้วสนับสนุนการมุ่งเน้นไปที่กระบวนการเดียวแม้ว่ามันจะไม่มีกราฟประวัติ:

top -p PID

นอกจากนี้ยังมีใน Mac OS X ที่มีไวยากรณ์แตกต่างกัน:

top -pid PID

9
และเนื่องจากคุณอาจไม่ต้องการที่จะมองขึ้น PID top -p `pgrep -f /usr/bin/kvm`ทุกครั้งที่พยายามบางอย่างเช่น
Stefan Lasiewski

ฉันใช้ Cacti เพื่อตรวจสอบกระบวนการบางอย่าง แต่การติดตั้ง Cacti แบบเต็มเป่าฟังดูซับซ้อนเกินไปสำหรับสถานการณ์ง่ายๆที่ถามที่นี่
Stefan Lasiewski

@ สเตฟาน: ฉันคิดว่าฉันจะต้องทำงานแบบนั้นได้จากระยะไกล?
Josh K

@ Josh: ใช่คุณจะต้องเรียกใช้ Cacti (ซึ่งต้องใช้ MySQL, Apache และแพ็คเกจอื่น ๆ ) บนเซิร์ฟเวอร์อื่น ใน distros ส่วนใหญ่มันง่ายในการติดตั้งโดยใช้ Yum หรือ apt-get
Stefan Lasiewski

@Stefan ถ้าคุณต้องการตรวจสอบ remotly คุณสามารถทำ ssh @ remotehost '-p PID> ~ hostname_pid.txt; exit'and
klerk

61

htoptopจะเปลี่ยนที่ดีในการ มันมี ... สี! แป้นพิมพ์ลัดง่าย ๆ ! เลื่อนรายการโดยใช้ปุ่มลูกศร! ฆ่ากระบวนการโดยไม่ทิ้งและไม่จดบันทึก PID! ทำเครื่องหมายกระบวนการหลายอย่างและฆ่าพวกเขาทั้งหมด!

ในบรรดาฟีเจอร์ทั้งหมด manpage บอกว่าคุณสามารถกดFเพื่อติดตามกระบวนการ

htopจริงๆคุณควรลอง ฉันไม่เคยเริ่มต้นอีกครั้งหลังจากที่ครั้งแรกที่ผมใช้tophtop

แสดงกระบวนการเดียว:

htop -p PID


7
+1 สำหรับ htop นี่เป็นหนึ่งในโปรแกรมแรกที่ฉันติดตั้งบนระบบใหม่ มันทำให้ชีวิตของฉันง่ายขึ้นมาก มุมมองต้นไม้ยังมีประโยชน์มาก
บาร์เธเลมี

9
topยังมีสี zกด
tshepang

2
คุณถูก! topมีสี! น่าเสียดายที่สีของมันนั้นค่อนข้างไร้ประโยชน์โดยเฉพาะอย่างยิ่งเมื่อเปรียบเทียบกับhtop(ซึ่งทำให้กระบวนการของผู้ใช้อื่น ๆ จางหายไป
Denilson Sá Maia

1
และhtop -p PIDจะใช้ได้เช่นเดียวกับตัวอย่างที่ได้รับจาก @Michael Mrozek
ส่งเสียงดัง

1
จากนั้นเหตุผลเดียวที่จะใช้งานด้านบนก็เพราะว่า htop ไม่พร้อมใช้งานหรือไม่สามารถติดตั้งได้ นั่นคือเหตุผลที่ htop ถูกสร้างขึ้นเพื่อมอบคุณสมบัติเพิ่มเติมอีกมากมาย
lepe

59

psrecord

ต่อไปนี้ที่อยู่กราฟประวัติศาสตร์ของการจัดเรียงบาง psrecordแพ็คเกจPython ทำสิ่งนี้อย่างแน่นอน

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 เท่านั้นสุ่มตัวอย่าง (บวกบางตัวเลือกที่หลามเฉพาะ) นอกจากนี้ยังสามารถบันทึกกระบวนการด้วยกระบวนการลูก (ดูmprof --help)

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

โดยค่าเริ่มต้นนี้จะปรากฏขึ้นpython-tkสำรวจแผนภูมิTkinter-based ( อาจจำเป็น) ซึ่งสามารถส่งออก:

mprof

Graphite-stack & statsd

มันอาจดูเกินเลยไปสำหรับการทดสอบแบบครั้งเดียวอย่างง่าย ๆ แต่สำหรับบางอย่างเช่นการดีบักหลายวันมันก็สมเหตุสมผล raintank/graphite-stackรูปภาพpsutilและstatsdไคลเอ็นต์all-in-one (จากผู้เขียน Grafana) และ 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.*'

จากนั้นเปิด Grafana ที่http: // localhost: 8080 , การรับรองความถูกต้องเป็นadmin:admin, การตั้งค่าแหล่งข้อมูลhttps: // localhostคุณสามารถลงจุดแผนภูมิเช่น:

กราฟกราฟ

กราไฟท์ - สแต็ค & เทเลกราฟ

แทนที่จะใช้สคริปต์ Python ที่ส่งเมทริกไปยัง Statsd telegraf(และprocstatปลั๊กอินอินพุต) สามารถใช้เพื่อส่งเมทริกไปยัง Graphite ได้โดยตรง

การtelegrafกำหนดค่าน้อยที่สุดดูเหมือนว่า:

[agent]
  interval = "1s"

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

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

telegraf --config minconf.confจากนั้นก็วิ่งเส้น ส่วน Grafana เหมือนกันยกเว้นชื่อตัวชี้วัด

sysdig

sysdig(มีให้ใช้ใน repos ของ Debian และ Ubuntu) พร้อมsysdig-inspect UI ดูมีแนวโน้มมากให้รายละเอียดที่ละเอียดพร้อมกับการใช้ CPU และ RSS แต่น่าเสียดายที่ UI ไม่สามารถแสดงผลได้และsysdig ไม่สามารถกรอง procinfoเหตุการณ์ตามกระบวนการที่ เวลาของการเขียน แม้ว่านี่จะเป็นไปได้ด้วยสิ่วที่กำหนดเอง( sysdigส่วนขยายที่เขียนใน Lua)


pgrep systemd กำลังให้เอาต์พุตหลายบรรทัดและทำให้บั๊ก psrecord ควรทำอย่างไร? ฉันแค่ต้องการทดสอบกับกระบวนการใด ๆ
EralpB

1
@EalpB pgrep --helpเพื่อช่วยเหลือ มีอย่างน้อยและ--newest --oldest
saaj

2
นี่ควรเป็นคำตอบที่ได้รับการยอมรับเนื่องจากเป็นพล็อตประวัติการใช้หน่วยความจำ หมายเหตุสำหรับวิธีCtrl+Cpsrecord ในกระบวนการ psrecord เพียงแค่ออกโดยไม่บันทึกพล็อตคุณจะต้องสิ้นสุดกระบวนการภายใต้การทดสอบ
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

ใช้ like: calcPercCpu.sh 1234โดยที่ 1234 เป็น pid

สำหรับ $ nPid ที่ระบุมันจะวัดค่าเฉลี่ย 10 สแนปชอตของการใช้งาน cpu ทั้งหมด 1 วินาที (หน่วงเวลา 0.1 วินาทีในแต่ละ * nTimes = 10); ที่ให้ผลลัพธ์ที่ดีและรวดเร็วแม่นยำของสิ่งที่เกิดขึ้นในช่วงเวลาที่ดี

ปรับแต่งตัวแปรตามความต้องการของคุณ


อืม, 10 โพรเซสเพื่อตรวจสอบการใช้ cpu ที่ 1?
xebeche

@ xebeche "มันจะวัดค่าเฉลี่ยของ 10 ภาพรวม" "nTimes = 10; # ปรับแต่งมัน" :)
กุมภ์กุมภ์พลัง

ฉันหมายถึงฉันไม่ชอบความจริงที่ว่าคุณเรียก 10 โพรเซสเพื่อเรียก 1 number ( $nPercCpu): shell, top, grep, sed, cut ... bc มีหลายอย่างถ้าไม่ใช่ทุกสิ่งที่คุณสามารถทำได้เช่นผสานเข้ากับ 1 Sed หรือ Awk script
xebeche

@ xebeche ยอดเยี่ยมอย่าลังเลที่จะแก้ไขเพิ่มคำสั่งที่ดีกว่าให้กับคำสั่งที่มีอยู่ (เป็นทางเลือก) คุณมีความอยากรู้ของฉัน :)
Aquarius Power

1
ฉันได้เพิ่มคำตอบของตัวเอง BTW ทราบว่ามีจุดในการคำนวณค่าเฉลี่ยไม่ได้เพราะtopของเอาท์พุทเป็น$delayค่าเฉลี่ยมากกว่า cf เลย วิธีคำนวณการใช้ CPU
xebeche

5

ปกติฉันจะใช้สองสิ่งต่อไปนี้:

  1. HP caliper : เครื่องมือที่ดีมากสำหรับกระบวนการตรวจสอบคุณสามารถตรวจสอบกราฟการโทรและข้อมูลระดับต่ำอื่น ๆ ได้ แต่โปรดทราบว่ามันฟรีสำหรับการใช้งานส่วนตัวเท่านั้น

  2. daemontools : ชุดเครื่องมือสำหรับการจัดการบริการ UNIX


6
ฉันใช้ daemontools เป็นเวลาหลายปี มันยอดเยี่ยมมากในฐานะหัวหน้างาน / สุนัขเฝ้าบ้านสำหรับกระบวนการอื่น ๆ มันช่วยคุณตรวจสอบการใช้งาน CPU / หน่วยความจำสำหรับกระบวนการเดียวได้อย่างไร?
Stefan Lasiewski

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
นั่นเป็นสิ่งที่คำตอบที่ได้รับการยอมรับจากหลายปีที่ผ่านมาและความคิดเห็นแรกของมันบอกว่า
dhag

1

หากคุณมีการกระจายลีนุกซ์แบบ cut-down โดยที่ด้านบนไม่มีตัวเลือกต่อกระบวนการ (-p) หรือตัวเลือกที่เกี่ยวข้องคุณสามารถแยกเอาต์พุตของคำสั่งด้านบนสำหรับชื่อกระบวนการของคุณเพื่อรับข้อมูลการใช้งาน CPU ต่อกระบวนการ

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

8 หมายถึงการใช้งาน CPU ต่อกระบวนการในผลลัพธ์ของคำสั่งด้านบนในการกระจาย Linux ที่ฝังอยู่


1

ชื่อเสียงไม่เพียงพอที่จะแสดงความคิดเห็น แต่สำหรับ psrecord คุณสามารถเรียกมันโดยตรงในรูปแบบการเขียนโปรแกรมโดยตรงใน Python:

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

0

หากคุณต้องการค่าเฉลี่ยในช่วงระยะเวลาหนึ่งของกระบวนการเฉพาะลองตัวเลือกการสะสม -c ด้านบน:

top -c a -pid PID

พบ "-c a" ด้านบนสุดสำหรับ Mac 10.8.5

สำหรับ Scientific Linux ตัวเลือกคือ -S ซึ่งสามารถตั้งค่าแบบโต้ตอบ


คุณอาจต้องการเพิ่มรายละเอียดเพิ่มเติมเกี่ยวกับเวอร์ชันของtopคุณสมบัตินี้ เวอร์ชั่นของฉันใน Fedora 19 ไม่ได้ เหมือนกันบน Ubuntu 13.04
slm

คุณพูดถูกฉันมีความสุขที่ได้พบบางสิ่งที่มีประโยชน์ฉันลืมว่าฉันใช้แม็คที่บ้าน
Kieleth
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.