Bagaimana cara mengontrol Penggunaan CPU pada ntoskrnl.exe! MiWalkPageTablesRecursively


2

Setelah posting melacak penggunaan CPU yang tinggi oleh kernel , Saya pikir saya telah men-debug masalah yang telah mengganggu saya, yaitu 20-30% penggunaan CPU yang konsisten oleh proses Sistem. Lihat saya posting sebelumnya tentang itu.

Saya mengatur Windows Performance Analyzer dan dapat melacak proses ini: WPA Trace Log Saya pikir itu ada hubungannya dengan file halaman yang menebak-nebak oleh nama fungsi, dan menonaktifkan file halaman saya, dan restart, tetapi windows malah memiliki file halaman dan melemparkan kesalahan. Jadi saya membuat pagefile kecil sekitar 100MB - 2048MB.

Itu tampaknya telah memecahkan masalah selama beberapa minggu, tetapi sekarang sudah di sini lagi, meskipun pagefile hanya 2GB. Tampaknya terjadi setelah sistem telah dinyalakan untuk sementara waktu. Waktu aktif saat ini adalah 8 hari.

Jika ada pakar kernel yang dapat memberikan saran tentang apa yang harus saya coba selanjutnya, saya akan senang melakukannya.

Namun Process Explorer menunjukkan utas berbeda di bawah gambar sistem. Saya tidak tahu bagaimana mendamaikan perbedaan ini:

InitAnsiStringEx

Proses explorer biasanya menunjukkan hal di atas, meskipun di lain waktu dapat menunjukkan status filter debug ... dll.

enter image description here

(Itu selalu ThreadID 56, saya percaya). Tetapi beberapa jejak log selalu menunjukkan apa yang kita lihat di atas sebagai masalah.

EDIT

Menambahkan gambar seperti yang diminta untuk RAM. Ini adalah setelah restart baru di mana masalahnya tidak ada.

RAM Usage Process Details working set

Jalur simbol yang dikonfigurasi seperti yang direkomendasikan oleh Blog untuk mempercepat pemuatan simbol

Penjelajah Proses

procexp symbols path

WPA

WPA symbols path

Ukuran file folder cache

symbols info

Beberapa versi dbghelp.dll ditemukan di sistem. Saat ini menunjuk ke sistem, tetapi tidak tahu harus menunjuk ke mana.

dbghelp.dll versions


MEMPERBARUI

Setelah mengikuti tautan untuk menemukan Proses Zombie , Saya menemukan data berikut (terpotong untuk menghapus entri kecil)

374 total zombie processes.
334 zombies held by explorer.exe(1768)
    298 zombies of Fences.exe
    9 zombies of LogonUI.exe
    7 zombies of chrome.exe
10 zombies held by ctfmon.exe(4568)
    2 zombies of chrome.exe
7 zombies held by dopus.exe(27672)
    3 zombies of AcroRd32.exe
2 zombies held by RuntimeBroker.exe(12184)
    2 zombies of WWAHost.exe
1 zombie held by SkypeHost.exe(190152)
    1 zombie of SkypeApp.exe
1 zombie held by SecurityHealthService.exe(4536)
    1 zombie of MsMpEng.exe
1 zombie held by svchost.exe(1988)
    1 zombie of userinit.exe

Ini menyiratkan bahwa FENCES.exe adalah penyebabnya, jadi saya telah memperbarui program itu dan akan memeriksa lagi nanti. Juga menonaktifkan sinergi untuk memastikan bahwa bukan itu penyebabnya.

Perbarui 2

Setelah restart baru dan memperbarui pagar. Masalahnya masih ada pada proses zombie, jadi saya harus mencopot pagar untuk menyelesaikan masalah.

Ini adalah versi pagar

enter image description here

dan daftar proses zombie setelah restart baru.

16 total zombie processes.
7 zombies held by explorer.exe(9484)
    5 zombies of Fences.exe
    1 zombie of GoogleUpdateCore.exe
    1 zombie of DropboxUpdate.exe
1 zombie held by svchost.exe(1788)
    1 zombie of userinit.exe

sidenote

Tidakkah itu keren jika kita memiliki perangkat lunak AI yang dapat membantu semua hal ini?


Anda belum memposting spesifikasi HW dan beban kerja Anda. Saya kira Anda hanya perlu menginstal lebih banyak RAM untuk menghindari Windows yang berfungsi set
magicandre1981

@ magicandre1981 Saya memiliki 32GB RAM. Saya telah memperbarui posting dengan rincian yang ditanyakan oleh jawaban di bawah oleh jamie hanrahan
Vijay

@magicandre Windows selalu menjalankan set pemangkas kerja. Ini mungkin tidak benar-benar memotong apa pun, tergantung pada tekanan RAM - tetapi selalu mencari untuk melihat apakah harus.
Jamie Hanrahan

2
ETL menunjukkan masalah memori. Saya melihat akses ke D: \ pagefile.sys. mencari Proses Zombie karena Anda menjalankan beberapa synergys.exe dari waktu ke waktu dan mungkin mereka tidak membebaskan memori.
magicandre1981

@ magicandre1981 Terima kasih atas pembaruannya. Saya telah memperbarui posting dengan rincian yang ditemukan, dan mencoba melihat apa yang dapat dilakukan untuk menghilangkan zombie! yaay
Vijay

Jawaban:


2

Jawaban cepat: Berikan rutinitas itu sedikit pekerjaan untuk dilakukan. Yang saya berpikir berarti menggunakan lebih sedikit ruang alamat virtual pada satu waktu, atau menambah lebih banyak RAM.

Detail: Pertama, rutinitas yang Anda lihat, MiWalkPageTablesRecursively, tidak ada hubungannya dengan file halaman secara langsung, melainkan dengan halaman meja . Tabel halaman adalah struktur dalam memori (dan hadir di semua sistem Windows terlepas dari konfigurasi pagefile). Setiap proses memiliki satu set tabel halaman, dan ada satu set untuk ruang alamat OS ("ruang kernel") juga.

Tabel halaman terdiri dari entri tabel halaman; ada satu PTE untuk setiap halaman - 4K - dari ruang alamat virtual yang ditentukan proses. Dengan "terdefinisi", maksud saya ini mencakup ruang alamat yang dipetakan dan komitmen khusus proses, dan wilayah AWE jika ada; itu tidak termasuk ruang alamat yang dipesan atau gratis - wilayah yang akan melakukan pelanggaran akses jika Anda mencoba membaca atau menulisnya.

(Omong-omong: Anda tidak hanya akan memiliki tabel halaman bahkan jika Anda tidak memiliki pagefile. Anda juga akan tetap memiliki paging, dan kesalahan halaman ke dan dari disk, bahkan jika Anda tidak memiliki pagefile.)

Masalahnya di sini kemungkinan tidak melekat pada MiWalkPageTablesRecursively. Setelah semua fungsi ini (atau setara dengan nama lain) telah menjadi bagian dari Windows sejak NT 3.1. Itu fakta bahwa ia harus melakukan banyak pekerjaan. Ini mungkin berarti bahwa itu sering dipanggil.

Petunjuk mengapa hal ini terlihat dalam rutinitas yang sebelumnya ada di stack. (Artinya, lebih dekat ke atas pada layar WPA.) Sepertinya penelepon MiWalkPageTablesRecursively dalam skenario ini MiWalkPageTables, yang pada gilirannya dipanggil oleh MiAgeWorkingSet, yang pada gilirannya dipanggil oleh MiTrimOrAgeWorkingSet, yang pada gilirannya dipanggil oleh MiProcessWorkingSets, yang pada gilirannya dipanggil oleh ... itu sejauh yang kita butuhkan.

Setiap proses dalam sistem Windows memiliki struktur yang disebut "set daftar kerja". Ini adalah daftar semua nomor halaman fisik yang telah rusak ke dalam RAM sebagai akibat dari kesalahan halaman proses. Utas (utas "Manajer Set Balance") dibangun setiap detik untuk melakukan pembersihan dan pemeliharaan pada set kerja setiap proses. Begitu MiProcessWorkingSets beralih melalui proses, berurusan dengan set kerja masing-masing proses pada gilirannya.

Untuk setiap proses dalam sistem, MiProcessWorkingSets panggilan MiTrimOrAgeWorkingSet. Nama rutin ini mengacu pada "memangkas" set kerja (yang berarti mengidentifikasi halaman yang lama tidak digunakan dan mengusir mereka dari proses untuk memberi ruang pada RAM untuk hal-hal lain), atau "menua" set kerja, yang berarti menambah "usia" penghitung pada setiap entri daftar set bekerja yang belum diakses sejak terakhir kali dipindai, atau memusatkan penghitung jika sudah. (Nama mengacu pada tugas "penuaan" yang dilakukan dalam akuntansi, biasanya setiap bulan atau setiap hari.) Penghitung "usia" kemudian digunakan oleh fungsi "trim" untuk mengidentifikasi halaman yang paling tidak digunakan.

Dari kenyataan itu MiTrimOrAgeWorkingSet berakhir di MiWalkPageTablesRecursively, kita dapat menyimpulkan bahwa mereka memindai ruang alamat virtual seperti yang didefinisikan oleh tabel halaman untuk menemukan halaman yang ada di set kerja. Sekarang pertimbangkan: Waktu yang dibutuhkan oleh MiTrimOrAgeWorkingSet untuk menangani setiap proses akan sebanding dengan ukuran ruang alamat virtual proses. Dan total waktu yang dibutuhkan untuk setiap melewati MiProcessWorkingSets akan secara kasar sebanding dengan jumlah proses.

Entah hal ini berhadapan dengan jumlah halaman yang sangat besar dalam satu set proses kerja, atau harus berurusan dengan banyak proses.

Dan ... mengapa itu begitu sibuk? Itu tidak "memotong" set kerja sampai mereka berusia, dan jumlah yang "trim" set kerja tergantung pada tekanan RAM - yaitu, seberapa pendek Anda pada RAM.

Apakah sistem Anda kekurangan RAM? Silakan kirim buncang dari tab Performance Task Manager | Halaman memori, ditambah halaman Detail yang diurutkan berdasarkan kolom set Bekerja; ditambah tab Memory Monitor Resource, diurutkan berdasarkan kolom Hard Faults; dan halaman Penghitungan Penggunaan RAMmap.

Selain itu, silakan kirim lebih banyak jejak WPA yang Anda miliki, yang menunjukkan lebih banyak "kedalaman" panggilan. Atau poskan file .etl pada layanan berbagi di suatu tempat dan tautkan ke sini. (Zip dulu - kompres dengan sangat baik.)

Selain itu: Mengapa nama rutin tidak cocok antara WPA dan Process Explorer

Mengenai nama rutin, pertanyaan sebenarnya adalah "mengapa nama rutin yang ditampilkan di Process Explorer benar-benar salah." Ada dua alasan untuk ini dalam kasus Anda dan Anda harus memperbaiki keduanya.

Masalah pertama adalah sepertinya Anda tidak memiliki simbol yang dikonfigurasi dengan benar untuk Process Explorer. Mengkonfigurasinya untuk Windows Performance Analyzer tidak cukup.

Tanda pasti bahwa Anda tidak memiliki hak ini adalah bahwa semua atau hampir semua utas dalam proses "Sistem" muncul dengan nama modul (something.sys atau something.exe, biasanya ntoskrnl.exe) diikuti oleh offset , seperti +0x245 - seperti pada penutup layar Anda. Tidak apa-apa untuk melihat beberapa seperti itu, tetapi Anda harus melihat sejumlah besar ntoskrnl! nama rutin diikuti oleh tidak mengimbangi.

Untuk memperbaiki ini, lihat halaman ini dari Panduan Lapangan Analisis Kinerja Windows . Anda perlu mengatur jalur pencarian simbol Explorer - Anda dapat menggunakan jalur file simbol yang sama yang Anda atur untuk WPA - dan Anda perlu mengarahkan ProcExp ke DLL yang datang dengan Alat Debugging Windows. Jadi Anda harus memiliki Alat Debugging diinstal - bukan bahwa Anda menggunakan debugger secara langsung, tetapi Process Explorer membutuhkan DLL itu.

Alasan kedua untuk perbedaan ini adalah bahwa bahkan setelah Anda memiliki file simbol yang ditetapkan dengan benar untuk Process Explorer, nama-nama rutin yang ditampilkannya tidak akan sering cocok dengan nama-nama rutin tingkat-dalam yang diidentifikasi oleh Performance Analyzer. Anda harus menemukan kecocokan, pada nama rutin di dekat awal tumpukan (ditampilkan di bagian atas pohon panggilan rutin seperti yang ditunjukkan dalam WPA).

Misalnya - dalam kasus Anda, rutinitas pertama yang menarik adalah KeBalanceSetManager. (Dua sebelum itu sama untuk setiap utas dalam proses sistem, tetapi KeBalanceSetManager adalah rutin yang merupakan rutinitas "tingkat atas" untuk utas ini.) Setelah simbol dikonfigurasikan dengan benar, Process Explorer akan menampilkan utas dengan itu sebagai "Mulai Alamat", seperti yang ditunjukkan di sini:

here

Process Explorer tidak dapat menampilkan Anda MiWalkPageTablesRecursively karena itu adalah sekitar enam panggilan ke tumpukan dari apa yang dicatat sebagai alamat awal utas, dan bahkan bukan rutinitas terdalam saat ini (yaitu itu tidak di atas tumpukan) Informasi seperti itu (bahkan jika mudah tersedia, yang bukan) akan berubah terlalu cepat untuk berguna dalam tampilan Process Explorer, jadi itu tidak mencoba.

Catatan: Bahkan dengan simbol yang benar, tidak jarang menemukan beberapa utas dalam proses sistem yang menunjukkan "Mulai Alamat" mis. GemCCID.sys+0xd138, seperti yang akan Anda lihat dalam contoh saya. Modul yang dipermasalahkan (GemCCID.sys) ini jelas bukan salah satu yang Microsoft menyediakan file simbol, jadi Process Explorer hanya perlu mengatakan "alamat awal utas sebesar 0xd138 byte dari awal kode dalam file ini, dan hanya itu yang saya tahu tentang itu. "

Semoga ini membantu! Tolong beri tahu saya jika Anda memiliki pertanyaan lebih lanjut.


1
Bisakah Anda membagikan file .etl?
Jamie Hanrahan

1
Oh - untuk pengaturan simbol Process Explorer: Anggap Anda menggunakan mesin 64-bit, untuk jalur dbghelp.dll yang Anda inginkan C:\Program File (x86)\Windows Kits\10\Debuggers\x64\dbghelp.dll . Untuk jalur simbol Process Explorer yang Anda lakukan tidak ingin menunjukkan ... \ NGenPdbs_Cache! Itu hanya berisi PDB yang di-cache dari modul yang menyediakan dukungan untuk kode dot-net, yang sama sekali tidak relevan dengan kode mode kernel yang berjalan dalam proses Sistem. Ubah ke srv*c:\symbols*http://msdl.microsoft.com/download/symbols . (lanjutan.)
Jamie Hanrahan

1
(...) Anda bisa menggunakan srv*c:\symcache*http://msdl.microsoft.com/download/symbols jika kamu mau. Perlu diketahui bahwa Process Explorer tidak tahu tentang format simbol cache yang baru (file .symcache) yang dijelaskan di blog itu. Namun kedua cache bisa hidup berdampingan, jadi semuanya bekerja. Jangan khawatir tentang waktu pemuatan simbol di Process Explorer; cache file simbol berbasis folder gaya lama cukup cepat untuk ProcExp seperti yang dimilikinya jauh lebih sedikit simbol untuk dilihat daripada WPA.
Jamie Hanrahan

1
Oh, dan berbicara tentang blog itu - dalam konfigurasi simbol WPA, mengabaikan saran untuk mematikan jalur simbol yang merujuk ke server simbol MS (Anda telah mematikannya di snap layar Anda). Yang harus Anda lakukan adalah memastikan itu yang terakhir dalam daftar. Dengan cara itu WPA akan selalu menggunakan cache lokal sebelum pergi ke web, dan itu akan menggunakan symcache cepat baru sebelum menggunakan cache berbasis folder yang lama.
Jamie Hanrahan

1
Seperti yang dapat Anda lihat dari pohon panggilan di jepretan layar WPA Anda, KeBalanceSetManager memang merupakan rutinitas tingkat teratas dari utas itu (tidak termasuk dua di atasnya, yang sama untuk setiap utas dalam proses itu). Saya harus melihat ETL besok.
Jamie Hanrahan
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.