لماذا يقرأ Windows ملفًا واحدًا لمائة ألف مرة لفتح قائمة؟


"يقضي Explorer 700 مللي ثانية لفتح قائمة السياق بشريط المهام. 75٪ من هذا الوقت ، ينفذ 114،801 عملية قراءة من ملف واحد ، ومتوسط ​​كمية بيانات القراءة 68 بايت.

يجب أن أكتب وظيفة عن هذا ، أو سقسقة نوعا ما؟

أنا أعمل بسرعة على جهاز كمبيوتر ، وبالتالي يزعجني عندما يتعين علي انتظار انتهاء العملية ، والتي يجب إجراؤها على الفور. كان هناك عائق مستمر على الكمبيوتر المحمول المنزلي شديد التحمل وهو الإغلاق البطيء للنوافذ على شريط المهام. انقر بزر الماوس الأيمن فوق الرمز ، وانتظر حتى تفتح القائمة ، ثم حدد "إغلاق النافذة". يجب أن تكون حركات الماوس هي الأبطأ في هذه العملية ، ولكن تبين أن أطول مكون هو التأخير قبل ظهور القائمة.

هذا أزعجني لفترة طويلة ، لكنني أظهرت ضبط النفس غير معقد وابتعدت عني. كان ذلك حتى اليوم ، عندما كسرت أخيرًا وأمسكت بتتبع ETW .

تتم كتابة هذا المنشور كتحقق من سرعة التدوين. مرت حوالي 90 دقيقة من اللحظة التي تم فيها العثور على المشكلة والتغريدة الساخرة حول هذا الموضوع حتى نشر المنشور.

حدد تتبع ETW كيف أقوم بالنقر بزر الماوس الأيمن على شريط المهام وأغلق نافذتي Explorer. لقد استخدمت تتبع UIforETW لملف الوظيفة باستخدام الخيارات الافتراضية ، مما أدى إلى سجل تشخيصي يبلغ 20.9 ميغابايت .

في بعض الأحيان ، يكون الجزء الأصعب في تحليل التتبع هو العثور على موقع المشكلة ، ولكن في هذه الحالة يكون هذا الجزء من التحليل بسيطًا. كانت هناك ثلاث إشارات لا لبس فيها تشير إلى المكان الصحيح ، والجاني الواضح المؤلم للجريمة.

كانت الإشارة الأولى أحداث الإدخال. يحتوي UIforETW على مُسجل إدخال متكامل (مجهول الهوية بشكلٍ كافٍ حتى لا أسرق كلمات المرور أو المعلومات الشخصية بطريق الخطأ) ، لذلك كان عليّ فقط دراسة أحداث MouseUp و Button Type بالتفصيل بقيمة 2 المقابلة لزر الماوس الأيمن. في الوقت نفسه ، تظهر علامات على الجدول الزمني WPA عند حدوث هذه الأحداث - راجع الخطوط العمودية في لقطة الشاشة:


هذا أوضح لي أنه عندما أطلق زر الفأرة الأيمن ، بعد 600 مللي ثانية ، يتغير تركيز النافذة ، والذي ، في رأيي ، يتوافق مع لحظة عرض القائمة. بالإضافة إلى ذلك ، يحتوي RuntimeBroker.exe على كتلة واضحة من نشاط وحدة المعالجة المركزية بين أحداث تحرير زر الماوس وتغيير تركيز الإطار.

لم يتم إثبات أن التغيير في تركيز النافذة ونشاط وحدة المعالجة المركزية مرتبطان ، لكن بعد أخذ القياسات باستخدام تطبيق تسجيل الشاشة ، رأيت أن الأمر يستغرق حوالي 660 مللي ثانية لعرض القائمة ، ولذا فإنني أميل إلى الوثوق بذلك.

والخطوة التالية هي معرفة ما تقوم به RuntimeBroker.exe. على الرغم من أن استخدام CPU (دقيق) يساعدك على معرفة مقدار وقت وحدة المعالجة المركزية الذي تستخدمه العملية ولماذا يكون خاملاً ، فإن جدول استخدام وحدة المعالجة المركزية (Sampled) يعد أداة جيدة لمعرفة ما يقضيه وقت وحدة المعالجة المركزية. لقد درستها بعناية ووجدت بسرعة أن 264 عينة كانت من KernelBase.dll!


بعد البحث أكثر من ذلك بقليل ، وجدت مكدسات مكالمات أخرى أثرت أيضًا على هذه الوظيفة ، لذلك قمت بالنقر بزر الماوس الأيمن عليها وحدد عرض المتصلين> حسب الوظيفة . أظهر الوضع الذي تم تشغيله (مع مكدسات مقلوبة) أنه من بين 899 عينة من هذه العملية ، 628 عينة ، أو 70٪ ، من مكدسات استدعاء مختلفة مرت عبر هذه الوظيفة:


لم تمر 271 عينة في هذا التيار من خلال الوظيفة ، وكانت العينات المتبقية (غير موضحة) في تدفقات أخرى.

لاحظ أن 899 عينة في دفق من 10 252 تمثل نقرتين بالماوس ، أي حوالي 450 عينة أو 450 مللي ثانية (بتردد أخذ العينات القياسي يبلغ 1 كيلو هرتز) لكل نقرة بالماوس.

في بعض الأحيان يكون الملف I / O هو وقت وحدة المعالجة المركزية


يُظهر استخدام وحدة المعالجة المركزية (أخذ العينات) وقت وحدة المعالجة المركزية ، لذلك عادةً لا يتم عرض القرص I / O هنا ، لأن الدفق في هذه اللحظات ينام وينتظر القرص. حقيقة أن عمليات الإدخال / الإخراج يتم عرضها كوقت وحدة المعالجة المركزية تعني أن جميع القراءات قد سقطت على ذاكرة التخزين المؤقت للنظام وأن وقت وحدة المعالجة المركزية كان موردًا إضافيًا لـ kernel (راجع ntoskrnl.exe في مكدس استدعاء العينات الأول) الذي تم إنفاقه على الحصول على البيانات من ذاكرة التخزين المؤقت.

الآن أصبح الملف I / O موضع شك ، نحتاج إلى الانتقال إلى Graph Explorer-> Storage-> File I / O. بعد تعديل مظهر الأعمدة قليلاً ، حصلنا على النتيجة المذهلة التالية:


, 10 252 RuntimeBroker.exe 229 604 ReadFile, 15 686 586 . 68 .

.

, — . , RuntimeBroker.exe . 4 027 904 , , , 1,9 .

, . , ( ):

%appdata%\Microsoft\Windows\Recent\AutomaticDestinations\f01b4d95cf55d32a.automaticDestinations-ms

WPA. — , . :

Image

« „“, ( ) ( ) „“/ . , ». , !

, . , , , .


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


All Articles