Bagaimana cara mengukur penggunaan inti CPU terpisah untuk suatu proses?

115

Apakah ada cara untuk mengukur proses tertentu penggunaan CPU berdasarkan inti?

Saya tahu top bagus untuk mengukur penggunaan CPU seluruh sistem dengan inti dan kumpulan tugas dapat memberikan informasi tentang inti CPU mana yang diizinkan untuk menjalankan proses.

Tetapi bagaimana cara mengukur penggunaan CPU proses tertentu oleh inti CPU?

elang
sumber

Jawaban:

139

Anda masih bisa melakukan ini di atas . Saat bagian atas berjalan, tekan '1' pada keyboard Anda, itu akan menunjukkan penggunaan CPU per inti.

Batasi proses yang ditunjukkan dengan menjalankan proses spesifik tersebut di bawah akun pengguna tertentu dan gunakan Ketik 'u' untuk membatasi ke pengguna tersebut

abdollar
sumber
3
Anda juga dapat menekan Iuntuk beralih mode Irix (sebagai lawan dari mode Solaris ). Jika on, persentase yang ditampilkan dalam daftar proses relatif terhadap utas CPU . Ketika off, persentase tersebut ditampilkan relatif terhadap keseluruhan kapasitas CPU (yaitu SEMUA utas - alias semua inti).
7heo.tk
8
Ini tidak spesifik untuk satu proses, ini menunjukkan penggunaan cpu dari semua proses di beberapa inti
m_vitaly
Bagaimana kita bisa melewatkan "1" sebagai argumen untuk top, mankata halaman top -1tetapi mengeluh! Akan menyenangkan untuk mendapatkan top -1 -n 1satu iterasi toptetapi dengan penggunaan CPU terpisah ditampilkan.
kuanta
76

Kamu bisa memakai:

 mpstat -P ALL 1

Ini menunjukkan seberapa banyak setiap inti sibuk dan diperbarui secara otomatis setiap detik. Outputnya akan seperti ini (pada prosesor 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

Perintah ini tidak menjawab pertanyaan asli, yaitu tidak menunjukkan penggunaan inti CPU untuk proses tertentu.

Kamran Bigdely
sumber
3
Saya pikir ini tidak benar-benar menjawab pertanyaan itu. Ini hanya hal yang sama jika tidak ada proses lain yang berjalan. Juga tampaknya ini bukan CPU quad core, lebih seperti delapan core (mungkin quad dengan HT diaktifkan).
babi
1
Ini adalah quad core dengan HT diaktifkan.
Kamran Bigdely
Tidak menjawab pertanyaan asli. Namun, karena tidak menyebutkannya (-1) dari saya.
KGhatak
1
Saya setuju dengan @KGak, ini tidak menjawab pertanyaan asli -1
jodag
41

Anda bisa menggunakan ps.
misalnya memiliki proses python dengan dua utas sibuk pada CPU inti ganda:

$ 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 adalah id CPU tempat utas saat ini ditetapkan)

Anda melihat bahwa utas berjalan pada inti cpu yang sama (karena GIL)

menjalankan skrip python yang sama di jython, kita lihat, bahwa skrip menggunakan kedua inti (dan ada banyak layanan lain atau utas apa pun, yang hampir tidak aktif):

$ 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

Anda dapat memproses output dan menghitung total CPU untuk setiap inti CPU.

Sayangnya, pendekatan ini tampaknya tidak 100% dapat diandalkan, terkadang saya melihat bahwa dalam kasus pertama, dua utas kerja dilaporkan dipisahkan ke setiap inti CPU, atau dalam kasus terakhir, dua utas dilaporkan berada di inti yang sama ..

mykhal
sumber
13

htop memberikan gambaran yang bagus tentang penggunaan inti individu

WBM
sumber
4

The pssolusi hampir apa yang saya butuhkan dan dengan beberapa pesta dilemparkan tidak persis apa pertanyaan awal meminta: untuk melihat per-core penggunaan proses tertentu

Ini menunjukkan penggunaan per-inti dari proses multi-thread juga.

Gunakan seperti: 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

Catatan: Statistik ini didasarkan pada umur proses , bukan X detik terakhir , jadi Anda harus memulai ulang proses untuk mengatur ulang penghitung.

Nathan Kidd
sumber
Anda dapat menggunakan fungsi C lib read () dan open () untuk membuka file pseudo di / proc / pid / * dan mengurai data apa pun yang Anda butuhkan.
GL2014
2
dstat -C 0,1,2,3 

Juga akan memberi Anda penggunaan CPU dari 4 inti pertama. Tentu saja, jika Anda memiliki 32 inti maka perintah ini menjadi sedikit lebih lama tetapi berguna jika Anda hanya tertarik pada beberapa inti.

Misalnya, jika Anda hanya tertarik pada inti 3 dan 7 maka Anda dapat melakukannya

dstat -C 3,7
Tanya dan Belajar
sumber
Bagaimana ini akan relevan dengan satu proses?
einpoklum
1

Saya baru saja mengalami masalah ini dan saya menemukan jawaban yang serupa di sini .

topCaranya adalah dengan menyetel sesuai keinginan Anda lalu tekan W(kapital W). Ini menyimpan toptata letak saat ini ke file konfigurasi di $ HOME / .toprc

Meskipun ini mungkin tidak berhasil jika Anda ingin menjalankan beberapa topdengan konfigurasi berbeda.

Jadi melalui apa yang saya anggap sebagai pekerjaan di sekitar Anda dapat menulis ke file konfigurasi yang berbeda / menggunakan file konfigurasi yang berbeda dengan melakukan salah satu hal berikut ...

1) Ubah nama biner

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

Sekarang .top2rcakan ditulis ke $ HOME Anda

2) Setel $ HOME ke beberapa jalur alternatif, karena ini akan menulis file konfigurasinya ke file $ HOME / .binary-name.rc

HOME=./
top

Sekarang .toprcakan ditulis ke folder saat ini.

Melalui penggunaan komentar orang lain untuk menambahkan berbagai akuntansi penggunaan di atas, Anda dapat membuat output batch untuk informasi tersebut dan kemudian menggabungkan informasi melalui skrip. Mungkin tidak sesederhana skrip Anda tetapi saya menemukan bagian atas untuk memberi saya SEMUA proses sehingga nanti saya dapat merekap dan menangkap keadaan selama jangka panjang yang mungkin saya lewatkan jika tidak (penggunaan CPU tiba-tiba yang tidak dapat dijelaskan karena proses yang menyimpang)

Lucien Murray-Pitts
sumber
1

Saya pikir perf statitu yang Anda butuhkan.

Ini menunjukkan penggunaan tertentu dari suatu proses saat Anda menentukan --cpu=listopsi. Berikut adalah contoh pemantauan penggunaan cpu dalam membangun proyek menggunakan perf stat --cpu=0-7 --no-aggr -- make all -jperintah. Outputnya adalah:

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

Kolom kiri adalah indeks CPU spesifik dan kolom paling kanan adalah penggunaan CPU. Jika Anda tidak menentukan --no-aggropsi, hasilnya akan digabungkan. The --pid=pidpilihan akan membantu jika Anda ingin memantau proses yang berjalan.

Coba -a --per-coreatau -a perf-socketjuga, yang akan menyajikan informasi yang lebih rahasia.

Lebih lanjut tentang penggunaan perf statdapat dilihat di tutorial ini: statistik kinerja cpu , juga perf help statakan membantu tentang arti opsi.

elinx.dll
sumber