حدد من/ما الذي قام بحجز 5.5 جيجابايت من الذاكرة الظاهرية في w3wp.exe

StackOverflow https://stackoverflow.com/questions/355934

سؤال

على جهازي (XP، 64) يتم تشغيل العملية المنفذة لـ ASP.net (w3wp.exe) دائمًا مع حجز 5.5 جيجابايت من الذاكرة الظاهرية.يحدث هذا بغض النظر عن تطبيق الويب الذي يستضيفه (يمكن أن يكون أي شيء، حتى صفحة ويب فارغة في aspx).

يتم حجز هذه القطعة القديمة الكبيرة من الذاكرة الافتراضية في لحظة بدء العملية، لذلك لا يعد هذا "تسربًا" تدريجيًا للذاكرة من نوع ما.

يُظهر بعض التطفل باستخدام Windbg أن الذاكرة الخاصة هي "خاصة" و"محجوزة" و"RegionUsageIsVAD"، مما يشير إلى أنها قد تكون من عمل شخص يتصل بـ VirtualAlloc.ويظهر أيضًا أن الذاكرة المعنية يتم تخصيصها/حجزها في 4 أجزاء كبيرة تبلغ مساحة كل منها 1 جيجابايت وعدة أجزاء أصغر (1/4 جيجابايت لكل منها).

لذا أعتقد أنني بحاجة لمعرفة من يتصل بـ VirtualAlloc ويحجز كل هذه الذاكرة.كيف يمكنني فعل ذلك؟

يعد إرفاق مصحح أخطاء بالعملية قبل تخصيص الذاكرة أمرًا صعبًا، لأن w3wp.exe هي عملية تم إطلاقها بواسطة svchost.exe (أي عامل تصفية IIS/ASP.Net) وإذا حاولت تشغيلها بنفسي لتصحيح أخطائها يتم إغلاقه دون كل هذا الحجز الغزير للذاكرة.كما أن معلمات سطر الأوامر تكون غير صالحة إذا قمت بإعادة استخدامها (وهذا أمر منطقي لأنه عبارة عن أنبوب تم إنشاؤه بواسطة عملية الاستدعاء).

يمكنني إرفاق Windbg بالعملية بعد حدوثها (وهكذا وجدت مناطق الذاكرة المعنية)، لكنني لست متأكدًا من أنه من الممكن في هذه المرحلة تحديد من قام بتخصيص ما.

هل كانت مفيدة؟

المحلول

ديفيد وانغ يجيب على هذا لسؤال مماثل:

[...] أخبرني مطور أداء ASP.Net بما يلي:

  • الذاكرة الافتراضية المحجوزة لا داعي للقلق.يمكنك مشاهدته كشرط أساسي للأداء/التخزين المؤقت لـ CLR.ويظهر اختبار الحمل الثقيل أنه لا يوجد ما يدعو للقلق.
  • System.windows.forms - لا يتم سحبها بواسطة صفحة Hello World Aspx فارغة.يمكنك استخدام أدوات تصحيح الأخطاء Microsoft و "sx e ld system.windows.forms" لتحديد ما هو بالفعل سحبها في وقت التشغيل.أو يمكنك ildasm للعثور على التبعية.
  • mscorlib - تأكد من أنه GAC'd وNGen'd بشكل صحيح.

نصائح أخرى

الذاكرة الظاهرية هي مجرد مساحة العنوان المخصصة للعملية.ليس له علاقة باستخدام الذاكرة.

يرى:

  1. ذاكرة افتراضية
  2. دفع حدود ويندوز:ذاكرة افتراضية
  3. http://support.microsoft.com/kb/555223

محفوظة ذاكرة مختلفة جدا عن المخصصة الذاكرة. حجز الذاكرة فقط يخصص مساحة العنوان. أنه لا يلزم أي الصفحات الفعلية.

وعلى الأرجح يتم تخصيص مساحة العنوان هذا من قبل IIS لكومة لها. وسوف تلتزم فقط الصفحات عند الحاجة.

إذا كنت تريد حقا أن إطلاق w3wp.exe من windbg، وربما كنت بحاجة لإطلاقه مع وسائط سطر الأوامر سارية المفعول. يمكنك استخدام عملية اكسبلورر لتحديد ما سطر الأوامر للتيار عملية w3wp.exe هي. على سبيل المثال، في خدمة بلدي، والألغام كان:

<اقتباس فقرة>   

ج: \ ويندوز \ SYSTEM32 \ inetsrv \ w3wp.exe -a \ \ الأنابيب \ iisipmeca56ca2-3a28-452a-9ad3-9e3da7b7c765 -t 20 -ap "DefaultAppPool"

ولست متأكدا ما UID هناك يحدد، ولكن يبدو أنه ربما انها ولدت على الطاير من قبل خدمة W3SVC (وهو ما أطلق w3wp.exe) لتسمية الأنابيب محددة فيها. لذلك يجب أن ننظر بالتأكيد في سطر الأوامر الخاص بك قبل إطلاق w3wp من windbg.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top