24 وحدة معالجة مركزية ، ولكن لا يمكنني كتابة بريد إلكتروني

لم ابحث عن المتاعب. لم أبدأ عملية إنشاء 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:

  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/ar420579/


All Articles