ฉันจะวัดการใช้งานแกน CPU แยกกันสำหรับกระบวนการได้อย่างไร


115

มีวิธีใดในการวัดการใช้งาน CPU ของกระบวนการเฉพาะตามคอร์หรือไม่?

ฉันรู้ว่าด้านบนดีสำหรับการวัดการใช้งาน CPU ของระบบทั้งหมดโดยคอร์และชุดงานสามารถให้ข้อมูลเกี่ยวกับแกน CPU ที่ได้รับอนุญาตให้กระบวนการทำงานได้

แต่ฉันจะวัดการใช้งาน CPU ของกระบวนการเฉพาะตามแกน CPU ได้อย่างไร

คำตอบ:


139

คุณยังสามารถทำได้ในอันดับต้นๆ ในขณะที่ด้านบนกำลังทำงานให้กด '1' บนแป้นพิมพ์ของคุณจากนั้นจะแสดงการใช้งาน CPU ต่อคอร์

จำกัด กระบวนการที่แสดงโดยให้กระบวนการเฉพาะนั้นทำงานภายใต้บัญชีผู้ใช้เฉพาะและใช้ประเภท 'u' เพื่อ จำกัด เฉพาะผู้ใช้นั้น


3
คุณยังสามารถกดIเพื่อสลับโหมด Irix (ซึ่งตรงข้ามกับโหมด Solaris ) เมื่อonร้อยละที่ปรากฏในรายการกระบวนการนี้เทียบกับด้าย CPU เมื่อoffเปอร์เซ็นต์ดังกล่าวแสดงค่อนข้างตรงกับความจุโดยรวมของ CPU (เช่นเธรดทั้งหมด - หรือที่เรียกว่าคอร์ทั้งหมด)
7heo.tk

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

เราจะส่ง "1" เป็นอาร์กิวเมนต์ไปได้topอย่างไรmanเพจบอกtop -1แต่บ่น! จะเป็นการดีที่จะได้top -1 -n 1รับการทำซ้ำเพียงครั้งเดียวtopแต่มีการแสดงการใช้งาน CPU แยกต่างหาก
quanta

76

คุณสามารถใช้ได้:

 mpstat -P ALL 1

มันแสดงให้เห็นว่าแต่ละคอร์ยุ่งมากแค่ไหนและจะอัปเดตอัตโนมัติในแต่ละวินาที ผลลัพธ์จะเป็นแบบนี้ (บนโปรเซสเซอร์ Quad-Core):

10:54:41 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
10:54:42 PM  all    8.20    0.12    0.75    0.00    0.00    0.00    0.00    0.00   90.93
10:54:42 PM    0   24.00    0.00    2.00    0.00    0.00    0.00    0.00    0.00   74.00
10:54:42 PM    1   22.00    0.00    2.00    0.00    0.00    0.00    0.00    0.00   76.00
10:54:42 PM    2    2.02    1.01    0.00    0.00    0.00    0.00    0.00    0.00   96.97
10:54:42 PM    3    2.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00   98.00
10:54:42 PM    4   14.15    0.00    1.89    0.00    0.00    0.00    0.00    0.00   83.96
10:54:42 PM    5    1.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00   99.00
10:54:42 PM    6    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
10:54:42 PM    7    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00

คำสั่งนี้ไม่ตอบคำถามเดิมแม้ว่าจะไม่แสดงการใช้งาน CPU core สำหรับกระบวนการเฉพาะ


3
ฉันคิดว่านี่ไม่สามารถตอบคำถามได้อย่างแท้จริง นี่เป็นเพียงสิ่งเดียวกันหากไม่มีกระบวนการอื่น ๆ กำลังทำงานอยู่ นอกจากนี้สิ่งนี้ดูเหมือนจะไม่ใช่ซีพียูแบบควอดคอร์เหมือนแปดคอร์ (อาจเป็นรูปสี่เหลี่ยมที่เปิดใช้งาน HT)
สุกร

1
เป็น Quad Core ที่เปิดใช้งาน HT
Kamran Bigdely

ไม่ตอบคำถามเดิม อย่างไรก็ตามสำหรับการไม่พูดถึงมัน (-1) จากฉัน
KGhatak

1
ฉันเห็นด้วยกับ @KGhatak นี้ไม่ได้ตอบคำถามเดิม -1
jodag

41

คุณสามารถใช้ps.
เช่นมีกระบวนการ python ที่มีเธรดไม่ว่างสองเธรดบน CPU ดูอัลคอร์:

$ ps -p 29492 -L -o pid,tid,psr,pcpu
  PID   TID PSR %CPU
29492 29492   1  0.0
29492 29493   1 48.7
29492 29494   1 51.9

(PSR คือรหัส CPU ที่เธรดถูกกำหนดให้ในปัจจุบัน)

คุณจะเห็นว่าเธรดกำลังทำงานบนแกน cpu เดียวกัน (เพราะ GIL)

เรียกใช้สคริปต์ python เดียวกันใน jython เราเห็นว่าสคริปต์ใช้ทั้งสองคอร์ (และมีบริการอื่น ๆ อีกมากมายหรือเธรดใด ๆ ซึ่งเกือบจะไม่ได้ใช้งาน):

$ ps -p 28671 -L -o pid,tid,psr,pcpu
  PID   TID PSR %CPU
28671 28671   1  0.0
28671 28672   0  4.4
28671 28673   0  0.6
28671 28674   0  0.5
28671 28675   0  2.3
28671 28676   0  0.0
28671 28677   1  0.0
28671 28678   1  0.0
28671 28679   0  4.6
28671 28680   0  4.4
28671 28681   1  0.0
28671 28682   1  0.0
28671 28721   1  0.0
28671 28729   0 88.6
28671 28730   1 88.5

คุณสามารถประมวลผลเอาต์พุตและคำนวณ CPU ทั้งหมดสำหรับแกน CPU แต่ละตัว

น่าเสียดายที่วิธีนี้ดูเหมือนจะไม่น่าเชื่อถือ 100% บางครั้งฉันเห็นว่าในกรณีแรกเธรดการทำงานสองเธรดถูกรายงานว่าแยกจากกันไปยังคอร์ CPU แต่ละคอร์หรือในกรณีหลังมีรายงานว่าเธรดสองเธรดเปิดอยู่ แก่นเดียวกัน ..


13

htop ให้ภาพรวมที่ดีของการใช้งานหลักของแต่ละบุคคล


4

การpsแก้ปัญหาเกือบจะเป็นสิ่งที่ฉันต้องการและด้วยการทุบตีบางอย่างก็ทำตามที่คำถามเดิมถาม: เพื่อดูการใช้งานต่อคอร์ของกระบวนการเฉพาะ

นี่แสดงการใช้งานต่อคอร์ของกระบวนการมัลติเธรดด้วย

ใช้เช่น: cpustat `pgrep processname`` pgrep otherprocessname` ...

#!/bin/bash

pids=()
while [ $# != 0 ]; do
        pids=("${pids[@]}" "$1")
        shift
done

if [ -z "${pids[0]}" ]; then
        echo "Usage: $0 <pid1> [pid2] ..."
        exit 1
fi

for pid in "${pids[@]}"; do
        if [ ! -e /proc/$pid ]; then
                echo "Error: pid $pid doesn't exist"
                exit 1
        fi
done

while [ true ]; do
        echo -e "\033[H\033[J"
        for pid in "${pids[@]}"; do
                ps -p $pid -L -o pid,tid,psr,pcpu,comm=
        done
        sleep 1
done

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


คุณสามารถใช้ฟังก์ชัน C lib read () และ open () เพื่อเปิดไฟล์หลอกที่ / proc / pid / * และแยกวิเคราะห์ข้อมูลที่คุณต้องการ
GL2014

2
dstat -C 0,1,2,3 

จะให้การใช้งาน CPU ของ 4 คอร์แรกด้วย แน่นอนถ้าคุณมี 32 คอร์คำสั่งนี้จะยาวขึ้นเล็กน้อย แต่มีประโยชน์ถ้าคุณสนใจแค่ไม่กี่คอร์

ตัวอย่างเช่นหากคุณสนใจเฉพาะแกน 3 และ 7 คุณสามารถทำได้

dstat -C 3,7

สิ่งนี้จะเกี่ยวข้องกับกระบวนการเดียวอย่างไร?
einpoklum

1

ฉันมีเพียงปัญหานี้และผมพบคำตอบที่คล้ายกันที่นี่

วิธีการคือตั้งค่าtopในแบบที่คุณต้องการจากนั้นกดW(ตัวพิมพ์ใหญ่ W) ซึ่งจะบันทึกtopเค้าโครงปัจจุบันของไฟล์การกำหนดค่าใน $ HOME / .toprc

แม้ว่าสิ่งนี้อาจไม่ได้ผลหากคุณต้องการเรียกใช้หลายรายการtopด้วยการกำหนดค่าที่แตกต่างกัน

ดังนั้นด้วยสิ่งที่ฉันพิจารณาวิธีแก้ปัญหาคุณสามารถเขียนไปยังไฟล์กำหนดค่าต่างๆ / ใช้ไฟล์กำหนดค่าที่แตกต่างกันโดยทำอย่างใดอย่างหนึ่งต่อไปนี้ ...

1) เปลี่ยนชื่อไบนารี

  ln -s /usr/bin/top top2
  ./top2

ตอนนี้.top2rcกำลังจะเขียนถึง $ HOME ของคุณ

2) ตั้งค่า $ HOME เป็นเส้นทางอื่นเนื่องจากจะเขียนไฟล์ config ไปยังไฟล์ $ HOME / .binary-name.rc

HOME=./
top

ตอนนี้ .toprcกำลังจะเขียนไปยังโฟลเดอร์ปัจจุบัน

ด้วยการใช้ความคิดเห็นของคนอื่น ๆ เพื่อเพิ่มการบัญชีการใช้งานต่างๆที่ด้านบนคุณสามารถสร้างเอาต์พุตแบทช์สำหรับข้อมูลนั้นและรวบรวมข้อมูลผ่านสคริปต์ อาจจะไม่ง่ายเหมือนสคริปต์ของคุณ แต่ฉันพบว่าด้านบนให้กระบวนการทั้งหมดแก่ฉันเพื่อที่ในภายหลังฉันจะสามารถสรุปและจับภาพสถานะในระยะยาวที่ฉันอาจพลาดเป็นอย่างอื่น (การใช้งาน CPU อย่างกะทันหันโดยไม่ได้อธิบายเนื่องจากกระบวนการหลงทาง)


1

ฉันคิด perf statเป็นสิ่งที่คุณต้องการ

แสดงการใช้งานเฉพาะของกระบวนการเมื่อคุณระบุ--cpu=listตัวเลือก นี่คือตัวอย่างของการตรวจสอบการใช้ cpu ในการสร้างโครงการโดยใช้perf stat --cpu=0-7 --no-aggr -- make all -jคำสั่ง ผลลัพธ์คือ:

CPU0         119254.719293 task-clock (msec)         #    1.000 CPUs utilized            (100.00%)
CPU1         119254.724776 task-clock (msec)         #    1.000 CPUs utilized            (100.00%)
CPU2         119254.724179 task-clock (msec)         #    1.000 CPUs utilized            (100.00%)
CPU3         119254.720833 task-clock (msec)         #    1.000 CPUs utilized            (100.00%)
CPU4         119254.714109 task-clock (msec)         #    1.000 CPUs utilized            (100.00%)
CPU5         119254.727721 task-clock (msec)         #    1.000 CPUs utilized            (100.00%)
CPU6         119254.723447 task-clock (msec)         #    1.000 CPUs utilized            (100.00%)
CPU7         119254.722418 task-clock (msec)         #    1.000 CPUs utilized            (100.00%)
CPU0                 8,108 context-switches          #    0.068 K/sec                    (100.00%)
CPU1                26,494 context-switches                                              (100.00%)
CPU2                10,193 context-switches                                              (100.00%)
CPU3                12,298 context-switches                                              (100.00%)
CPU4                16,179 context-switches                                              (100.00%)
CPU5                57,389 context-switches                                              (100.00%)
CPU6                 8,485 context-switches                                              (100.00%)
CPU7                10,845 context-switches                                              (100.00%)
CPU0                   167 cpu-migrations            #    0.001 K/sec                    (100.00%)
CPU1                    80 cpu-migrations                                                (100.00%)
CPU2                   165 cpu-migrations                                                (100.00%)
CPU3                   139 cpu-migrations                                                (100.00%)
CPU4                   136 cpu-migrations                                                (100.00%)
CPU5                   175 cpu-migrations                                                (100.00%)
CPU6                   256 cpu-migrations                                                (100.00%)
CPU7                   195 cpu-migrations                                                (100.00%)

คอลัมน์ด้านซ้ายคือดัชนี CPU เฉพาะและคอลัมน์ด้านขวาสุดคือการใช้งาน CPU หากคุณไม่ระบุ--no-aggrตัวเลือกผลลัพธ์จะรวมเข้าด้วยกัน --pid=pidตัวเลือกที่จะช่วยถ้าคุณต้องการที่จะตรวจสอบขั้นตอนการทำงาน

ลอง-a --per-coreหรือ-a perf-socketเกินไปซึ่งจะนำเสนอข้อมูลเพิ่มเติม

เพิ่มเติมเกี่ยวกับการใช้งานของperf statสามารถเห็นได้ในการกวดวิชานี้: perf สถิติซีพียูยังperf help statจะช่วยให้ความหมายของตัวเลือก

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