مشكلة في أداء IIS أثناء محاولة تنفيذ بروتوكول يشبه XMPP

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

سؤال

لدينا عميل يحتاج إلى الحصول على رسائل تفاعلية من الخادم، من العملاء الموزعين حول العالم خلف جميع أنواع جدران الحماية مع إغلاق جميع أنواع المنافذ.الشيء الوحيد الذي يمكننا الاعتماد عليه هو منفذ HTTP 80 (و HTTPS 443).

تم تصميم التصميم بشكل أساسي على غرار XMPP (بروتوكول Jabber)، باستخدام عميلنا وIIS.يصدر العميل طلبات GET إلى معالج .NET؛يقوم المعالج بإبقاء الطلب مفتوحًا لفترة من الوقت للبحث عن الرسائل.في حالة وصول أي رسائل، يتم إرسالها على الفور إلى العميل؛إذا لم يكن الأمر كذلك، بعد انتهاء المهلة يتم إغلاق الاتصال باستجابة "بدون بيانات".يقوم العميل بإعادة فتح الاتصال على الفور.

حسنا، من الناحية النظرية.

ما يحدث فعليًا هو أولاً، أن IIS لا يمكنه التعامل مع أكثر من 100 طلب متزامن تقريبًا - يتم وضع جميع الطلبات الأخرى في قائمة الانتظار، ويمكن أن يكون هناك تأخير لعدة دقائق بين "متصل" وإدراك IIS أن العميل قد اتصل.ثانيًا، في حوالي نصف الوقت الذي تنتهي فيه مهلة العميل دون أي استجابة من الخادم (مهلة العميل أطول بخمس دقائق من مهلة الخادم).

POST يعمل دائمًا.تعمل البيانات الأخرى المقدمة على نفس خادم الويب.تعمل خدمات الويب على نفس الخادم.هذا تثبيت جاهز على Windows 2K3 Server.

هل هناك خيار تكوين مفقود، أم أن هناك شيئًا آخر يجب أن أنظر إليه لمعالجة هذا الأمر؟

شكرًا.

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

المحلول

أعتقد أنك وصلت إلى حدود تجمع مؤشرات الترابط ASP.NET، بدلاً من حدود IIS.فكر في إنشاء معالج HTTP غير متزامن (IHttpAsyncHandler) كما هو الحال عندما يقومون بالحظر/الانتظار، فإنهم لا يقومون بربط تجمع مؤشرات الترابط (يستخدمون منافذ الإكمال بدلاً من ذلك).

تحديث:لقد صادفت هذا مؤخرًا ويبدو أنه يتوافق مع تفكيري: مشروع الكود:COMET قابل للتطوير مدمج مع ASP.NET

نصائح أخرى

إذا لم يناسب IIS متطلباتك، فيجب عليك اختيار خادم ويب آخر مثل أباتشي (مع Mod_mono) أو LightTPD.

راجع للشغل، يمكنك نفق XMPP من خلال HTTP باستخدام XMPP عبر BOSH.لا حاجة لاختراع بروتوكول مخصص.

خارج الصندوق، تحتاج النوافذ إلى بعض التغيير.اضطررت إلى تنفيذ خادم Comet في asp.net وواجهت بعض الإعدادات الافتراضية السخيفة.بعد قراءة هذه الروابط:

لقد توصلت إلى التغييرات التالية التي تم إجراؤها على خادم Windows 2k8 الخاص بنا.

  • ريج إضافة HKLM\System\CurrentControlSet\Services\HTTP\Parameters /v MaxConnections /t REG_DWORD /d 1000000 /f
  • ريج إضافة HKLM\System\CurrentControlSet\Services cpIp\Parameters /v TcpTimedWaitDelay /t REG_DWORD /d 30 /f
  • ريج إضافة HKLM\SOFTWARE\Microsoft\ASP.NET\2.0.50727.0 /v MaxConcurrentThreadsPerCPU /t REG_DWORD /d 0 /f
  • ريج إضافة HKLM\SOFTWARE\Microsoft\ASP.NET\2.0.50727.0 /v MaxConcurrentRequestsPerCPU /t REG_DWORD /d 30000 /f
  • قام appcmd.exe بتعيين apppool "[اسم تجمع التطبيقات]" /queueLength:65535
  • قام appcmd.exe بتعيين التكوين / القسم: serverRuntime / appConcurrentRequestLimit: 100000
  • ريج إضافة HKLM\System\CurrentControlSet\Services cpIp\Parameters /v MaxUserPort /t REG_DWORD /d 65534 /f
  • ريج إضافة HKLM\System\CurrentControlSet\Services cpIp\Parameters /v MaxFreeTcbs /t REG_DWORD /d 2000 /f
  • reg add hklm system currentControlset services tcpip parameters /v maxhashtablesize /t reg_dword /d 2048 /f reg add hklm system currentControlset services inetinfo parmeters /v maxpoolthreads
  • قام appcmd بتعيين التكوين / القسم: ProcessModel /requestQueueLimit:100000 /commit:MACHINE

لا أعرف ما إذا كانت جميع التغييرات مطلوبة أم مثالية، ولكن مع بعض الاختبارات السريعة مقابل خادم اختبار، حققنا أكثر من 30 ألف اتصال تنفيذي و5 آلاف طلب في الثانية.لم أستطع الذهاب إلى أبعد من ذلك لأنني نفدت أجهزة العميل لإجراء الاختبارات منها.

لم يتم تصميم XMPP أبدًا للتطبيقات عالية الأداء.يجب أن تمر الرسائل عبر المكدس بأكمله إلى طبقة التطبيق، وهناك الكثير من تحليل XML.هل فكرت في استخدام بعض المعايير الأخرى إلى جانب XMPP؟

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