ดึงการใช้งาน CPU และการใช้หน่วยความจำของกระบวนการเดียวบน Linux?


165

ฉันต้องการรับ CPU และการใช้หน่วยความจำของกระบวนการเดียวบน Linux - ฉันรู้จัก PID หวังว่าฉันจะได้รับทุก ๆ วินาทีและเขียนลงใน CSV โดยใช้คำสั่ง 'เฝ้าดู' ฉันสามารถใช้คำสั่งใดเพื่อรับข้อมูลนี้จากบรรทัดคำสั่ง Linux


11
เป็นของ SuperUser
ริชาร์ด

เราสามารถใช้ gdb เพื่อโทรหา getpid และ top -p <that pid> ได้ไหม?
mja

คำตอบ:


226
ps -p <pid> -o %cpu,%mem,cmd

(คุณสามารถละทิ้ง "cmd" แต่นั่นอาจเป็นประโยชน์ในการดีบัก)

โปรดทราบว่านี่จะให้การใช้งาน CPU โดยเฉลี่ยของกระบวนการตลอดเวลาที่ใช้งานอยู่


6
สมมุติว่าหากคุณสนใจการใช้หน่วยความจำของกระบวนการเดียวเพียงพอที่จะตรวจสอบได้เช่นนี้มันใช้หน่วยความจำจำนวนมากเพื่อที่ว่าคู่ของเมกะไบต์พิเศษเนื่องจากการแมปที่ใช้ร่วมกันจะไม่เป็นปัญหา
caf

5
@ Chaitanya: ท่อผ่าน| tail -n +2
caf

11
หรือคุณสามารถใช้ --noheader
hexacyanide

45
โปรดทราบว่า% cpu "คือเวลา CPU ที่ใช้หารด้วยเวลาที่กระบวนการทำงาน (อัตราส่วน cputime / realtime) ซึ่งแสดงเป็นเปอร์เซ็นต์" (ดู manpage of ps) นี่ไม่ใช่การใช้งาน CPU แบบเรียลไทม์ นอกจากนี้ยังอาจแตกต่างจากสิ่งที่topแสดงตัวอย่างเช่น
xebeche

12
ดังที่กล่าวจาก Xebeche ด้านบนps -e -o pcpu,argsจะแสดงซีพียูเฉลี่ยตลอดอายุการใช้งานของกระบวนการซึ่งเห็นได้ชัดว่าไม่ใช่สิ่งที่คุณต้องการถ้ามันเป็นกระบวนการที่ใช้เวลานาน
Alex F


37

คุณสามารถรับผลลัพธ์ตามชื่อของกระบวนการที่ใช้

ps -C chrome -o %cpu,%mem,cmd

-Cตัวเลือกที่ช่วยให้คุณใช้ชื่อกระบวนการโดยไม่ทราบว่ามัน pid


วิธีการรวมยัง de pid? ฉันได้ลอง% pid $ PID pid, PID โดยไม่มีโชค
Arnold Roa

@ArnoldRoa pidควรทำงานได้ ps -C chrome -o pid,%cpu,%mem,cmd
มูฮัมหมัด Taha

28

ใช้ pidstat (จาก sysstat - ลิงก์อ้างอิง )

เช่นเพื่อตรวจสอบ ID กระบวนการทั้งสองนี้ (12345 และ 11223) ทุก ๆ 5 วินาทีใช้

$ pidstat -h -r -u -v -p 12345,11223 5

2
ขอบคุณสำหรับการชี้ให้เห็นpidstatว่าเป็นคำสั่งที่ยอดเยี่ยมและมีประโยชน์สำหรับการเขียนสคริปต์เช่นกัน!
fduff

pidstatยังให้ค่าเฉลี่ยที่ดี เป็นเพียงความอัปยศฉันไม่ได้พบวิธีที่สง่างามมากขึ้นpidstat -u 1 10 | grep ^Average | sort -r -n -b -k 8,8
เหนือ

24

ps คำสั่ง (ไม่ควรใช้):

top คำสั่ง (ควรใช้):

ใช้topเพื่อรับการใช้ CPU แบบเรียลไทม์ (ช่วงเวลาสั้น ๆ ในปัจจุบัน):

top -b -n 2 -d 0.2 -p 6962 | tail -1 | awk '{print $9}'

จะสะท้อนเช่น: 78.6


นี่เป็นคำตอบที่ถูกต้องที่สุดในการรับการใช้งาน CPU ในปัจจุบันไม่ใช่ค่าเฉลี่ยตลอดอายุการใช้งานของกระบวนการ
Ted Feng

15

เปิดโปรแกรมและตรวจสอบ

แบบฟอร์มนี้มีประโยชน์หากคุณต้องการเปรียบเทียบการปฏิบัติการได้อย่างง่ายดาย:

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


5

คุณสามารถใช้top -bและ grep out pid ที่คุณต้องการ (ด้วยการ-bตั้งค่าสถานะด้านบนในโหมดแบทช์) หรือใช้การ-pตั้งค่าสถานะและระบุ pid โดยไม่ต้องใช้ grep


5

ตามที่แสดงความคิดเห็นในคำตอบของ 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

3
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

1

ในการรับการใช้งานหน่วยความจำเพียงแอปพลิเคชันของคุณ (ซึ่งตรงข้ามกับไลบรารีที่ใช้ร่วมกันคุณต้องใช้ส่วนต่อประสาน Linux smaps) คำตอบนี้จะอธิบายได้ดี


1
ps aux|awk  '{print $2,$3,$4}'|grep PID

โดยที่คอลัมน์แรกคือ PID การใช้งาน CPU คอลัมน์ที่สองการใช้หน่วยความจำคอลัมน์ที่สาม


1
ps axo pid,etime,%cpu,%mem,cmd | grep 'processname' | grep -v grep

PID - ID กระบวนการ

etime - กระบวนการทำงาน / ช่วงเวลาสด

% cpu - การใช้งาน CPU

% mem - การใช้งานหน่วยความจำ

cmd - คำสั่ง

แทนที่ชื่อกระบวนการด้วยกระบวนการใดก็ตามที่คุณต้องการติดตาม mysql nginx php-fpm ฯลฯ ...


1

คำตอบทั้งหมดที่นี่แสดงเฉพาะเปอร์เซ็นต์หน่วยความจำสำหรับ 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

1

สำหรับผู้ที่ดิ้นรนซักพักสงสัยว่าทำไมคำตอบที่เลือกไม่ได้ผล:

ps -p <pid> -o %cpu,%mem

ไม่มีช่องว่าง ibetween และ%cpu,%mem


1

นี่เป็นเคล็ดลับที่ดีในการติดตามหนึ่งหรือหลายโปรแกรมแบบเรียลไทม์ในขณะที่ดูผลลัพธ์ของเครื่องมืออื่น ๆ : watch "top -bn1 -p$(pidof foo),$(pidof bar); tool"


1

คำสั่งต่อไปนี้รับค่าเฉลี่ยของการใช้ 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

0

(หากคุณอยู่ใน MacOS 10.10 ให้ลองใช้ตัวเลือกแบบสะสม -c ด้านบน:

top -c a -pid PID

(ตัวเลือกนี้ไม่สามารถใช้งานได้ใน linux อื่นลองกับ Scientific Linux el6 และ RHEL6)


0

รายการด้านบน cpu ด้านบนและกระบวนการใช้หน่วยความจำ

        ps axo %cpu,%mem,command | sort -nr | head

0

ตามคำตอบของ @ 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

-2

การใช้ CPU และหน่วยความจำของกระบวนการเดียวบน Linux หรือคุณสามารถรับ 10 cpu ที่ใช้ในกระบวนการโดยใช้คำสั่งด้านล่าง

ps -aux --sort -pcpu | หัว -n 11

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