Làm cách nào để đo mức sử dụng lõi CPU riêng biệt cho một quy trình?


114

Có cách nào để đo lường mức sử dụng CPU của một quy trình cụ thể theo lõi không?

Tôi biết trên cùng là tốt để đo mức sử dụng CPU của toàn hệ thống theo các lõi và bộ tác vụ có thể cung cấp thông tin về lõi CPU nào được phép chạy trên quy trình.

Nhưng làm cách nào để đo mức sử dụng CPU của một quy trình cụ thể theo lõi CPU?

Câu trả lời:


139

Bạn vẫn có thể làm điều này ở trên cùng . Trong khi trên cùng đang chạy, nhấn '1' trên bàn phím của bạn, sau đó nó sẽ hiển thị mức sử dụng CPU trên mỗi lõi.

Giới hạn các quy trình được hiển thị bằng cách cho quy trình cụ thể đó chạy trong một tài khoản người dùng cụ thể và sử dụng Loại 'u' để giới hạn cho người dùng đó


3
Bạn cũng có thể nhấn Iđể chuyển đổi chế độ Irix (trái ngược với chế độ Solaris ). Khi nào on, tỷ lệ phần trăm được hiển thị trong danh sách quy trình có liên quan đến luồng CPU . Khi nào off, tỷ lệ phần trăm nói trên được hiển thị tương đối với dung lượng tổng thể của CPU (tức là TẤT CẢ các luồng - hay còn gọi là tất cả các lõi).
7heo.tk

8
Đây không phải là cụ thể cho một quá trình duy nhất, điều này cho thấy việc sử dụng cpu của tất cả các quá trình trên nhiều lõi
m_vitaly

Làm thế nào chúng ta có thể chuyển "1" làm đối số top, mantrang nói top -1nhưng nó phàn nàn! Sẽ rất tuyệt nếu bạn có top -1 -n 1được một lần lặp lại topnhưng với mức sử dụng CPU riêng biệt được hiển thị.
quanta

76

Bạn có thể dùng:

 mpstat -P ALL 1

Nó hiển thị mức độ bận rộn của mỗi lõi và nó tự động cập nhật mỗi giây. Đầu ra sẽ giống như thế này (trên bộ xử lý lõi tứ):

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

Lệnh này không trả lời câu hỏi ban đầu mặc dù tức là nó không hiển thị mức sử dụng lõi CPU cho một quy trình cụ thể.


3
Tôi nghĩ rằng điều này không thực sự trả lời câu hỏi. Đây chỉ là điều tương tự nếu không có quá trình nào khác đang chạy. Ngoài ra, đây dường như không phải là một CPU lõi tứ, giống như lõi tám (có thể là lõi tứ với HT được kích hoạt).
con lợn

1
Đó là một lõi tứ với HT được kích hoạt.
Kamran Bigdely

Không trả lời câu hỏi ban đầu. Tuy nhiên, vì tôi không đề cập đến nó (-1).
KGhatak

1
Tôi đồng ý với @KGhatak, điều này không trả lời câu hỏi ban đầu -1
jodag

41

bạn có thể sử dụng ps.
ví dụ: có quy trình python với hai luồng bận trên CPU lõi kép:

$ 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 là id CPU mà luồng hiện được gán cho)

bạn thấy rằng các luồng đang chạy trên cùng một lõi cpu (vì GIL)

chạy cùng một tập lệnh python trong jython, chúng tôi thấy rằng tập lệnh đang sử dụng cả hai lõi (và có nhiều dịch vụ khác hoặc bất kỳ luồng nào, hầu như không hoạt động):

$ 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

bạn có thể xử lý đầu ra và tính toán tổng CPU cho mỗi lõi CPU.

Thật không may, cách tiếp cận này dường như không đáng tin cậy 100%, đôi khi tôi thấy rằng trong trường hợp đầu tiên, hai luồng làm việc được báo cáo là được tách riêng cho mỗi lõi CPU hoặc trong trường hợp sau, hai luồng được báo cáo là đang bật cùng một lõi ..


13

htop cung cấp một cái nhìn tổng quan tốt đẹp về việc sử dụng cốt lõi riêng lẻ


4

Các psgiải pháp được gần những gì tôi cần và với một số bash ném vào thực hiện chính xác những gì các câu hỏi ban đầu yêu cầu: để xem mỗi lõi sử dụng các quy trình cụ thể

Điều này cũng cho thấy việc sử dụng mỗi lõi của các quy trình đa luồng .

Sử dụng như: 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

Lưu ý: Các số liệu thống kê này dựa trên thời gian tồn tại của quy trình , không phải X giây cuối cùng , vì vậy bạn sẽ cần phải khởi động lại quy trình của mình để đặt lại bộ đếm.


Bạn có thể sử dụng các hàm read () và open () của C lib để mở các tệp giả tại / proc / pid / * và phân tích cú pháp bất kỳ dữ liệu nào bạn cần.
GL2014

2
dstat -C 0,1,2,3 

Cũng sẽ cung cấp cho bạn mức sử dụng CPU của 4 lõi đầu tiên. Tất nhiên, nếu bạn có 32 lõi thì lệnh này dài hơn một chút nhưng hữu ích nếu bạn chỉ quan tâm đến ít lõi.

Ví dụ: nếu bạn chỉ quan tâm đến lõi 3 và 7 thì bạn có thể làm

dstat -C 3,7

Làm thế nào điều này sẽ liên quan đến một quy trình?
einpoklum

1

Tôi chỉ gặp vấn đề này và tôi đã tìm thấy một câu trả lời tương tự ở đây .

Phương pháp là đặt toptheo cách bạn muốn và sau đó nhấn W(viết hoa W). Thao tác này sẽ lưu topbố cục hiện tại vào tệp cấu hình trong $ HOME / .toprc

Mặc dù điều này có thể không hoạt động nếu bạn muốn chạy nhiều topvới các cấu hình khác nhau.

Vì vậy, thông qua những gì tôi coi là một công việc xung quanh bạn có thể ghi vào các tệp cấu hình khác nhau / sử dụng các tệp cấu hình khác nhau bằng cách thực hiện một trong các thao tác sau ...

1) Đổi tên hệ nhị phân

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

Bây giờ .top2rcsẽ được ghi vào $ HOME của bạn

2) Đặt $ HOME thành một số đường dẫn thay thế, vì nó sẽ ghi tệp cấu hình của nó vào tệp $ HOME / .binary-name.rc

HOME=./
top

Bây giờ .toprcsẽ được ghi vào thư mục hiện tại.

Thông qua việc sử dụng nhận xét của những người khác để thêm các tính toán sử dụng khác nhau ở trên, bạn có thể tạo đầu ra hàng loạt cho thông tin đó và sau đó kết hợp thông tin qua một tập lệnh. Có thể không hoàn toàn đơn giản như bạn tập lệnh nhưng tôi thấy hàng đầu là cung cấp cho tôi TẤT CẢ các quy trình để sau này tôi có thể tóm tắt lại và nắm bắt trạng thái trong suốt thời gian dài mà tôi có thể đã bỏ lỡ (sử dụng CPU đột ngột không giải thích được do các quy trình bị lạc)


1

Tôi nghĩ perf statlà những gì bạn cần.

Nó hiển thị cách sử dụng cụ thể của một quy trình khi bạn chỉ định một --cpu=listtùy chọn. Đây là một ví dụ về giám sát việc sử dụng cpu trong việc xây dựng một dự án bằng perf stat --cpu=0-7 --no-aggr -- make all -jlệnh. Đầu ra là:

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%)

Cột bên trái là chỉ số CPU cụ thể và cột bên phải nhất là mức sử dụng CPU. Nếu bạn không chỉ định --no-aggrtùy chọn, kết quả sẽ được tổng hợp lại với nhau. Các --pid=pidtùy chọn sẽ giúp đỡ nếu bạn muốn theo dõi một quá trình đang chạy.

Hãy thử -a --per-corehoặc -a perf-socketquá, sẽ hiển thị nhiều thông tin được phân loại hơn.

perf statthể xem thêm về cách sử dụng của trong hướng dẫn này: thống kê perf cpu , cũng perf help statsẽ giúp ích về ý nghĩa của các tùy chọn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.