2010-11-30 5 views
9

मैं एक सेवा अनुप्रयोग है कि टीसीपी से अधिक ग्राहक अनुरोध पर काम करना और Windows इवेंटलॉग में किसी भी घटनाओं लिख रहा है है। चूंकि इस एप्लिकेशन से कई क्लाइंटों की सेवा करने की उम्मीद है और प्रत्येक ग्राहक से बहुत कम समय में अनुरोध (चलिए प्रति सेकंड 1 और 50 अनुरोधों के बीच कहते हैं), मैं जानना चाहता हूं कि कितना गहन (सीपीयू वार और टाइम वार) Windows EventLog में कितनी तेजी से लिख सकते हैं?विंडोज इवेंट लॉग: इसके साथ कितनी तेजी से संचालन कर रहे हैं?

अधिक विशेष रूप से, इवेंटलॉग से जोड़ने, पढ़ने और लिखने के संचालन कितने गहन हैं?

+0

ईवेंट लॉग में आप कौन सी घटनाएं लिख रहे हैं? आपके प्रश्न के उत्तर में एक सूचक यह हो सकता है कि आईआईएस और इसी तरह के सर्वर टेक्स्ट लॉग पर लिखें, न कि इवेंट लॉग। – Lazarus

+0

इस पल के लिए केवल सरल पाठ संदेश। एक साधारण पाठ फ़ाइल (लॉग फ़ाइल) का उपयोग करना भी एक विकल्प है, लेकिन मैं अभी भी EventLog के बारे में और जानना चाहता हूं। – LightBulb

उत्तर

6

मैंने अपने 2 इवेंट लॉग कक्षाओं के साथ एक परीक्षण किया, फ़ाइल में एक लेखन (प्रत्येक log_event() लिखता है और पहले ही खोला गया फ़ाइल फ्लश करता है) और इवेंटलॉग (ReportEvent() पहले से पंजीकृत इवेंटसोर्स पर कॉल) पर आधारित है। मेरे मामले में फ़ाइल लॉग इवेंटलॉग से लगभग 10 गुना तेज था। मल्टीथ्रेड माहौल में मैं फ़ाइल को लिखने की रक्षा के लिए महत्वपूर्ण खंड जोड़ूंगा।

मेरी राय में फ़ाइलें बेहतर हैं: उन्हें grep जैसे टूल में आसानी से पार्स किया जाता है। मेरे लिए गति कम महत्वपूर्ण है।

+0

यह वह उत्तर है जिसे मैं ढूंढ रहा था। मैं यह भी मानता हूं कि लॉग फ़ाइलों का उपयोग करना एक बेहतर, तेज़ और सरल तरीका है, लेकिन मुझे एक मौजूदा सेवा एप्लिकेशन को बनाए रखने का कार्य दिया गया था जो विंडोज इवेंटलॉग में सभी घटनाओं को लिख रहा है। मैंने माना कि यह "भारी-लहर" लॉगिंग सुविधा है इसलिए मैंने अपने प्रश्न से पूछा। – LightBulb

12

कि ऐसा मत करो। ईवेंट लॉग इस तरह के एक गतिविधि के लिए नहीं बनाया गया है:

  1. यह एक अधिकतम आकार है।
  2. जब अधिकतम आकार तक पहुँच जाता है, यह घटनाओं के ऊपर लिख सकते हैं या प्रवेश रोकने के लिए, सेटिंग के आधार पर (हाल ही में विंडोज भी लॉग संग्रहीत करने और एक नया शुरू कर सकते हैं)। यदि ईवेंट ओवरराइट नहीं किए जाते हैं, तो वे आपके विभाजन को भर सकते हैं या अन्य अनुप्रयोगों को ब्लॉक कर सकते हैं जब तक कि लॉग मैन्युअल रूप से साफ़ नहीं हो जाते।

इवेंट लॉग सामान्य लॉगिंग सुविधा नहीं है। इसका उपयोग त्रुटियों की रिपोर्ट करने के लिए किया जाना चाहिए, जिन परिस्थितियों पर ध्यान देने की आवश्यकता है, और यहां तक ​​कि सूचनात्मक रिपोर्ट भी, लेकिन हर छोटी जानकारी को कहीं भी लिखना नहीं है। यदि आपके पास भारी लॉग की ज़रूरत है, तो अपनी खुद की लॉग सुविधाओं का उपयोग करें और मुद्दों की रिपोर्ट करें - यदि कोई हो - तो "पॉइंटर" के साथ ईवेंट लॉग में जहां आवश्यक हो तो विस्तृत डेटा कहां प्राप्त करें।

नोट: यदि वास्तव में ईवेंट लॉग की आवश्यकता है, तो कम से कम एप्लिकेशन को अपने स्वयं के लॉग गंतव्य का उपयोग करना चाहिए, मानक (एप्लिकेशन या इससे भी बदतर सिस्टम) में से एक नहीं। इस तरह यह अन्य अनुप्रयोग संचालनों को प्रभावित नहीं करेगा, और अन्य घटनाओं के कार्यक्रमों को "बाढ़" को अपने कार्यक्रमों के साथ "छिपाने" नहीं देगा, जिससे उन्हें ढूंढने के बिना दूसरों को स्पॉट करना मुश्किल हो जाएगा।

+1

+1 अच्छी सलाह, मेरे ऐप ने एक बार ग्राहक की साइट पर इवेंट लॉग भर दिया और इससे परेशानी का कोई अंत नहीं हुआ! –

+0

मैं आपकी सिफारिश से सहमत हूं। मेरे मामले में, मुझे एक मौजूदा सेवा एप्लिकेशन को बनाए रखना है जो इवेंटलॉग पर लिख रहा है, इसलिए मैं जानना चाहता था कि यह समग्र एप्लिकेशन प्रदर्शन को कितना और प्रभावित कर सकता है। – LightBulb

+0

आप विंडोज के समग्र कामकाज और मशीन पर चल रहे सभी अनुप्रयोगों को प्रभावित करने का जोखिम उठा रहे हैं। वैसे भी आप और आपके ग्राहकों तक। –

10

Event Tracing for Windows इस स्तर के यातायात के लिए बेहतर भंडार होगा।

घटना विंडोज (ETW) के लिए ट्रेसिंग एक कुशल कर्नेल-स्तर पर आप एक लॉग फाइल करने के लिए कर्नेल या आवेदन से परिभाषित घटनाओं लॉग इन करने की सुविधा देता है सुविधा का पता लगाने है। आप वास्तविक समय या लॉग फ़ाइल से ईवेंट का उपभोग कर सकते हैं और का उपयोग किसी एप्लिकेशन को डीबग करने के लिए या पर निर्धारित कर सकते हैं कि एप्लिकेशन में होने वाले प्रदर्शन समस्याएं कहां हैं।

नमूना छद्म कोड:

const 
    MyApplicationProviderGUID: TGUID = '{47A0DECE-4DCF-4782-BCF4-82AECA6BAAB7}'; 
private 
    FETWRegistrationHandle: THandle; 

... 

EventRegister(MyApplicationProviderGUID, nil, nil, {out}FETWRegistrationHandle); 
... 
EventWriteString(FETWRegistrationHandle, 0, 0, 'Hello'); 
EventWriteString(FETWRegistrationHandle, 0, 0, ', '); 
EventWriteString(FETWRegistrationHandle, 0, 0, 'world'); 
EventWriteString(FETWRegistrationHandle, 0, 0, '!'); 
... 
EventUnregister(MyApplicationProviderGUID); 
+0

यह बहुत दिलचस्प लगता है। मुझे इसके बारे में और अधिक पढ़ना है क्योंकि यह रीयल-टाइम एप्लिकेशन प्रदर्शन (अन्य चीजों के साथ) एकत्र करने और विश्लेषण करने के लिए एक बहुत अच्छी विधि के रूप में लगता है। – LightBulb

+1

हां, इवेंट लॉग के रूप में उपयोग करना उतना आसान नहीं है, लेकिन बहुत अधिक प्रदर्शनकारी है। –

+0

मैं ईटीडब्ल्यू का उल्लेख करने जा रहा था अगर यह पहले से नहीं था। –

1

शायद Microsoft Message Queuing (MSMQ) विंडोज इवेंटलॉग लिए एक विकल्प है। यह विंडोज के सभी मौजूदा संस्करणों में उपलब्ध है, और उच्च गति, कमजोर युग्मित संदेश प्रदान करता है।

+0

एमएसएमक्यू भी दिलचस्प लगता है। मैं इसके बारे में और अधिक पढ़ूंगा और देख सकता हूं कि यह मेरे काम के लिए उपयोगी हो सकता है या नहीं। – LightBulb

संबंधित मुद्दे