我没有找麻烦。
周末我没有开始Chrome的构建过程
一千次 ,而只是完成了21世纪最常见的任务-我只是在早上10:30撰写了一封电子邮件。 突然Gmail挂断了。 我继续打印了几秒钟,但屏幕上没有出现字符。 然后突然Gmail下沉,我返回了
非常重要的电子邮件。 但是后来一切都重复了,只是这次Gmail不再回答请求了。
这很奇怪 ...
难以抗拒进行良好调查的机会,但是在这种情况下,挑战尤其艰巨。 毕竟,我在Google致力于改善Windows版Chrome的性能。 找出冻结的原因是我的
工作 。 经过许多错误的开始和艰苦的工作之后,我仍然设法找出Chrome,Gmail,Windows和我们的IT部门如何共同阻止我键入电子邮件。 在此过程中,有一种方法可以为Chrome中的某些网页节省大量内存。
调查中有许多细微差别,我将在
另一篇文章中
再作介绍 ,现在我将充分解释中止的原因。
像往常一样,
UIforETW在我的后台工作并监视循环缓冲区,因此我只需要输入Ctrl + Win + R-即可将缓冲区保存到磁盘上大约系统活动的最后三十秒。 我将它们下载到
Windows Performance Analyzer (WPA)中,但无法永久安装该冻结。
当Windows程序停止发送消息时,将引发ETW事件,以指示
发生的确切位置 ,因此查找这些类型的挂起很简单。 但显然,Chrome继续发送消息。 我看了一会儿,关键的Chrome流之一进入活动周期或完全空闲,但没有发现任何明显的东西。 在某些地方,Chrome
大多处于闲置状态,但即使如此,所有关键线程仍会继续工作,因此您无法确定挂起的位置-在没有事件的情况下,Chrome可能处于闲置状态:


UIforETW具有内置的键盘记录器,通常在标识跟踪中的关键点时很有用。 但是,出于明显的安全原因,默认情况下,它会匿名化击键,将输入的每个数字都视为“ 1”,将每个字母视为“ A”。 这使得很难找到确切的冻结时刻,因此我将跟踪的类型从“私有”更改为“完整”,并期望冻结。 第二天早上10:30左右,挂断重复。 我保存了跟踪缓冲区,并将此标记保存在UIforETW跟踪信息字段中:
他输入“为那些有更多水肺潜水经验的人推迟”-Gmail停在“那些”一词的结尾,然后恢复“经验”一词的工作。 Gmail标签为PID 27368。
这是关于
如何到达办公室的常见讨论,但重要的是,现在有一种方法可以在ETW跟踪中找到一个隐患。 我加载跟踪,查看“通用事件”字段中的键盘记录器数据(事件由UIforETW本身发出,并且每个事件在下面的屏幕快照中都是紫色菱形)-我可以立即看到挂起发生的位置,这与CPU使用率的失败明显相关:

好的,但是为什么Chrome停止了? 这里有一些提示:屏幕快照并不显示每次
WmiPrvSE.exe完全使用CPU超线程。 但这无关紧要。 我的机器有24个内核/ 48个线程,因此消耗一个超线程意味着该系统仍是98%空闲的。
然后,我进入了一个明显重要的时期,即Chrome处于空闲状态-特别是研究了chrome.exe(27368)中与Gmail标签相对应的CrRendererMain进程。
注意:我要对2015年以来的我表示感谢,感谢我要求Microsoft改进流命名机制,并感谢Microsoft实施了所有建议-WPA中的线程名称非常好!
问题解决了。 在2.81秒的挂起期间,此线程按计划启动了440次。 通常,每6毫秒启动一次足以使程序响应,但是由于某种原因却没有发生。 我注意到,每次他醒来时,他都在同一个堆栈中。 为了简化:
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.