Processeur 24 cƓurs, mais je ne peux pas taper un e-mail

Je n'ai pas cherché d'ennuis. Je n'ai pas commencé mille fois le processus de création de Chrome au cours du week-end , mais je n'ai effectué que les tùches les plus courantes du 21e siÚcle - je viens d'écrire un e-mail à 10h30 du matin. Et soudain, Gmail s'est accroché. J'ai continué à imprimer pendant quelques secondes, mais aucun caractÚre n'est apparu à l'écran. Puis soudainement, Gmail s'est affaissé et je suis retourné à mon e-mail trÚs important . Mais plus tard, tout s'est répété, mais cette fois, Gmail n'a plus répondu aux demandes. C'est étrange ...

Il est difficile de rĂ©sister Ă  l'opportunitĂ© de mener une bonne enquĂȘte, mais dans ce cas, le dĂ©fi est particuliĂšrement important. AprĂšs tout, je travaille chez Google pour amĂ©liorer les performances de Chrome pour Windows. DĂ©couvrir la cause du gel est mon travail . Et aprĂšs beaucoup de faux dĂ©parts et de dur labeur, j'ai quand mĂȘme rĂ©ussi Ă  dĂ©couvrir comment Chrome, Gmail, Windows et notre service informatique m'ont empĂȘchĂ© ensemble de taper un e-mail. En cours de route, il y avait un moyen d'Ă©conomiser une quantitĂ© importante de mĂ©moire pour certaines pages Web dans Chrome.

Il y avait tellement de nuances dans l'enquĂȘte que je vais en laisser un autre pour un article , et maintenant je vais expliquer en dĂ©tail les raisons des suspensions.

Comme d'habitude, UIforETW fonctionne en arriÚre-plan et surveille les tampons circulaires, j'ai donc juste eu à taper Ctrl + Win + R - et les tampons ont été enregistrés sur le disque pendant environ les trente derniÚres secondes d'activité du systÚme. Je les ai téléchargés dans Windows Performance Analyzer (WPA), mais je n'ai pas pu installer définitivement le gel.

Lorsque le programme Windows cesse d'envoyer des messages, des Ă©vĂ©nements ETW sont lancĂ©s indiquant exactement oĂč cela s'est produit , il est donc trivial de trouver ces types de blocages. Mais apparemment, Chrome a continuĂ© d'envoyer des messages. J'ai cherchĂ© un moment oĂč l'un des principaux flux Chrome est entrĂ© dans le cycle actif ou Ă©tait complĂštement inactif, mais n'a rien trouvĂ© d'explicite. Il y avait des endroits oĂč Chrome restait essentiellement inactif, mais mĂȘme alors, tous les threads clĂ©s continuaient de fonctionner, vous ne pouviez donc pas ĂȘtre sĂ»r oĂč le blocage s'Ă©tait produit - Chrome pouvait simplement rester inactif en l'absence d'Ă©vĂ©nements:



UIforETW a un enregistreur de frappe intégré, qui est souvent utile pour identifier les points clés dans une trace. Cependant, pour des raisons de sécurité évidentes, il rend par défaut les frappes anonymes, traitant chaque numéro entré comme «1» et chaque lettre comme «A». Cela rend difficile de trouver le moment exact du gel, j'ai donc changé le type de trace de «privé» à «complet» et je m'attendais à un gel. Vers 10h30 le lendemain matin, le raccrochage s'est répété. J'ai enregistré les tampons de trace et enregistré cette marque dans le champ d'informations de trace UIforETW:

Il a tapé «reporter pour ceux qui ont plus d'expérience avec la plongée sous-marine» - et Gmail a fait une pause à la fin du mot «ceux», puis a repris le travail dans le domaine du mot «expérience». Onglet Gmail avec PID 27368.

Il s'agit d'une discussion courante sur les moyens de se rendre au bureau , mais il est important qu'il existe maintenant un moyen de trouver un blocage dans la trace ETW. Je charge la trace, regarde les donnĂ©es de l'enregistreur de frappe dans le champ ÉvĂ©nements gĂ©nĂ©riques (les Ă©vĂ©nements sont Ă©mis par UIforETW eux-mĂȘmes, et chacun est un losange violet dans la capture d'Ă©cran ci-dessous) - et je vois immĂ©diatement oĂč le blocage s'est produit, avec lequel la dĂ©faillance de l'utilisation du processeur est clairement corrĂ©lĂ©e:



D'accord, mais pourquoi Chrome s'est-il arrĂȘtĂ©? Voici quelques conseils: les captures d'Ă©cran ne montrent pas que chaque fois que WmiPrvSE.exe utilise pleinement l'hyperthread du processeur. Mais cela ne devrait pas avoir d'importance. Ma machine a 24 cƓurs / 48 threads, donc la consommation d'un hyper-thread signifie que le systĂšme est toujours gratuit Ă  98%.

Puis j'ai approchĂ© une pĂ©riode clairement importante oĂč Chrome Ă©tait inactif - et j'ai regardĂ©, en particulier, le processus CrRendererMain dans chrome.exe (27368), correspondant Ă  l'onglet Gmail.

Remarque: Je tiens Ă  me remercier de 2015 pour avoir demandĂ© Ă  Microsoft d'amĂ©liorer les mĂ©canismes de dĂ©nomination des flux, et merci Ă  Microsoft d'avoir mis en Ɠuvre toutes les suggestions - les noms de threads dans WPA sont tout simplement gĂ©niaux!

Le problĂšme s'est Ă©clairci. Lors d'un blocage de 2,81 secondes, ce thread a Ă©tĂ© dĂ©marrĂ© 440 fois. En rĂšgle gĂ©nĂ©rale, le dĂ©marrage toutes les 6 ms est suffisant pour rendre le programme rĂ©actif, mais pour une raison quelconque, cela ne s'est pas produit. J'ai remarquĂ© que chaque fois qu'il se rĂ©veillait, il Ă©tait sur la mĂȘme pile. Pour simplifier:

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 Panel → Configuration Manager → Actions, Hardware Inventory Cycle Run Now.




, VAllocStress VirtualScan Github.


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

UPD.

Source: https://habr.com/ru/post/fr420579/


All Articles