में मैं .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 वर्गों देखते हैं कि:
- पहले विस्टा + प्रणाली है जहाँ
Timestamp_Sys100NS
यूटीसी में अवधि के बाद टिक में समय है। - दूसरा कुछ विंडोज 2003 सिस्टम हैं जहां
Timestamp_Sys100NS
को उचित समय प्राप्त करने के लिएमें जोड़ा जाना आवश्यक है। - तीसरी कक्षा प्रणाली है जहां उपर्युक्त उपरोक्त कार्य अभी भी सही तिथि और समय से एक दिन के दिनों में होता है।
संपादित 5: प्रभावित मशीनों में से कुछ VMs नहीं लेकिन उन सभी को हो सकता है।
इसका मतलब है कि सीपीयू आप का उपयोग कर रहा है :) –
आपने TimeStamp_Sys100NS पर LastBootUpTime को कैसे जोड़ा? आपने किस प्रकार का रूपांतरण किया? – raz3r
@ raz3r: मैं 'System.DateTime (Int64)' ctor (ticks लेता है) का उपयोग कर रहा हूं और मैं इसे LastBootUpTime में जोड़ता हूं। मैं कल ही सटीक विवरण की जांच कर पाऊंगा। – wilx