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:
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.