ฉันต้องการตรวจสอบการใช้งานหน่วยความจำ / cpu ของกระบวนการแบบเรียลไทม์ คล้ายกับtop
แต่กำหนดเป้าหมายเพียงหนึ่งกระบวนการโดยเฉพาะอย่างยิ่งกับกราฟประวัติของบางประเภท
ฉันต้องการตรวจสอบการใช้งานหน่วยความจำ / cpu ของกระบวนการแบบเรียลไทม์ คล้ายกับtop
แต่กำหนดเป้าหมายเพียงหนึ่งกระบวนการโดยเฉพาะอย่างยิ่งกับกราฟประวัติของบางประเภท
คำตอบ:
บน Linux top
จริง ๆ แล้วสนับสนุนการมุ่งเน้นไปที่กระบวนการเดียวแม้ว่ามันจะไม่มีกราฟประวัติ:
top -p PID
นอกจากนี้ยังมีใน Mac OS X ที่มีไวยากรณ์แตกต่างกัน:
top -pid PID
top -p `pgrep -f /usr/bin/kvm`
ทุกครั้งที่พยายามบางอย่างเช่น
hostname
_pid.txt; exit'and
htop
top
จะเปลี่ยนที่ดีในการ มันมี ... สี! แป้นพิมพ์ลัดง่าย ๆ ! เลื่อนรายการโดยใช้ปุ่มลูกศร! ฆ่ากระบวนการโดยไม่ทิ้งและไม่จดบันทึก PID! ทำเครื่องหมายกระบวนการหลายอย่างและฆ่าพวกเขาทั้งหมด!
ในบรรดาฟีเจอร์ทั้งหมด manpage บอกว่าคุณสามารถกดFเพื่อติดตามกระบวนการ
htop
จริงๆคุณควรลอง ฉันไม่เคยเริ่มต้นอีกครั้งหลังจากที่ครั้งแรกที่ผมใช้top
htop
แสดงกระบวนการเดียว:
htop -p PID
top
ยังมีสี z
กด
top
มีสี! น่าเสียดายที่สีของมันนั้นค่อนข้างไร้ประโยชน์โดยเฉพาะอย่างยิ่งเมื่อเปรียบเทียบกับhtop
(ซึ่งทำให้กระบวนการของผู้ใช้อื่น ๆ จางหายไป
htop -p PID
จะใช้ได้เช่นเดียวกับตัวอย่างที่ได้รับจาก @Michael Mrozek
ต่อไปนี้ที่อยู่กราฟประวัติศาสตร์ของการจัดเรียงบาง 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'
แพคเกจให้ RSS เท่านั้นสุ่มตัวอย่าง (บวกบางตัวเลือกที่หลามเฉพาะ) นอกจากนี้ยังสามารถบันทึกกระบวนการด้วยกระบวนการลูก (ดูmprof --help
)
pip install memory_profiler
mprof run /path/to/executable
mprof plot
โดยค่าเริ่มต้นนี้จะปรากฏขึ้นpython-tk
สำรวจแผนภูมิTkinter-based ( อาจจำเป็น) ซึ่งสามารถส่งออก:
มันอาจดูเกินเลยไปสำหรับการทดสอบแบบครั้งเดียวอย่างง่าย ๆ แต่สำหรับบางอย่างเช่นการดีบักหลายวันมันก็สมเหตุสมผล 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
(มีให้ใช้ใน repos ของ Debian และ Ubuntu) พร้อมsysdig-inspect UI ดูมีแนวโน้มมากให้รายละเอียดที่ละเอียดพร้อมกับการใช้ CPU และ RSS แต่น่าเสียดายที่ UI ไม่สามารถแสดงผลได้และsysdig
ไม่สามารถกรอง procinfo
เหตุการณ์ตามกระบวนการที่ เวลาของการเขียน แม้ว่านี่จะเป็นไปได้ด้วยสิ่วที่กำหนดเอง( sysdig
ส่วนขยายที่เขียนใน Lua)
pgrep --help
เพื่อช่วยเหลือ มีอย่างน้อยและ--newest
--oldest
Ctrl+C
psrecord ในกระบวนการ psrecord เพียงแค่ออกโดยไม่บันทึกพล็อตคุณจะต้องสิ้นสุดกระบวนการภายใต้การทดสอบ
หากต้องการใช้ข้อมูลนั้นกับสคริปต์คุณสามารถทำได้:
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); ที่ให้ผลลัพธ์ที่ดีและรวดเร็วแม่นยำของสิ่งที่เกิดขึ้นในช่วงเวลาที่ดี
ปรับแต่งตัวแปรตามความต้องการของคุณ
$nPercCpu
): shell, top, grep, sed, cut ... bc มีหลายอย่างถ้าไม่ใช่ทุกสิ่งที่คุณสามารถทำได้เช่นผสานเข้ากับ 1 Sed หรือ Awk script
top
ของเอาท์พุทเป็น$delay
ค่าเฉลี่ยมากกว่า cf เลย วิธีคำนวณการใช้ CPU
ปกติฉันจะใช้สองสิ่งต่อไปนี้:
HP caliper : เครื่องมือที่ดีมากสำหรับกระบวนการตรวจสอบคุณสามารถตรวจสอบกราฟการโทรและข้อมูลระดับต่ำอื่น ๆ ได้ แต่โปรดทราบว่ามันฟรีสำหรับการใช้งานส่วนตัวเท่านั้น
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>)
หากคุณมีการกระจายลีนุกซ์แบบ cut-down โดยที่ด้านบนไม่มีตัวเลือกต่อกระบวนการ (-p) หรือตัวเลือกที่เกี่ยวข้องคุณสามารถแยกเอาต์พุตของคำสั่งด้านบนสำหรับชื่อกระบวนการของคุณเพื่อรับข้อมูลการใช้งาน CPU ต่อกระบวนการ
while true; do top -bn1 | awk '/your_process_name/ {print $8}' ; sleep 1; done
8 หมายถึงการใช้งาน CPU ต่อกระบวนการในผลลัพธ์ของคำสั่งด้านบนในการกระจาย Linux ที่ฝังอยู่
ชื่อเสียงไม่เพียงพอที่จะแสดงความคิดเห็น แต่สำหรับ psrecord คุณสามารถเรียกมันโดยตรงในรูปแบบการเขียนโปรแกรมโดยตรงใน Python:
from psrecord.main import monitor
monitor(<pid number>, logfile = "./test.log", plot="./fig.png", include_children=True)
หากคุณต้องการค่าเฉลี่ยในช่วงระยะเวลาหนึ่งของกระบวนการเฉพาะลองตัวเลือกการสะสม -c ด้านบน:
top -c a -pid PID
พบ "-c a" ด้านบนสุดสำหรับ Mac 10.8.5
สำหรับ Scientific Linux ตัวเลือกคือ -S ซึ่งสามารถตั้งค่าแบบโต้ตอบ
top
คุณสมบัตินี้ เวอร์ชั่นของฉันใน Fedora 19 ไม่ได้ เหมือนกันบน Ubuntu 13.04