التنازع وضعف الأداء وحالات التوقف التام عند إجراء استدعاءات لخدمات ويب من أحد تطبيقات ASP.NET

الأعراض

عند إجراء استدعاءات لخدمات ويب من تطبيق Microsoft ASP.NET، قد تواجهك التنازع وضعف الأداء وحالات التوقف التام. عملاء قد تقرير أن طلبات إيقاف الاستجابة (أو "تعليق") أو تستغرق وقتاً طويلاً للتنفيذ. في حالة الاشتباه في حالة توقف تام، قد يتم إعادة استخدام عملية العامل. قد تتلقى الرسائل التالية في سجل أحداث التطبيق.
  • إذا كنت تستخدم 5.0 من خدمات معلومات إنترنت (IIS)، تتلقى الرسائل التالية في سجل التطبيق:
  • إذا كنت تستخدم IIS 6.0، تتلقى الرسائل التالية في سجل التطبيق:
  • إذا كنت تستخدم IIS 6.0، تتلقى الرسائل التالية في سجل النظام:
قد تتلقى أيضا رسالة خطأ استثناء التالية عندما تقوم باستدعاء الأسلوب HttpWebRequest.GetResponse :
"System.InvalidOperationException: لم يكن هناك مؤشرات ترابط حرة كافية في كائن ThreadPool object لإكمال العملية."
قد تتلقى أيضا رسالة الخطأ التالية استثناء في المستعرض:
"HttpException (0x80004005): انتهت مهلة الطلب."
ملاحظة: تنطبق هذه المقالة أيضا على التطبيقات التي تقدم طلبات HttpWebRequest مباشرة.

السبب

قد تحدث هذه المشكلة لأن ASP.NET يحدد عدد مؤشرات ترابط العامل ومؤشرات الترابط منفذ الإكمال استخدام مكالمة لتنفيذ الطلبات.

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

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

مصدر نزاع محتمل آخر هو المعلمة maxconnection يستخدم مساحة الاسم النظام لتحديد عدد الاتصالات. وبشكل عام، هذا الحد يعمل كما هو متوقع. ومع ذلك، إذا حاول العديد من التطبيقات تقديم طلبات كثيرة إلى عنوان IP واحد في نفس الوقت، قد مؤشرات الترابط لانتظار اتصال متوفرة.

الحل

لحل هذه المشكلات، يمكنك ضبط المعلمات التالية في الملف Machine.config ليناسب الموقف لديك:
  • ماكسووركيرثريدس
  • مينووركيرثريدس
  • ماكسيوثريدس
  • minFreeThreads
  • مينلوكالريقويستفريثريدس
  • maxconnection
  • ب executionTimeout
لحل هذه المشاكل بنجاح، اتخاذ الإجراءات التالية:
  • تحديد عدد طلبات ASP.NET التي يمكن تنفيذها في نفس الوقت إلى 12 تقريبا كل وحدة المعالجة المركزية.
  • تسمح عمليات الاسترجاعات خدمة ويب لاستخدام مؤشرات الترابط بحرية في قام.
  • حدد قيمة مناسبة للمعلمة maxconnections . قاعدة التحديد لعدد عناوين IP و AppDomains التي يتم استخدامها.
ملاحظة: التوصية المتعلقة بالحد من عدد طلبات ASP.NET إلى 12 كل وحدة المعالجة المركزية عشوائية بقليل. ومع ذلك، أثبت هذا الحد العمل بشكل جيد لمعظم التطبيقات.

ماكسووركيرثريدس وماكسيوثريدس

يستخدم ASP.NET إعدادات التكوين التالية لتحديد العدد الأقصى لمؤشرات ترابط العامل ومؤشرات ترابط إنجاز المستخدمة:
<processModel maxWorkerThreads="20" maxIoThreads="20">
المعلمة ماكسووركيرثريدس والمعلمة ماكسيوثريدس ضمنياً ضرب عدد وحدات المعالجة المركزية. على سبيل المثال، إذا كان لديك معالجين، الحد الأقصى لعدد مؤشرات الترابط العاملة هي ما يلي:
2*maxWorkerThreads

minFreeThreads و مينلوكالريقويستفريثريدس

يحتوي ASP.NET على إعدادات التكوين التالية التي تحدد عدد مؤشرات ترابط العامل ومؤشرات ترابط منفذ الإكمال يجب أن تتوفر لبدء طلب محلي أو طلب بعيد:
<httpRuntime minFreeThreads="8" minLocalRequestFreeThreads="8">
إذا لا تتوفر مؤشرات الترابط كافية، الطلب في قائمة الانتظار حتى يتم كافية مؤشرات الترابط الحر لإجراء الطلب. ولذلك، ASP.NET لن يقوم بتنفيذ أكثر من عدد الطلبات التالية في نفس الوقت:
(ماكسووركيرثريدس*عدد وحدات المعالجة المركزية)-minFreeThreads
ملاحظة: المعلمة minFreeThreads والمعلمة مينلوكالريقويستفريثريدس يتم لا ضمنياً ضرب عدد وحدات المعالجة المركزية.

مينووركيرثريدس

اعتبارا من ASP.NET 1.0 Service Pack 3 و ASP.NET 1.1 ASP.NET أيضا على إعداد التكوين التالي الذي يحدد عدد مؤشرات ترابط العامل قد تتاح فورا لمعالجة طلب بعيد.
<processModel minWorkerThreads="1">
يمكن إنشاء مؤشرات الترابط التي يتم التحكم فيها من قبل هذا الإعداد بمعدل أسرع كثير من مؤشرات الترابط العاملة التي يتم إنشاؤها من إمكانيات "ضبط مؤشر الترابط" الافتراضية الخاصة ب CLR. هذا الإعداد تمكين طلبات ASP.NET للخدمة التي قد يتم تعبئة قائمة انتظار طلبات ASP.NET نظراً لتباطؤ على ملقم الجهة الخلفية فجأة، موجه مفاجئة من الطلبات المقدمة من طرف العميل أو شيء من هذا القبيل يؤدي ارتفاع مفاجئ في عدد الطلبات في قائمة الانتظار. هو القيمة الافتراضية للمعلمة مينووركيرثريدس 1. نوصي بتعيين قيمة للمعلمة مينووركيرثريدس إلى القيمة التالية.
minWorkerThreads = maxWorkerThreads / 2
بشكل افتراضي، المعلمة مينووركيرثريدس غير موجود في ملف Web.config أو في الملف Machine.config. هذا الإعداد ضمنياً مضروباً في العدد من وحدات المعالجة المركزية.

maxconnection

تحدد المعلمة maxconnection عدد الاتصالات الممكنة يصبح لعنوان IP خاص. يظهر المعلمة كما يلي:
<connectionManagement>    <add address="*" maxconnection="2">
<add address="http://65.53.32.230" maxconnection="12">
</connectionManagement>
إذا كانت التعليمات البرمجية للتطبيق الرجوع إلى التطبيق حسب اسم المضيف بدلاً من عنوان IP، يجب أن يظهر المعلمة كما يلي:
<connectionManagement>    <add address="*" maxconnection="2">
<add address="http://hostname" maxconnection="12">
</connectionManagement>
وأخيراً، إذا تم استضافة التطبيق على منفذ مختلف 80، المعلمة يجب أن يشمل المنفذ غير قياسي في URI، مشابهة لما يلي:
<connectionManagement>    <add address="*" maxconnection="2">
<add address="http://hostname:8080" maxconnection="12">
</connectionManagement>
كافة الإعدادات الخاصة بالمعلمات التي تمت مناقشتها سابقا في هذه المقالة عند مستوى العملية. ومع ذلك، يتم تطبيق الإعداد معلمة maxconnection إلى مستوى مجال التطبيق. بشكل افتراضي، لأنه يتم تطبيق هذا الإعداد على مستوى مجال التطبيق، يمكنك إنشاء اتصالات اثنين كحد أقصى لعنوان IP خاص من كل AppDomain في العملية.

ب executionTimeout

يستخدم ASP.NET تكوين الإعداد التالي لتحديد وقت تنفيذ الطلب:
<httpRuntime executionTimeout="90"/>
يمكنك أيضا تعيين هذا الحد باستخدام الخاصية Server.ScriptTimeout .

ملاحظة: إذا قمت بزيادة قيمة المعلمة ب executionTimeout ، قد يلزم أيضا تعديل إعداد المعلمة processModel responseDeadlockInterval .

التوصيات

قد لا تعمل الإعدادات الموصى بها في هذا القسم لكافة التطبيقات. ومع ذلك، قد تساعد المعلومات الإضافية التالية بإجراء التعديلات المناسبة.

إذا كنت تجري واحد استدعاء خدمة ويب إلى عنوان IP واحد من كل صفحة ASPX، توصي Microsoft باستخدام إعدادات التكوين التالية:
  • تعيين قيم المعلمة ماكسووركيرثريدس والمعلمة ماكسيوثريدس إلى 100.
  • تعيين قيمة المعلمة maxconnection إلى 12 *N (حيث N هو عدد وحدات المعالجة المركزية التي لديك).
  • تعيين قيم المعلمة minFreeThreads إلى 88 *N والمعلمة مينلوكالريقويستفريثريدس إلى76 *N.
  • تعيين قيمة مينووركيرثريدس إلى 50. تذكر أن مينووركيرثريدس غير موجود في ملف التكوين بشكل افتراضي. يجب إضافته.
بعض هذه التوصيات تتضمن صيغة بسيطة تتضمن عدد وحدات المعالجة المركزية على خادم. المتغير الذي يمثل عدد وحدات المعالجة المركزية في الصيغ هو ن. هذه الإعدادات إذا كان لديك توازي تشغيل مؤشرات الترابط ممكناً، يجب استخدام عدد المعالجات المنطقية بدلاً من عدد وحدات المعالجة المركزية الفعلية. على سبيل المثال، إذا كان لديك ملقم رباعي المعالج مع تمكين توازي تشغيل مؤشرات الترابط، ثم ن في الصيغ ستكون القيمة 8 بدلاً من 4.

ملاحظة: عند استخدام هذا التكوين، يمكنك تنفيذ طلبات ASP.NET 12 في وحدة المعالجة المركزية كحد أقصى في نفس الوقت لأن 100 88 = 12. ولذلك، يقل عن 88 * مؤشرات ترابط العاملN و 88 * تتوفر مؤشرات الترابط منفذ الإكمالN للاستخدامات الأخرى (مثل عمليات الاسترجاعات خدمة ويب).

على سبيل المثال، لديك ملقم ذو أربعة معالجات وتمكين توازي تشغيل مؤشرات الترابط. استناداً إلى هذه الصيغ، يمكنك استخدام القيم التالية لتكوين الإعدادات الموضحة في هذه المقالة.
<system.web><processModel maxWorkerThreads="100" maxIoThreads="100" minWorkerThreads="50"/>
<httpRuntime minFreeThreads="704" minLocalRequestFreeThreads="608"/>
</system.web>

<system.net>
<connectionManagement>
<add address="[ProvideIPHere]" maxconnection="96"/>
</connectionManagement>
</system.net>

أيضا، عند استخدام هذا التكوين، اتصالات 12 تتوفر كل وحدة المعالجة المركزية كل عنوان IP لكل AppDomain. ولذلك، في السيناريو التالي، حالما قليل جداً عند انتظار طلبات للاتصالات، وقام عدم استنفاد:
  • الويب يستضيف تطبيق واحد فقط (AppDomain).
  • يجعل كل طلب صفحة ASPX طلب خدمة ويب واحد.
  • يتم تقديم كافة الطلبات إلى عنوان IP نفسه.
ومع ذلك، عند استخدام هذا التكوين، وحدات السيناريو التي تتضمن أي مما يلي ربما ستستخدم اتصالات عديدة:
  • يتم تقديم الطلبات إلى عناوين IP متعددة.
  • يتم تقديم الطلبات المعاد توجيهها (رمز الحالة 302).
  • تتطلب طلبات المصادقة.
  • طلبات من AppDomains متعددة.
في هذه السيناريوهات، أنها لفكرة جيدة أن يتم استخدام أقل قيمة للمعلمة maxconnection وأعلى قيم المعلمة minFreeThreads والمعلمة مينلوكالريقويستفريثريدس .

الحالة

يعتبر هذا السلوك حسب التصميم.

مزيد من المعلومات

إذا كنت تعاني من ضعف الأداء والتنازع على IIS 7.0 جنبا إلى جنب مع ASP.NET، انتقل إلى المدونات Microsoft التالية:

المراجع

لمزيد من المعلومات، انتقل إلى موقع شبكة مطوري Microsoft (MSDN) التالي على الويب:
خصائص

رقم الموضوع: 821268 - آخر مراجعة: 15‏/01‏/2017 - المراجعة: 1

تعليقات