ฉันต้องการรับ CPU และการใช้หน่วยความจำของกระบวนการเดียวบน Linux - ฉันรู้จัก PID หวังว่าฉันจะได้รับทุก ๆ วินาทีและเขียนลงใน CSV โดยใช้คำสั่ง 'เฝ้าดู' ฉันสามารถใช้คำสั่งใดเพื่อรับข้อมูลนี้จากบรรทัดคำสั่ง Linux
ฉันต้องการรับ CPU และการใช้หน่วยความจำของกระบวนการเดียวบน Linux - ฉันรู้จัก PID หวังว่าฉันจะได้รับทุก ๆ วินาทีและเขียนลงใน CSV โดยใช้คำสั่ง 'เฝ้าดู' ฉันสามารถใช้คำสั่งใดเพื่อรับข้อมูลนี้จากบรรทัดคำสั่ง Linux
คำตอบ:
ps -p <pid> -o %cpu,%mem,cmd
(คุณสามารถละทิ้ง "cmd" แต่นั่นอาจเป็นประโยชน์ในการดีบัก)
โปรดทราบว่านี่จะให้การใช้งาน CPU โดยเฉลี่ยของกระบวนการตลอดเวลาที่ใช้งานอยู่
| tail -n +2
ps
) นี่ไม่ใช่การใช้งาน CPU แบบเรียลไทม์ นอกจากนี้ยังอาจแตกต่างจากสิ่งที่top
แสดงตัวอย่างเช่น
ps -e -o pcpu,args
จะแสดงซีพียูเฉลี่ยตลอดอายุการใช้งานของกระบวนการซึ่งเห็นได้ชัดว่าไม่ใช่สิ่งที่คุณต้องการถ้ามันเป็นกระบวนการที่ใช้เวลานาน
ตัวแปรของคำตอบของร้านกาแฟ :
top -p <pid>
วิธีนี้จะรีเฟรชการใช้งาน CPU โดยอัตโนมัติดังนั้นจึงเป็นการดีสำหรับการตรวจสอบ
pgrep
:top -p $(pgrep process_name)
คุณสามารถรับผลลัพธ์ตามชื่อของกระบวนการที่ใช้
ps -C chrome -o %cpu,%mem,cmd
-C
ตัวเลือกที่ช่วยให้คุณใช้ชื่อกระบวนการโดยไม่ทราบว่ามัน pid
pid
ควรทำงานได้ ps -C chrome -o pid,%cpu,%mem,cmd
ใช้ pidstat (จาก sysstat - ลิงก์อ้างอิง )
เช่นเพื่อตรวจสอบ ID กระบวนการทั้งสองนี้ (12345 และ 11223) ทุก ๆ 5 วินาทีใช้
$ pidstat -h -r -u -v -p 12345,11223 5
pidstat
ว่าเป็นคำสั่งที่ยอดเยี่ยมและมีประโยชน์สำหรับการเขียนสคริปต์เช่นกัน!
pidstat
ยังให้ค่าเฉลี่ยที่ดี เป็นเพียงความอัปยศฉันไม่ได้พบวิธีที่สง่างามมากขึ้นpidstat -u 1 10 | grep ^Average | sort -r -n -b -k 8,8
ps
คำสั่ง (ไม่ควรใช้):
top
คำสั่ง (ควรใช้):
ใช้top
เพื่อรับการใช้ CPU แบบเรียลไทม์ (ช่วงเวลาสั้น ๆ ในปัจจุบัน):
top -b -n 2 -d 0.2 -p 6962 | tail -1 | awk '{print $9}'
จะสะท้อนเช่น: 78.6
-b
: โหมดแบทช์-n 2
: Number-of-iterations ใช้2
เนื่องจาก: เมื่อคุณเรียกใช้ครั้งแรกมันไม่มีตัวอย่างก่อนหน้าที่จะเปรียบเทียบดังนั้นค่าเริ่มต้นเหล่านี้จึงเป็นเปอร์เซ็นต์ตั้งแต่บู๊ต-d 0.2
: หน่วงเวลา (ในวินาทีนี่คือ 200ms)-p 6962
: จอภาพ -PIDtail -1
: แถวสุดท้ายawk '{print $9}'
: คอลัมน์ที่ 9 (หมายเลขการใช้ cpu)เปิดโปรแกรมและตรวจสอบ
แบบฟอร์มนี้มีประโยชน์หากคุณต้องการเปรียบเทียบการปฏิบัติการได้อย่างง่ายดาย:
topp() (
$* &>/dev/null &
pid="$!"
trap ':' INT
echo 'CPU MEM'
while sleep 1; do ps --no-headers -o '%cpu,%mem' -p "$pid"; done
kill "$pid"
)
topp ./myprog arg1 arg2
ตอนนี้เมื่อคุณกด Ctrl + C โปรแกรมจะออกจากโปรแกรมและหยุดการตรวจสอบ ตัวอย่างผลลัพธ์:
CPU MEM
20.0 1.3
35.0 1.3
40.0 1.3
ที่เกี่ยวข้อง: /unix/554/how-to-monitor-cpu-memory-usage-of-a-single-process
ทดสอบกับ Ubuntu 16.04
คุณสามารถใช้top -b
และ grep out pid ที่คุณต้องการ (ด้วยการ-b
ตั้งค่าสถานะด้านบนในโหมดแบทช์) หรือใช้การ-p
ตั้งค่าสถานะและระบุ pid โดยไม่ต้องใช้ grep
ตามที่แสดงความคิดเห็นในคำตอบของ cafข้างต้น ps และในบางกรณี pidstat จะให้ค่าเฉลี่ยตลอดอายุการใช้งานของ pCPU เพื่อให้ได้ผลลัพธ์ที่แม่นยำยิ่งขึ้นให้ใช้ top หากคุณจำเป็นต้องเรียกใช้บนสุดเมื่อคุณสามารถเรียกใช้:
top -b -n 1 -p <PID>
หรือสำหรับประมวลผลข้อมูลและส่วนหัวเท่านั้น:
top -b -n 1 -p <PID> | tail -3 | head -2
ไม่มีส่วนหัว:
top -b -n 1 -p <PID> | tail -2 | head -1
ps aux | awk '{print $4"\t"$11}' | sort | uniq -c | awk '{print $2" "$1" "$3}' | sort -nr
หรือต่อกระบวนการ
ps aux | awk '{print $4"\t"$11}' | sort | uniq -c | awk '{print $2" "$1" "$3}' | sort -nr |grep mysql
ps aux|awk '{print $2,$3,$4}'|grep PID
โดยที่คอลัมน์แรกคือ PID การใช้งาน CPU คอลัมน์ที่สองการใช้หน่วยความจำคอลัมน์ที่สาม
ps axo pid,etime,%cpu,%mem,cmd | grep 'processname' | grep -v grep
PID - ID กระบวนการ
etime - กระบวนการทำงาน / ช่วงเวลาสด
% cpu - การใช้งาน CPU
% mem - การใช้งานหน่วยความจำ
cmd - คำสั่ง
แทนที่ชื่อกระบวนการด้วยกระบวนการใดก็ตามที่คุณต้องการติดตาม mysql nginx php-fpm ฯลฯ ...
คำตอบทั้งหมดที่นี่แสดงเฉพาะเปอร์เซ็นต์หน่วยความจำสำหรับ PID
นี่คือตัวอย่างของวิธีการใช้หน่วยความจำ rss เป็น KB สำหรับกระบวนการ apache ทั้งหมดแทนที่ "grep apache" ด้วย "grep PID" หากคุณต้องการดู PID เฉพาะ:
watch -n5 "ps aux -y | grep apache | awk '{print \$2,\$6}'"
ภาพพิมพ์นี้:
Every 5.0s: ps aux -y | grep apache | awk '{print $2,$6}'
Thu Jan 25 15:44:13 2018
12588 9328
12589 8700
12590 9392
12591 9340
12592 8700
12811 15200
15453 9340
15693 3800
15694 2352
15695 1352
15697 948
22896 9360
ด้วย CPU%:
watch -n5 "ps aux -y | grep apache | awk '{print \$2,\$3,\$6}'"
เอาท์พุท:
Every 5.0s: ps aux -y | grep apache | awk '{print $2,$3,$6}'
Thu Jan 25 15:46:00 2018
12588 0.0 9328
12589 0.0 8700
12590 0.0 9392
12591 0.0 9340
12592 0.0 8700
12811 0.0 15200
15453 0.0 9340
15778 0.0 3800
15779 0.0 2352
15780 0.0 1348
15782 0.0 948
22896 0.0 9360
สำหรับผู้ที่ดิ้นรนซักพักสงสัยว่าทำไมคำตอบที่เลือกไม่ได้ผล:
ps -p <pid> -o %cpu,%mem
ไม่มีช่องว่าง ibetween และ%cpu,
%mem
นี่เป็นเคล็ดลับที่ดีในการติดตามหนึ่งหรือหลายโปรแกรมแบบเรียลไทม์ในขณะที่ดูผลลัพธ์ของเครื่องมืออื่น ๆ :
watch "top -bn1 -p$(pidof foo),$(pidof bar); tool"
คำสั่งต่อไปนี้รับค่าเฉลี่ยของการใช้ CPU และหน่วยความจำทุก 40 วินาทีสำหรับกระบวนการเฉพาะ (pid)
pidstat 40 -ru -p <pid>
เอาต์พุตสำหรับเคสของฉัน (สองบรรทัดแรกสำหรับการใช้ CPU, สองบรรทัดสำหรับหน่วยความจำ):
02:15:07 PM PID %usr %system %guest %CPU CPU Command
02:15:47 PM 24563 0.65 0.07 0.00 0.73 3 java
02:15:07 PM PID minflt/s majflt/s VSZ RSS %MEM Command
02:15:47 PM 24563 6.95 0.00 13047972 2123268 6.52 java
(หากคุณอยู่ใน MacOS 10.10 ให้ลองใช้ตัวเลือกแบบสะสม -c ด้านบน:
top -c a -pid PID
(ตัวเลือกนี้ไม่สามารถใช้งานได้ใน linux อื่นลองกับ Scientific Linux el6 และ RHEL6)
รายการด้านบน cpu ด้านบนและกระบวนการใช้หน่วยความจำ
ps axo %cpu,%mem,command | sort -nr | head
ตามคำตอบของ @ caf นี่ทำงานได้ดีสำหรับฉัน
คำนวณค่าเฉลี่ยของ PID ที่ระบุ:
measure.sh
times=100
total=0
for i in $(seq 1 $times)
do
OUTPUT=$(top -b -n 1 -d 0.1 -p $1 | tail -1 | awk '{print $9}')
echo -n "$i time: ${OUTPUT}"\\r
total=`echo "$total + $OUTPUT" | bc -l`
done
#echo "Average: $total / $times" | bc
average=`echo "scale=2; $total / $times" | bc`
echo "Average: $average"
การใช้งาน:
# send PID as argument
sh measure.sh 3282
การใช้ CPU และหน่วยความจำของกระบวนการเดียวบน Linux หรือคุณสามารถรับ 10 cpu ที่ใช้ในกระบวนการโดยใช้คำสั่งด้านล่าง
ps -aux --sort -pcpu | หัว -n 11