في مرشح ISAPI، ما هو نهج جيد لشغل سجل مشترك لعمليات متعددة؟

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

سؤال

لدي عامل تصفية ISAPI يعمل على IIS6 أو 7. عندما يكون هناك عمليات متعددة العمال ("حديقة الويب")، سيتم تحميل المرشح وتشغيله في كل W3WP.exe.

كيف يمكنني السماح بفعالية المرشح لتسجيل أنشطتها في سجل مدمج واحد؟

  • يجب ألا تتداخل رسائل السجل من العمليات المختلفة (المتزامنة) مع بعضها البعض. بمعنى آخر، يجب أن تتحقق رسالة سجل واحدة المنبعثة من أي من W3WP.EXE كخط مجاور واحد في ملف السجل.

  • يجب أن يكون هناك خلاف ضئيل ل LogFile. قد تخدم المواقع الإلكترونية طلبات 100 في الثانية.

  • يفضل طلب الوقت الصارم. بمعنى آخر إذا كانت عملية W3WP.exe # 1 تنبعث رسالة في T1، ثم تنبعث منها رقم # 2 رسالة في T2، ثم تعتمد عملية # 1 رسالة في T3، يجب أن تظهر الرسائل في طلب الوقت المناسب في ملف السجل.

النهج الحالي لدي هو أن كل عملية تمتلك شطلة منفصلة. هذا لديه عيوب واضحة.

بعض الافكار:

  • قم بترشيح أحد W3WP.EXE ليكون "مالك LogFile" وإرسال جميع رسائل السجل من خلال هذه العملية الخاصة. هذا له مشاكل في حالة إعادة تدوير عملية العملية.

  • استخدم نظام التشغيل Mutex لحماية الوصول إلى LogFile. هل هذه عالية الأثير بما فيه الكفاية؟ في هذه الحالة، سيكون لكل W3WP.EXE ملف على ملف نظام الملفات نفسه. يجب أن fflush logfile بعد كل كتاب؟ هل سيعمل هذا؟

أي اقتراحات؟

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

المحلول

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

أعتقد أن ما تريد القيام به هو كتابة سجل عدم إبطاء الخيوط التي تقوم بعمل حقيقي.

لذلك، قم بتشغيل عملية أخرى على نفس الجهاز (أولوية أقل؟) التي تكتب فعلا رسائل السجل على القرص. التواصل مع العملية الأخرى باستخدام UNDP كما هو مقترح، ولكن الذاكرة التي تشاركها العمليات. المعروف أيضا، مربك، كملف معين في الذاكرة. المزيد عن ذاكرة تعيين الملفات. وبعد في شركتي، وجدنا أن الملفات المعينة ذاكرة لتكون أسرع بكثير من الاسترجاع TCP / IP للاتصالات في المربع نفسه، لذلك أنا أفترض أنه سيكون أسرع من UDP أيضا.

ما لديك بالفعل في الذاكرة المشتركة يمكن أن يكون، للمبتدئين، قائمة انتظار STD :: حيث يتم حماية الأداء والملوثات العضوية الثابتة باستخدام mutex. سيؤدي مؤشرات الترابط ISAPI الخاصة بك إلى وضع الأمور في قائمة الانتظار. من شأن عملية التسجيل الاستيلاء على MUTEX لسحب الأشياء من قائمة الانتظار، ثم حرر Mutex، ثم اكتب الإدخالات على القرص. يتم حماية MUTEX فقط تحديث الذاكرة المشتركة، وليس تحديث الملف، لذلك يبدو من الناحية النظرية أن يتم احتجاز Mutex لوقت أكثر إدراجا، مما يخلق أقل من عنق الزجاجة.

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

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

المشكلة مع كل شيء كتبته هنا هو أن النظام بأكمله - الأجهزة، نظام التشغيل، والطريقة التي تعمل بها CPU L1 / L1 / L1 / L1 يعمل، برنامجك - معقد للغاية يمكن التنبؤ به بسهولة من خلال التفكير في ذلك. كود ما يصل بعض تطبيقات دليل المفهوم البسيط، صك لهم مع بعض التوقيت، وجربها في الأجهزة الحقيقية.

نصائح أخرى

سوف تسجيل الدخول إلى قاعدة البيانات منطقيا هنا؟

لقد استخدمت نظام التسجيل المستند إلى UDP في الماضي وكانت سعيدا بهذا النوع من الحل.

يتم إرسال السجلات عبر UDP إلى عملية مجمع السجل التي مسؤول عن حفظها إلى ملف على أساس منتظم.

لا أعرف إذا كان بإمكانه العمل في سياقك المرتفع، لكنني كنت راضيا عن هذا الحل في تطبيق أقل تحت الإجهاد.

اتمني ان يكون مفيدا.

بدلا من نظام التشغيل MUTEX للسيطرة على الوصول إلى الملف، يمكنك فقط استخدام آليات قفل ملف Win32 مع Lockfile () و Unlockfile ().

اقتراحي هو إرسال رسائل غير متزامنة (UDP) إلى عملية ستتولى مسؤولية تسجيل السجل.
سوف العملية:
- استقبال مؤشر ترابط واحد يضع الرسائل في قائمة الانتظار؛
- موضوع واحد مسؤول عن إزالة الرسائل من وضع قائمة الانتظار في وقت قائمة الطلب؛
- مراقبة رسائل موضوع واحد في القائمة والرسائل فقط مع طول الوقت أكبر من الحد الأدنى يجب حفظها في الملف (لمنع كتابة رسالة متأخرة خارج النظام).

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

الحدث تتبع للنوافذ, ، المدرجة في نظام التشغيل Windows Vista والإصدارات الأحدث، توفر إمكانية لطيفة لهذا.

مقتطفات:

تعد تتبع الحدث لنظام التشغيل Windows (ETW) مرفقا فعالا تتبع مستوى kernel يتيح لك تسجيل الأحداث النواة أو المعرفة من التطبيق إلى ملف السجل. يمكنك أن تستهلك الأحداث في الوقت الحقيقي أو من ملف السجل واستخدامها لتصحيح تطبيق أو تحديد مكان حدوث مشكلات الأداء في التطبيق.

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