2008-11-09 17 views
35

मैं एक पृष्ठभूमि कार्यक्रम पर काम कर रहा हूं जो लंबे समय तक चल रहा है, और मेरे पास बाहरी लॉगिंग प्रोग्राम (SmartInspect) है कि मैं समय-समय पर कुछ मूल्यों के साथ फ़ीड करना चाहता हूं, इसे डिबगिंग के दौरान रीयलटाइम में मॉनिटर करने के लिए।क्या सी # प्रोग्राम किसी भी तरह अपने सीपीयू उपयोग को माप सकता है?

मुझे पता है कि मैं टास्क मैनेजर, या आईएआरएसएन टास्कइन्फो जैसे कई प्रोग्रामों को आसानी से फायर कर सकता हूं, लेकिन मैं इसके लिए अपने प्रोग्राम में सबकुछ रखना चाहता हूं, क्योंकि मैं कुछ सरल नियम भी जोड़ना चाहता हूं जैसे कि प्रोग्राम एक्स% सीपीयू से अधिक का उपयोग करता है, इसे लॉग में ध्वजांकित करें।

मैं एक पृष्ठभूमि धागा है कि समय-समय पर, SmartInspect करने के लिए कुछ आंकड़े फ़ीड स्मृति की खपत, काम कर सेट, आदि जैसे है

यह संभव इस धागे के एक यथोचित सटीक मापन प्राप्त करने के लिए है कंप्यूटर के CPU संसाधनों का कितना यह खपत करता है? मुख्य कार्यक्रम एक सिंगल थ्रेडेड एप्लीकेशन है (वॉचडॉग थ्रेड के अलावा जो आंकड़े लॉग करता है) ताकि यदि तकनीक तक सीमित हो, तो एक थ्रेड का उपयोग करता है तो यह भी अच्छा होगा।

मुझे लिनक्स और सी के लिए rusage नामक कुछ प्रविष्टियों से संबंधित कुछ प्रविष्टियां मिलीं। क्या ऐसा कुछ है जिसका मैं उपयोग कर सकता हूं?


संपादित करें: ठीक है, मैं प्रदर्शन काउंटर तरह से कोशिश की, लेकिन यह काफी जीसी डेटा हर बार कहा जाता है की एक बहुत कुछ जोड़ा है, इसलिए स्मृति के उपयोग और कचरा संग्रहण के लिए ग्राफ आसमान छू रही। मुझे लगता है कि मैं अभी इस भाग को छोड़ दूंगा।

उत्तर

46

आप System.Diagnostics.Process.TotalProcessorTime और System.Diagnostics.ProcessThread.TotalProcessorTime गुणों का उपयोग अपने प्रोसेसर उपयोग की गणना के लिए भी कर सकते हैं क्योंकि article वर्णन करता है।

+0

यह बहुत बेहतर काम करता है और जीसी पर इतना दबाव नहीं डालता है, बस थोड़ा सा वृद्धि। धन्यवाद! –

+0

@axk आलेख उपलब्ध नहीं प्रतीत होता है, क्या आप शायद अपना उत्तर पूरा कर सकते हैं जो केवल वर्तमान प्रोसेसर भाग को पुनर्प्राप्त करने का संकेत देता है? – J4N

8

System.Diagnostics.PerformanceCounter पर एक नज़र डालें। यदि आप perfmon.exe चलाते हैं, तो आपको उपलब्ध प्रदर्शन काउंटर की श्रेणी दिखाई देगी ('प्रदर्शन ऑब्जेक्ट' को 'प्रक्रिया' पर सेट करें), जिसमें से एक '% प्रोसेसर टाइम' है।

+1

इस उत्तर मेरे लिए सबसे अच्छा काम किया। हालांकि मैं जोड़ना चाहता हूं, कि: 1. आपको यह सुनिश्चित करना होगा कि प्रति सेकंड एक बार या उससे कम बार काउंटर से केवल अगले मूल्य प्राप्त हो या परिणाम बंद हो जाएं, और 2. यदि आप सीपीयू देख रहे हैं आंकड़े, आपको पर्यावरण द्वारा विभाजित करना होगा। प्रोसेसर गणना अन्यथा आपको 8 कोर मशीन पर 800% तक पागल प्रतिशत मिलते हैं। –

4

आप सिस्टम के माध्यम से कर सकते हैं। डायग्नोस्टिक। प्रदर्शन गुणवत्ता काउंटर।

http://blogs.msdn.com/dotnetinterop/archive/2007/02/02/system-diagnostics-performancecounter-and-processor-time-on-multi-core-or-multi-cpu.aspx

ध्यान दें कि यह ऊपर उठाया विशेषाधिकारों की आवश्यकता है: यहाँ किसी की निगरानी CPU उपयोग का एक उदाहरण है। और इसका उपयोग कर एक प्रदर्शन हिट हो सकता है।

3

यह अच्छा है कि आप Smartinspect जैसे मॉनीटर पर लॉग इन कर रहे हैं। लेकिन विंडोज़ इस मामले में आपके संसाधन (या प्रक्रिया) में प्रत्येक संसाधन के लिए डेटा एकत्र करती है। डब्ल्यूएमआई आवेदन निगरानी के लिए मानक है। हम डब्लूएमआई द्वारा कैप्चर किए गए डेटा को देख सकते हैं। कई एप्लिकेशन प्रबंधन, स्वास्थ्य निगरानी या आवेदक निगरानी उपकरण बॉक्स से बाहर WMI का समर्थन करते हैं।

तो मैं आपको लॉग इन फ़ाइल में एप्लिकेशन के भीतर अपने सीपीयू उपयोग को लॉग इन करने की सलाह नहीं दूंगा।

यदि आपको लगता है कि लाभ और प्रदर्शन महत्वपूर्ण है तो माइक्रोसॉफ्ट ऑपरेशंस मैनेजर समाधान जैसे समाधानों के लिए जाएं।

WMI के बारे में एक विचार प्राप्त करने और प्राप्त करने के लिए प्रक्रिया की सूची नीचे देखें: - Win32_PerfFormattedData_PerfProc_Process CPU समय प्राप्त करने के लिए, फिल्टर processID See this article है - आप Win32_process वर्ग से processID मिल सकती है।

WMI Made Easy For C# केविन मैथ्यू गॉस द्वारा

oConn.Username = "JohnDoe"; 
oConn.Password = "JohnsPass"; 

System.Management.ManagementScope oMs = new System.Management.ManagementScope("\\MachineX", oConn);  

//get Fixed disk stats 
System.Management.ObjectQuery oQuery = new System.Management.ObjectQuery("select FreeSpace,Size,Name from Win32_LogicalDisk where DriveType=3"); 

//Execute the query 
ManagementObjectSearcher oSearcher = new ManagementObjectSearcher(oMs,oQuery); 

//Get the results 
ManagementObjectCollection oReturnCollection = oSearcher.Get(); 

//loop through found drives and write out info 
foreach(ManagementObject oReturn in oReturnCollection) 
{ 
    // Disk name 
    Console.WriteLine("Name : " + oReturn["Name"].ToString()); 
    // Free Space in bytes 
    Console.WriteLine("FreeSpace: " + oReturn["FreeSpace"].ToString()); 
    // Size in bytes 
    Console.WriteLine("Size: " + oReturn["Size"].ToString()); 
} 

साथ ही आप रिमोट सिस्टम से प्रक्रिया की निगरानी कर सकते हैं।

+2

यह कड़ाई से एक डिबगिंग टूल है, और जो कोड लॉग करता है उसे रिलीज बिल्ड में भी संकलित नहीं किया जाएगा। इसके लिए केवल एक विधि-स्तर लॉगिंग को संकलित किया जाएगा, अगर मुझे किसी अलग मशीन पर अजीब दुर्घटना को पुन: पेश करने का प्रयास करना है। हालांकि विस्तृत जानकारी के लिए धन्यवाद, मैंने इसे –

-2

इस कोड को परियोजना आलेख वर्णन करता है कि कैसे उच्च प्रदर्शन टाइमर का उपयोग करने के लिए:

http://www.codeproject.com/KB/cs/highperformancetimercshar.aspx

आप अपने कोड के निष्पादन समय के लिए इसका इस्तेमाल कर सकते हैं।

यहाँ आप खुला स्रोत सी # प्रोफाइलर के एक नंबर पा सकते हैं:

http://csharp-source.net/open-source/profile

+0

का नोट बना दिया है, मुझे टाइमर की आवश्यकता नहीं थी, मुझे यह मापने के लिए एक तरीका चाहिए कि कार्यक्रम कितनी सीपीयू प्रोग्राम समय-समय पर उपयोग कर रहा था, यह सीधे उस समय से संबंधित नहीं है लिया गया, उदाहरण के लिए ब्लॉक I/O संचालन हो सकता है। –