24核CPU,但我无法输入电子邮件

我没有找麻烦。 周末我没有开始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:

  1. :
    • VirtualAlloc .
    • .
  2. :
    • 500 ( ).
    • VirtualAlloc .
    • , VirtualAlloc ~500 
    • .

. . , . , VirtualScan VAllocStress. , CFG , . VAllocStress !

CFG, . !


, JavaScript- v8 CodeRange , CodeRange 128 . , , CFG, .

, CodeRange, , ? CodeRange, Gmail — . ( ) CodeRange. , WorkerThread::Start . :

  1. Gmail -, , .
  2. , -.
  3. CodeRange, JITted- JavaScript 47- .
  4. CFG 2 .
  5. CFG .
  6. 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 PanelConfiguration ManagerActions, Hardware Inventory Cycle Run Now.




, VAllocStress VirtualScan Github.


. ( ), (), ( WMI). vmmap. — — crbug.com/870054.

UPD.

Source: https://habr.com/ru/post/zh-CN420579/


All Articles