Mengapa 1 dari 24 CPU saya Dipatok pada 100%?

12

Saya memiliki sistem HP ProLiant DL380 G7 menggunakan 2 CPU 6-core, dengan Hyper-threading diaktifkan, untuk total 24 CPU logis (seperti yang terlihat oleh Windows).

Saat menjalankan aplikasi kami, utilisasi sistem CPU total baik, tetapi salah satu dari 24 CUP dipatok 100%: masukkan deskripsi gambar di sini

Sunting: Ini adalah data PerfMon untuk proses Sistem selama ini, dan untuk Prosesor dengan pemanfaatan tinggi: masukkan deskripsi gambar di sini

Apakah ini normal? Jika tidak, apakah ada cara untuk mengidentifikasi proses mana yang menggunakan CPU logis itu? Windows PerfMon, ResMon, Task Manager, dan Process Explorer tidak membantu, selain mengidentifikasi bahwa CPU berada pada 100%.

Patrick Cuff
sumber
29
Dugaan saya adalah bahwa itu sedang digunakan karena suatu proses menggunakannya.
HopelessN00b
1
Anda tahu Anda dapat mengarahkan kursor ke grafik dan mendapatkan petunjuk yang memberi tahu Anda proses apa yang mengambil CPU paling banyak pada prosesor itu ?!
Lieven Keersmaekers
Saya akan curiga dengan delta gangguan 100k. Anda harus memposting tangkapan layar daftar proses Explorer di mana kita dapat melihat apa yang dikatakannya untuk hal-hal seperti Sistem, DPC, Interrupts.
Gabe
@RyanRies; "aplikasi" kami terdiri dari beberapa layanan .Net WCF yang juga WebSphere MQ dan beberapa perangkat lunak pemantauan pihak ketiga.
Patrick Cuff
2
Relatif mahal untuk memindahkan suatu proses dari satu CPU ke CPU lainnya, dibandingkan dengan menjadwalkannya pada CPU yang sama, jadi jika suatu proses benar-benar menuntut CPU maka OS tersebut seringkali akan lebih suka untuk tidak memindahkannya.
Michael Hampton

Jawaban:

11

Seperti yang telah ditunjukkan oleh yang lain, kita dapat melihat dari tangkapan layar itu bahwa CPU yang bekerja sangat keras menghabiskan seluruh waktunya dalam mode kernel. (Warna merah.)

Menjalankan Powershell sebagai administrator, ketik:

Get-Process | Select Name, PrivilegedProcessorTime | `
Sort-Object PrivilegedProcessorTime -Descending

Proses di bagian atas daftar adalah proses yang saat ini menggunakan mode CPU paling kernel saat ini. Jika proses itu bukan "Sistem," maka Anda baru saja mengetahui proses mode pengguna apa yang menyebabkan penggunaan CPU ini. Jika proses dengan Waktu Prosesor Privileged tertinggi adalah Sistem, yang saya duga, maka itu sedikit lebih rumit.

Buka Process Explorer. Secara opsional, atur server simbol Anda. Pastikan Anda menjalankan dengan ketinggian UAC penuh. Klik kanan Sistem "proses" dan pergi ke Properties. Lalu buka tab Threads. Urutkan utas berdasarkan penggunaan CPU. Utas yang menyebabkan semua mode kernel ini bekerja seharusnya ada di sini. Jika Anda melihat modul yang tercantum di bawah Alamat Mulai, itu akan memberi Anda petunjuk tentang apa pekerjaan terkait. Jika itu NDIS.sys, misalnya, itu adalah driver antarmuka jaringan. Jika Anda mengatur server simbol, Anda akan melihat nama fungsi di dalam modul (kecuali modul tersebut bukan Microsoft,) jika tidak, Anda hanya akan melihat offset numerik dari alamat awal modul.

Atau, gunakan Xperf dari Windows Performance Toolkit untuk menginterupsi profil, DPC, dll.

xperf -on PROC_THREAD+LOADER+DPC+INTERRUPT

dan berhenti merekam dengan xperf -d logfile.etl

Xperf menggantikan alat Kernrate lama, dan dapat menjaring Anda beberapa data yang sangat rinci.

Ketika CPU melakukan pekerjaan dalam mode kernel, kebanyakan menjalankan rutinitas layanan interupsi. (ISR) Ketika terjadi interupsi, mode kerja pengguna ditangguhkan pada prosesor itu, dan CPU menjalankan ISR yang terdaftar pada interupsi itu. Jika Anda mendapati CPU Anda menghabiskan banyak waktu untuk gangguan ini, itu biasanya menunjukkan driver perangkat yang salah yang perlu diperbarui.

Apa yang mengganggu saya (tidak bermaksud kata-kata) tentang skenario ini adalah bahwa tampaknya seolah-olah apa pun utas kernel yang melakukan ini tampaknya disamakan dengan inti yang satu itu. Saya bertanya-tanya mengapa operator tampaknya hanya menjadwalkan utas untuk berjalan pada satu inti yang tampaknya sewenang-wenang. Jadi saya merasa bahwa kita perlu menemukan siapa pun yang menulis driver perangkat ini dan menunjukkan kepada mereka bagaimana melakukan DPC berulir, dan tidak secara eksplisit mengatur afinitas pada utas kernel, dll.

Ryan Ries
sumber
IIRC, itu adalah perilaku standar bagi sebuah OS untuk hanya menggunakan CPU tunggal untuk menangani gangguan hardware ...
Massimo
1
@ Massimo Ini mungkin terjadi dengan sistem operasi lama, tetapi tidak lagi. Setiap CPU mendapatkan tabel deskriptor interupsi sendiri, dan setiap prosesor memiliki IRQL sendiri. Jika satu CPU terjebak pada IRQL tinggi karena beberapa alasan (yaitu sudah melayani interupsi,) ia tidak dapat menerima interupsi pada level yang sama atau lebih rendah sehingga Windows akan memberikan interupsi ke prosesor lain, atau hanya bertahan saja sampai CPU tersedia. Bahkan timer (objek yang sebelumnya terkenal hanya berjalan pada CPU0) memiliki algoritma pemilihan prosesor sekarang.
Ryan Ries
Tapi ya, ini bisa sesederhana menjalankan aplikasi lawas atau yang ditulis dengan buruk yang disalahgunakan dengan buruk, dan selanjutnya membuat banyak syscall. Interupsi biasanya perlu dimulai dan diakhiri pada CPU yang sama dari mana mereka dipanggil ... tetapi biasanya bahkan aplikasi single-threaded akan mendapatkan "load-balance" di antara core saat dijalankan ... yang ini tampaknya memiliki keanehan afinitas.
Ryan Ries
@RyanRies; Saya menginstal Windows Performance Toolkit pada sistem dan menggunakan Windows Performance Recorder; perintah xperf di atas terus memberikan kesalahan. CPU yang tinggi sepertinya berasal dari: Proses - Sistem; Modul - ntoskrnl.exe; Thread - Phase1Initialize; Fungsi - KeZeroPages. Itu hanya terjadi ketika aplikasi sedang berjalan, jadi saya pikir (harapan) saya punya cukup banyak untuk dibawa kembali ke pengembang, tetapi saya juga tertarik pada ide yang mungkin Anda miliki.
Patrick Cuff
23

Tampilkan kolom "Waktu CPU" pada tab "Detail" di "Pengelola Tugas" dan cari proses dengan jumlah waktu CPU yang terus meningkat. Itu proses Anda yang terjepit. Itu harus menggunakan sekitar 4,17% CPU terus-menerus.

Evan Anderson
sumber
10

Tampaknya semua waktu Kernel, bisa Interupsi, mereka hanya bisa ditangani oleh satu CPU.

MichelZ
sumber
+1 - Ini memang terlihat seperti waktu kernel, bukan.
Evan Anderson
Apakah itu akan muncul dalam proses "Sistem"? Data PerfMon yang kami kumpulkan selama uji coba memiliki CPU 100% untuk proses "Sistem".
Patrick Cuff
Ya, saya pikir itu akan jatuh di bawah sistem (jika terdaftar sama sekali ...)
MichelZ
6
Tidak bisakah itu juga bug driver atau perangkat keras buruk yang berinteraksi dengan driver tanpa pemulihan kesalahan? Atau mungkin perangkat lunak yang memanggil kernel dalam satu lingkaran ketat.
Zan Lynx
1
@MichelZ, Proses pengguna yang membuat banyak panggilan sistem (yang akan mencakup segala jenis I / O) akan terlihat seperti itu.
reirab
6

Cari proses dengan utilisasi CPU konstan ~ 4% (= 1/24 dari total CPU yang tersedia). Itu harus menjadi yang terus menerus mengambil satu CPU.

Massimo
sumber