2011-11-25 8 views
18

में मैं .NET के System.Management सामान का उपयोग करके WMI का उपयोग करके कुछ मशीनों की निगरानी कर रहा हूं। क्वेरी मैं उपयोग कर रहा हूँ यह है:डब्लूएमआई, नकारात्मक सीपीयू उपयोग मूल्य और टाइमस्टैम्प_Sys100NS पिछले

SELECT Timestamp_Sys100NS, PercentProcessorTime 
FROM Win32_PerfRawData_PerfOS_Processor 
WHERE Name='_Total' 

कि से मैं गणना CPU उपयोग% प्रसिद्ध सूत्र का उपयोग:

double cpu_usage = (1 - (double)delta_cpu/delta_time) * 100; 

यह बहुत अच्छी तरह हर मशीन काम करता है लेकिन एक (अभी तक)।

समस्या यह है कि एक मशीन के लिए, जो कि विंडोज 2003 सर्वर है (हाइपर-थ्रेडिंग सक्षम है, अगर यह मायने रखता है), मुझे कभी-कभी नकारात्मक CPU उपयोग मान मिलते हैं। दूसरे शब्दों में, (double)delta_cpu/delta_time अभिव्यक्ति संख्या > 1 उत्पन्न करती है। मैंने संकेतों के लिए वेब पर खोज की कि यह क्यों हो सकता है लेकिन मुझे कुछ भी नहीं मिला।

क्या यह विंडोज 2003 सर्वर विशिष्ट है? या यह हाइपर-थ्रेडिंग संबंधित समस्या है? या क्या यह अभी अपेक्षित है और मुझे सीपीयू उपयोग मूल्य या cpu_delta मान को कुछ सीमा में क्लैंप करना चाहिए?

संपादित करें: दूसरा अजीब बात मैं इस एक मशीन के साथ देख रहा हूँ कि Timestamp_Sys100NS मूल्य तारीख की तरह FILETIME का संकेत नहीं है है (युग 1 जनवरी, 1600 के बाद टिक्स) लेकिन इसके बजाय यह बूट समय के बाद से टिक तरह दिखता है।

EDIT 2: मैंने अब सत्यापित किया है कि यह समस्या विंडोज 2003 सर्वरों में है। और मैं स्पष्ट रूप से not the only one with the same problem हूं।

संपादित 3: मैं Win32_OperatingSystem से LastBootUpTime लगाने और उन्हें कहा कि जब Timestamp_Sys100NS का मूल्य पूर्व में बहुत है Timestamp_Sys100NS करने से समय स्टाम्प समस्या हल हो जाती है। ऐसा लगता है कि सही तिथि और समय देना है। कोड की तारीख से छेड़छाड़ के बाद यह Win32_OperatingSystem से लिया गया है इस तरह दिखता है:

WbemScripting.SWbemDateTime swbem_time = new WbemScripting.SWbemDateTime(); 
swbem_time.Value = date_str; 
string time_as_file_time_str = swbem_time.GetFileTime(true); 
return new DateTimeOffset(epoch.Ticks + long.Parse(time_as_file_time_str), 
    swbem_time.UTCSpecified 
    ? TimeSpan.FromMinutes(swbem_time.UTC) 
    : TimeSpan.Zero); 

... तो यूटीसी को समायोजित ...

boot_time = boot_time.UtcDateTime; 

... तो boot_time बस समय में जोड़ा जाता है टिकट (current) Timestamp_Sys100NS क्षेत्र में WMI द्वारा में लौट आए ...

if (time.Year < 2000) 
    time = boot_time + current; 

संपादित 4: ऐसा प्रतीत होता है Timestamp_Sys100NS के संबंध में प्रणाली के 3 वर्गों देखते हैं कि:

  1. पहले विस्टा + प्रणाली है जहाँ Timestamp_Sys100NS यूटीसी में अवधि के बाद टिक में समय है।
  2. दूसरा कुछ विंडोज 2003 सिस्टम हैं जहां Timestamp_Sys100NS को उचित समय प्राप्त करने के लिएमें जोड़ा जाना आवश्यक है।
  3. तीसरी कक्षा प्रणाली है जहां उपर्युक्त उपरोक्त कार्य अभी भी सही तिथि और समय से एक दिन के दिनों में होता है।

संपादित 5: प्रभावित मशीनों में से कुछ VMs नहीं लेकिन उन सभी को हो सकता है।

+18

इसका मतलब है कि सीपीयू आप का उपयोग कर रहा है :) –

+0

आपने TimeStamp_Sys100NS पर LastBootUpTime को कैसे जोड़ा? आपने किस प्रकार का रूपांतरण किया? – raz3r

+0

@ raz3r: मैं 'System.DateTime (Int64)' ctor (ticks लेता है) का उपयोग कर रहा हूं और मैं इसे LastBootUpTime में जोड़ता हूं। मैं कल ही सटीक विवरण की जांच कर पाऊंगा। – wilx

उत्तर

0

कोड का उपयोग करके देखें कि मशीन पर आवेदन बना सकते हैं और यदि आप सही रीडिंग http://www.microsoft.com/download/en/details.aspx?id=8572

+0

कच्चे मान दोनों 'सिस्टम। प्रबंधन' एपीआई और 'wmic' और उपर्युक्त उपकरण से समान हैं। – wilx

0

सूत्र आप विशेष रूप से के बारे में बात कर रहे हैं पाने के देखने के PERF_100NSEC_TIMER_INV है http://msdn.microsoft.com/en-us/library/ms803963.aspx

मैं व्यक्तिगत रूप से इस समस्या से नहीं निपटा है क्योंकि मैंने शून्य से नीचे मान कभी नहीं देखा है।

यह सब मैं कर दिया गया है:

/// <summary> 
/// PERF_100NSEC_TIMER_INV algorithm. 
/// </summary> 
/// <param name="n2"></param> 
/// <param name="d2"></param> 
/// <param name="n1"></param> 
/// <param name="d1"></param> 
/// <returns></returns> 
public static int CalculatePerf100NsecTimerInv(long n2, UInt64 d2, 
               long n1, UInt64 d1) 
{ 
    int usage = 0; 
    try 
    { 
     double dataDiff = (n2 - n1); 
     double timeDiff = (d2 - d1); 
     double dUsage = (1 - (dataDiff/timeDiff)) * 100; 

     // Evaluate 
     usage = (dUsage >= 0.5) ? Convert.ToInt32(Math.Ceiling(dUsage)) : 0; 
    } 
    catch { } 

    // Return 
    return usage; 
} 

उपयोग:

// Calculate 
int cpuTime = 
    MSPerformanceAlgorithms.CalculatePerf100NsecTimerInv(
     current.PercentProcessorTime, current.TimestampSys100Ns, 
     previous.PercentProcessorTime, previous.TimestampSys100Ns); 

तो मैंने 2003 बॉक्स के लिए कार्य प्रबंधक पर CPU उपयोग देखते हैं, यह ठीक से मेल खाता है। मुझे लगता है कि जब तक आप इन मूल्यों की गणना कर रहे हैं तब तक आप शून्य से कम कुछ भी अवहेलना कर सकते हैं।

+0

दुर्भाग्यवश, मैं सही सूत्र का उपयोग कर रहा हूं। – wilx

+0

मुझे यकीन नहीं है कि आप और भी कर सकते हैं। आपके निष्कर्षों से, मैं यह देखने के लिए एक चेक जोड़ूंगा कि क्या LastBootUpTime> Timestamp_Sys100NS प्रत्यक्ष संकेतक के रूप में है कि टिकट गलत है। डब्लूएमआई की रिलीज के बीच बहुत सी असंगतताएं रही हैं। बेहतर विंडोज डेटा और काउंटर के अतिरिक्त विंडोज 2003 तक वे वास्तव में अत्यधिक प्रभावी नहीं बन पाए। क्या यह संभव है कि यह केवल विंडोज 2003 आर 1 पर है? X86 बनाम x64 में कोई अंतर है? यह एक अच्छा विषय है, और हम में से कई परिणाम से लाभ उठा सकते हैं। – Xcalibur37

1

यह मुझे मानक "समय सिंक्रनाइज़ेशन" मुद्दा की तरह लगता है।

आपकी प्रणाली की घड़ी ... घड़ी है। आपके मामले में, आपकी घड़ी तेजी से चल रही है (शायद यह वास्तविक समय के 99% में एक मिनट पूरा करती है) ताकि जब आपका कंप्यूटर बाहरी घड़ी (जैसे कि विंडोज टाइम सेवा के माध्यम से) हो, तो आपका सिस्टम समय पीछे की तरफ कूद जाएगा।

वैकल्पिक रूप से, उपयोगकर्ता मैन्युअल रूप से सिस्टम का समय समायोजित कर सकते हैं (जैसे: दिनांक और समय नियंत्रण कक्ष), तो यह आपके लिए कुछ डिजाइन करना चाहिए (अपने सिस्टम का समय सेट अपने अनुप्रयोग क्रैश हो, तो अपने उपयोगकर्ताओं को बहुत दुखी होगा!)

जिस तरह से मैं इसे हल करता हूं वह क्लैंपिंग द्वारा होता है। पास करने के लिए हमेशा "वास्तविक समय" के कम से कम 0.0 सेकंड की आवश्यकता होती है, लेकिन अधिकतम 0.5 सेकंड तक भी क्लैंप होती है, क्योंकि समय समायोजन आगे की ओर नहीं जा सकता है, न केवल पीछे की तरफ।

मुझे आशा है कि इससे मदद मिलती है।

+0

एक 0 को मत भूलना।0 सेकंड न्यूनतम मतलब है कि आपको divide-by-zeros के लिए भी देखना होगा – JasonS

+0

मुझे यकीन है कि यह आपकी समस्या है, इसलिए अगर मेरा समाधान काम करता है, तो कृपया वापस संदेश भेजें, या अगर यह कुछ और हो रहा है (मान लें कि आप अपना महीना पढ़ते हैं पुराना सवाल फिर से) – JasonS

+0

खराब समय सूचना प्रभाव सुसंगत है, यह केवल थोड़ी देर में नहीं बल्कि हर समय होता है। मेरा कोड प्रत्येक 5 सेकंड की तरह जांच रहा था। ऐसा लगता है कि एनटीपी डिमन्स/सेवाओं द्वारा धीरे-धीरे समय समायोजन से पीड़ित नहीं है। मैं कुछ भी नहीं करता कि आपका जवाब इस मुद्दे को समझाता है। – wilx

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