2009-06-27 20 views
6

के लिए एक कुल उदाहरण स्थापित कर रहा है वी.एस. 2005, सी # 2.0, .NET 2.0/3.0, Win2003मैं एक MultiInstance के लिए प्रदर्शन काउंटरों का एक सेट स्थापित करने के लिए कोशिश कर रहा हूँ प्रदर्शन काउंटर

। मैंने देखा कि कुछ सिस्टम प्रदर्शन काउंटर श्रेणियां "कुल" जीवित रहने का प्रबंधन करती हैं, भले ही कोई अन्य उदाहरण न हो। एएसपी.नेट एप्स 2.0.50727 एक उदाहरण है।

तो मैं इसे डुप्लिकेट करने का प्रयास कर रहा हूं। मैंने एक इंस्टालर क्लास में निम्न दिनचर्या बनाई है जिसे मैं एक सेटअप प्रोजेक्ट में कस्टम एक्शन में जोड़ता हूं।

public override void Install(System.Collections.IDictionary stateSaver) 
{ 
    //Debugger.Break(); 
    CounterCreationData data = new CounterCreationData("ZCounter", "ZCtrHelp", PerformanceCounterType.NumberOfItems32); 
    PerformanceCounterCategory.Create("ZCategory", "ZCatHelp", PerformanceCounterCategoryType.MultiInstance, new CounterCreationDataCollection(new CounterCreationData[] { data })); 
    PerformanceCounter counter = new PerformanceCounter(); 
    counter.CategoryName = "ZCategory"; 
    counter.CounterName = "ZCounter"; 
    counter.InstanceName = "ZTotal"; 
    counter.InstanceLifetime = PerformanceCounterInstanceLifetime.Global; 
    counter.ReadOnly = false; 
    counter.RawValue = 0; 
    base.Install(stateSaver); 
} 

अगर मैं Debugger.Break() लाइन uncomment, और के माध्यम से कदम, मैं देख सकता काउंटर वास्तव में सही उदाहरण के नाम के साथ बनाया जाता है, और दृश्य स्टूडियो सर्वर एक्सप्लोरर के साथ InstanceLifetime वैश्विक करने के लिए सेट के साथ उदाहरण दिखाता है। मैं सेटअप प्रोग्राम में RemoveInstance() विधि को कॉल नहीं करता हूं।

फिर भी, सेटअप प्रोग्राम पूरा होने के कुछ सेकंड बाद, वह उदाहरण प्रदर्शन मॉनीटर से और वीएस सर्वर एक्सप्लोरर से गायब हो जाता है। मैं इसे कैसे छड़ी बना सकता हूँ? या मैं कर सकता हूँ

उत्तर

7

कुछ कोड को सक्रिय रूप से काउंटर बनाए रखना है। उन सभी मामलों में आप एएसपी.Net जैसे सोच सकते हैं, काउंटर अप रखने वाली एक सेवा है।

चूंकि आप अपने ऐप के कुछ उदाहरण चल रहे हैं, तो केवल _Total इंस्टेंस सक्रिय होने से खुश नहीं हैं, आपको कुछ कोड लिखना होगा जो आपके आवेदन के बाहर प्रदर्शन काउंटर बनाए रखेगा। कोई जादू नहीं है

आप एक छोटी सी सेवा लिख ​​सकते हैं जो आपकी निगरानी आवश्यकताओं को पूरा करती है। यह _Total काउंटर बनाए रखेगा। आपको एक अपडेट regimen पर फैसला करने की जरूरत है। सबसे आसान यह है कि आपके ऐप के प्रत्येक उदाहरण दोनों उदाहरणों (उनके अपने और _Total) को अपडेट करें।

प्रदर्शन काउंटर पर थोड़ी सी पृष्ठभूमि - समझने की मुख्य बात यह है कि आम तौर पर एक साझा स्मृति क्षेत्र इंटरलॉक किए गए संचालन के माध्यम से अपडेट की गई प्रक्रियाओं के बीच साझा किया जाता है। PerfMon (या कोई अन्य ऐप) जैसे टूल वर्तमान मान प्राप्त करने के लिए साझा मेमोरी क्षेत्र से कनेक्ट हो जाते हैं। तो कुछ प्रक्रियाओं में उस साझा मेमोरी क्षेत्र को खोला और स्वामित्व होना चाहिए। इस प्रकार आपको कोड चलाने की आवश्यकता क्यों है।PerfMon आपके लिए _Total उदाहरण नहीं बना रहा है (इसमें औसत और दरों की अनुमति देने वाले काउंटरों के कुछ सुंदर संकलित संयोजन हैं, लेकिन सारांश उदाहरण बनाने के लिए योग नहीं है)।

+0

मुझे लगता है कि यह मेरे प्रश्न का सही उत्तर है। हालांकि, चेक निशान चला गया है; मैं इसे सही उत्तर के रूप में नहीं चुन सकता। मुझे पता था कि पेर्फमोन _Total काउंटर नहीं बना रहा था; यह सिर्फ मुझे स्पष्ट नहीं था कि हमेशा एक सेवा थी जिंदा काउंटर "PerformanceCounterInstanceLifetime.Global" सुझाव देता है कि इसे ऐसा करना चाहिए; अन्यथा, उस नाम का क्या मतलब है? बीटीडब्लू, मैं किसी भी कोड, सेवाओं या जो कुछ भी लिखने के विपरीत नहीं हूं। मुझे बस पता नहीं था कि यह कैसे किया जा रहा था। मैं आलसी प्रोग्रामर के रूप में सोचा था। –

0

"PerformanceCounterCategoryType.SingleInstance" के साथ श्रेणी बनाने का प्रयास करें।

+0

शायद मैं कर सकता था, लेकिन यह "कुल" उदाहरण (अन्य सभी उदाहरणों के परिणामों को बढ़ाने के लिए उपयोग किया जाता है) के उद्देश्य को हरा देता है। मुझे पता है कि यह संभव है; जैसा कि मैंने उल्लेख किया है, एएसपी.नेट इसे किसी भी तरह से कर रहा है। शायद काउंटर सेट में "__Total__" उदाहरण रखने के लिए यह किसी अन्य प्रक्रिया का उपयोग करता है? –

+0

मुझे "अन्य प्रक्रिया" चीज़ के बारे में पता नहीं है - लेकिन अगर ऐसा कोई जानवर है तो इसमें दिलचस्पी होगी। मैं सिंगलइंस्टेंस काउंटर बनाउंगा और हर बार जब मैं मल्टीस्टेंस/विशिष्ट उदाहरण अपडेट करता हूं- एक मैं एकल मूल्य/वैश्विक-एक को उसी मान से अपडेट करता हूं। अर्थात। मैन्युअल रूप से "एकत्रीकरण" करें। –

+0

क्षमा करें मुझे पहले इस टिप्पणी को नहीं देखा था। दो समस्याएं: 1) सिंगल इंस्टेंस * श्रेणी * का मतलब है कि कोई नाम नहीं है। 2) मुझे पता है कि मैं कई उदाहरण अपडेट कर सकता हूं (एक "कुल" और एक "प्रक्रिया" उदाहरण) - यह मेरी समस्या नहीं है। समस्या यह है कि "क्या कोई उदाहरण नहीं चल रहा है जब परफॉर्म काउंटर सूची में दिखाए गए एकाधिक इंस्टेंस श्रेणी के" कुल "उदाहरण को मैं कैसे रखूं? –

0

बस एक सुझाव लेकिन कोशिश

Counter.ReadOnly = true; 

पहले पास बनाने के माध्यम से और केवल गलत पर यह स्थापित करने के लिए जब आप काउंटर बढ़ाने के लिए की जरूरत है।

Counter.RawData = 0; 

मैं डिफ़ॉल्ट रूप से 0 करने के लिए अपने सेट का मानना ​​है कि पहले पास किसी भी तरह:

और यह भी अगर आप काउंटर केवल पढ़ने के लिए सुनिश्चित करें कि आप स्पष्ट रूप से लाइन बाहर टिप्पणी करने की जरूरत है।

आशा इस मदद करता है ...

+0

मैं इसे आजमाउंगा, और आपको आज बता दूंगा। –

+0

माइक: परीक्षण विफल रहा। अगर यह काम करता था, तो उस श्रेणी और काउंटर के लिए प्रदर्शन मॉनीटर में "ZTotal" नामक एक उदाहरण होता, और ऐसा नहीं होता है। –

1

AFAIK एक वैश्विक प्रदर्शन काउंटर श्रेणी में लंबे समय के रूप में जीवित के रूप में किसी भी प्रक्रिया एक सक्रिय यह संदर्भित हैन्डल होता है रहेगा। सिस्टम काउंटर कुछ सेवा में कुल काउंटर आवृत्ति को संभालने के द्वारा इसे प्राप्त करते हैं।

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