Saya tidak mencari masalah. Saya tidak memulai proses pembuatan Chrome
ribuan kali selama akhir pekan , tetapi hanya melakukan tugas paling umum di abad ke-21 - Saya baru saja menulis email pada pukul 10:30 pagi. Dan tiba-tiba Gmail bertahan. Saya terus mencetak selama beberapa detik, tetapi tidak ada karakter yang muncul di layar. Kemudian tiba-tiba Gmail merosot dan saya kembali ke email saya yang
sangat penting . Namun kemudian semuanya berulang, hanya saja kali ini Gmail tidak menjawab permintaan lebih lama lagi.
Ini aneh ...
Sulit untuk menolak kesempatan untuk melakukan penyelidikan yang baik, tetapi dalam kasus ini tantangannya sangat kuat. Bagaimanapun, saya di Google sedang berupaya meningkatkan kinerja Chrome untuk Windows. Mencari tahu penyebab pembekuan adalah
pekerjaan saya. Dan setelah banyak kesalahan awal dan kerja keras, saya masih berhasil mengetahui bagaimana Chrome, Gmail, Windows dan departemen IT kami bersama-sama mencegah saya mengetik email. Sepanjang jalan, ada cara untuk menghemat sejumlah besar memori untuk beberapa halaman web di Chrome.
Ada begitu banyak nuansa dalam penyelidikan sehingga saya akan meninggalkan beberapa untuk
artikel lain , dan sekarang saya akan sepenuhnya menjelaskan alasan penangguhan tersebut.
Seperti biasa,
UIforETW bekerja di latar belakang saya dan memonitor buffer melingkar, jadi saya hanya perlu memasukkan Ctrl + Win + R - dan buffer disimpan ke disk selama sekitar tiga puluh detik terakhir aktivitas sistem. Saya mengunduhnya di
Windows Performance Analyzer (WPA), tetapi saya tidak dapat menginstal pembekuan secara permanen.
Ketika program Windows berhenti mengirim pesan, peristiwa ETW dilemparkan yang menunjukkan dengan
tepat di mana ini terjadi , jadi sepele untuk menemukan jenis hang ini. Namun ternyata, Chrome terus mengirim pesan. Saya mencari sejenak ketika salah satu kunci aliran Chrome memasuki siklus aktif atau benar-benar menganggur, tetapi tidak menemukan sesuatu yang eksplisit. Ada beberapa tempat di mana
sebagian besar Chrome berdiri diam, tetapi meskipun begitu semua utas kunci terus bekerja, jadi Anda tidak bisa memastikan di mana hang terjadi - Chrome hanya bisa diam jika tidak ada acara:


UIforETW memiliki keylogger bawaan, yang sering berguna dalam mengidentifikasi titik-titik kunci dalam suatu penelusuran. Namun, untuk alasan keamanan yang jelas, secara default menganonimkan penekanan tombol, memperlakukan setiap nomor yang dimasukkan sebagai "1" dan setiap huruf sebagai "A". Ini membuatnya sulit untuk menemukan saat pembekuan yang tepat, jadi saya mengubah jenis jejak dari "pribadi" menjadi "penuh" dan mengharapkan pembekuan. Sekitar pukul 10.30 keesokan paginya, telepon diulang. Saya menyimpan buffer jejak dan menyimpan tanda ini di bidang informasi jejak UIforETW:
Dia mengetik "menunda untuk mereka yang memiliki lebih banyak pengalaman dengan scuba diving" - dan Gmail berhenti pada akhir kata "itu", dan kemudian kembali bekerja di bidang kata "pengalaman". Tab Gmail dengan PID 27368.
Ini adalah diskusi umum tentang
cara untuk sampai ke kantor , tetapi penting bahwa sekarang ada cara untuk menemukan celah di jejak ETW. Saya memuat jejak, melihat data keylogger di bidang Generic Events (acara dikeluarkan oleh UIforETW sendiri, dan masing-masing adalah belah ketupat ungu pada tangkapan layar di bawah ini) - dan saya dapat langsung melihat di mana hang terjadi, dengan mana kegagalan dalam penggunaan CPU jelas berkorelasi:

Oke, tapi mengapa Chrome berhenti? Berikut adalah beberapa petunjuk: tangkapan layar tidak menunjukkan bahwa setiap kali
WmiPrvSE.exe sepenuhnya menggunakan CPU hyperthread. Tapi itu tidak masalah. Mesin saya memiliki 24 core / 48 thread, jadi mengonsumsi satu hyper-thread berarti sistem ini masih 98% gratis.
Lalu saya mendekati periode yang jelas penting ketika Chrome menganggur - dan melihat, khususnya, pada proses CrRendererMain di chrome.exe (27368), yang terkait dengan tab Gmail.
Catatan: Saya ingin mengucapkan terima kasih kepada diri saya sendiri sejak tahun 2015 karena telah meminta Microsoft untuk meningkatkan mekanisme penamaan aliran, dan terima kasih kepada Microsoft untuk menerapkan semua saran - nama-nama utas dalam WPA sangat luar biasa!
Masalahnya beres. Selama hang 2,81 detik, utas ini dimulai pada jadwal 440 kali. Biasanya, memulai setiap 6 ms sudah cukup untuk membuat program responsif, tetapi untuk beberapa alasan ini tidak terjadi. Saya perhatikan bahwa setiap kali dia bangun, dia berada di tumpukan yang sama. Untuk menyederhanakan:
chrome_child.dll (stack base)
KernelBase.dll!VirtualAlloc
ntoskrnl.exe!MiCommitVadCfgBits
ntoskrnl.exe!MiPopulateCfgBitMap
ntoskrnl.exe!ExAcquirePushLockExclusiveEx
ntoskrnl.exe!KeWaitForSingleObject (stack leaf)
Chrome VirtualAlloc, βCfgBitsβ . , Chrome VirtualAlloc 440 , . . Chrome VirtualAlloc β . Chrome , β 439 β Chrome , . , .
Windows
β , , . . .
, Chrome , WmiPrvSE., :
ntoskrnl.exe!KiSystemServiceCopyEnd (stack base)
ntoskrnl.exe!NtQueryVirtualMemory
ntoskrnl.exe!MmQueryVirtualMemory
ntoskrnl.exe!MiUnlockAndDereferenceVad
ntoskrnl.exe!ExfTryToWakePushLock (stack leaf)
WMI ( ), WMI. CPU, , WmiPrvSE.exe ( ):
WmiPerfClass.dll!EnumSelectCounterObjects (stack base)
WmiPerfClass.dll!ConvertCounterPath
pdh.dll!PdhiTranslateCounter
pdh.dll!GetSystemPerfData
KernelBase.dll!blah-blah-blah
advapi32.dll!blah-blah-blah
perfproc.dll!blah-blah-blah
perfproc.dll!GetProcessVaData
ntdll.dll!NtQueryVirtualMemory
ntoskrnl.exe!NtQueryVirtualMemory
ntoskrnl.exe!MmQueryVirtualMemory
ntoskrnl.exe!MiQueryAddressSpan
ntoskrnl.exe!MiQueryAddressState
ntoskrnl.exe!MiGetNextPageTable (stack leaf)
.
NtQueryVirtualMemory,
GetProcessVaData,
Va, , . VirtualScan
NtQueryVirtualMemory , Gmail (10-15 ) β . ?
, .
NtQueryVirtualMemory . Β« Β», Β« Β» .. Gmail 26 000 , ( ,
WPA) 16 000 , .
- Gmail
vmmap , Gmail (361 836 ) (49 719), β 2 147 483 648 , 2 . ?

, 2
Control Flow Guard (CFG), , βCFGβ , Gmail Chrome β
MiCommitVadCfgBits. , CFG !
Control Flow Guard (CFG) . , 128- . , CFG ( 2 ), . CFG
, CFG . 98 24 866 CFG-. :
Scan time, Committed, page tables, committed blocks
Total: 41.763s, 1457.7 MiB, 67.7 MiB, 32112, 98 code blocks
CFG: 41.759s, 353.3 MiB, 59.2 MiB, 24866
vmmap , β vmmap 49 684 , 24 866
, CFG ? CFG , ? .
β VAllocStress, . 64- CFG, , , , . , / , , . VAllocStress:
- :
- :
- 500 ( ).
- VirtualAlloc .
- , VirtualAlloc ~500
- .
. . , . , VirtualScan VAllocStress. , CFG ,
. VAllocStress !
CFG, . !
, JavaScript- v8 CodeRange , CodeRange
128 . , , CFG, .
, CodeRange, , ? CodeRange, Gmail β . ( ) CodeRange. , WorkerThread::Start . :
- Gmail -, , .
- , -.
- CodeRange, JITted- JavaScript 47- .
- CFG 2 .
- CFG .
- NtQueryVirtualMemory CFG ( 1 ) , .
CFG Windows 10 RS4 ( 2018 ), , . , .
CFG β . CFG , . . , CFG ! , . CFG . ,
2 !
, β Gmail 353,3 CFG 59,2 , 400 . - , .
v8 ( JavaScript Chrome) ,
CodeRange, . Microsoft CFG. , - Microsoft CFG , , , . vmmap .
. :
- Gmail.
- Windows 10.
- IT- WMI- .
- .
- .
, , , . , , , , .
, 10:30 , IT- . ,
Control Panel β
Configuration Manager β
Actions,
Hardware Inventory Cycle Run Now.

, VAllocStress VirtualScan
Github.
. ( ), (), ( WMI). vmmap. β β
crbug.com/870054.
UPD.