لم ابحث عن المتاعب. لم أبدأ عملية إنشاء Chrome
ألف مرة خلال عطلة نهاية الأسبوع ، لكنني قمت فقط بالمهام الأكثر شيوعًا في القرن الحادي والعشرين - لقد كتبت للتو بريدًا إلكترونيًا في الساعة 10:30 صباحًا. وفجأة علق Gmail. تابعت الطباعة لبضع ثوانٍ ، ولكن لم تظهر أي أحرف على الشاشة. ثم فجأة انكمش Gmail وعدت إلى بريدي الإلكتروني
المهم للغاية . ولكن في وقت لاحق تكرر كل شيء ، فقط هذه المرة لم يرد Gmail على الطلبات لفترة أطول.
هذا غريب ...
من الصعب مقاومة فرصة إجراء تحقيق جيد ، ولكن في هذه الحالة يكون التحدي قوياً بشكل خاص. بعد كل شيء ، أنا في Google أعمل على تحسين أداء Chrome لنظام التشغيل Windows.
وظيفتي هي معرفة سبب التجميد. وبعد الكثير من البدايات الخاطئة والعمل الشاق ، تمكنت من معرفة كيف منعني Chrome و Gmail و Windows وقسم تكنولوجيا المعلومات معًا من كتابة بريد إلكتروني. على طول الطريق ، كانت هناك طريقة لحفظ قدر كبير من الذاكرة لبعض صفحات الويب في 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. أقوم بتحميل التتبع ، وإلقاء نظرة على بيانات keylogger في حقل الأحداث العامة (يتم إصدار الأحداث بواسطة UIforETW بأنفسهم ، وكل واحد هو دالتون أرجواني في لقطة الشاشة أدناه) - ويمكنني أن أرى على الفور مكان حدوث التعليق ، والذي يرتبط به الفشل في استخدام وحدة المعالجة المركزية بشكل واضح:

حسنًا ، ولكن لماذا توقف Chrome؟ فيما يلي بعض التلميحات: لا تُظهر لقطات الشاشة أنه في كل مرة يستخدم فيها
WmiPrvSE.exe بشكل كامل موضوع وحدة المعالجة المركزية. لكن هذا لا يهم. تحتوي جهازي على 24 نواة / 48 خيطًا ، لذا فإن استهلاك خيط مفرط يعني أن النظام لا يزال مجانيًا بنسبة 98٪.
ثم اقتربت من فترة مهمة بشكل واضح عندما كان Chrome خاملاً - ونظرت على وجه الخصوص في عملية CrRendererMain في chrome.exe (27368) ، المقابلة لعلامة التبويب Gmail.
ملاحظة: أود أن أقول شكري لنفسي من عام 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.