2011-03-18 7 views
7

में सीपीयू उपयोग कैसे प्राप्त करें एएसपीनेट पेज पर सीपीयू और रैम उपयोग आंकड़े दिखाने का कोई तरीका है। मैं this कोड की कोशिश की है, लेकिन मैं त्रुटि है:एएसपीनेट

Access to the registry key 'Global' is denied. 
इस लाइन पर

:

ramCounter = new PerformanceCounter("Memory", "Available MBytes"); 
+0

क्या आपने प्रक्रिया कक्षा की कोशिश की है? अर्थात। 'Process.GetCurrentProcess()' और 'प्रक्रिया TotalProcessorTime'? यह निर्धारित करके कि कितना मूल्य निश्चित अवधि में बढ़ता है, आप आसानी से पता लगा सकते हैं कि उस अवधि में आपको कितना CPU% दिया/उपयोग किया गया था। मैं इसे एक टिप्पणी के रूप में छोड़ देता हूं क्योंकि मुझे नहीं पता कि आपको यह जांचने की अनुमति होगी कि आपके द्वारा पोस्ट किया गया त्रुटि संदेश दिया गया है या नहीं। –

+0

क्या आपके पास आईआईएस प्रबंधन तक पहुंच है? यदि आप करते हैं, तो आप रजिस्ट्री के इस हिस्से तक अपने कार्यकर्ता पूल तक पहुंच प्रदान कर सकते हैं। यदि नहीं - उदा। अगर आप साझा होस्टिंग पर हैं - तो क्षमा करें लेकिन आपको बस पहुंच नहीं है। – Stuart

+0

@ स्टुअर्ड: मेरे पास अपना स्वयं का वीडीएस विंडोज सर्वर 2008 चल रहा है। शायद इसके लिए सबसे अच्छा समाधान विंडोज़ सेवा लिखना है। –

उत्तर

5

टिप्पणी में के रूप में उल्लेख किया है, उपयुक्त अनुमतियों के बिना आप ऐसा करने में सक्षम नहीं होगा। संसाधन सांख्यिकी प्रणाली है जो विशेषाधिकार प्राप्त जानकारी

+0

मेरा मानना ​​है कि आप सही हैं ... लेकिन क्या आप शायद अधिक जानकारी प्रदान कर सकते हैं ... मान लें कि आपने इसे स्वयं में चलाया है और पता है कि अनुमतियों की क्या आवश्यकता है और क्या नहीं .. – Seabizkit

5

उपयोग है की अन्य उपयोगकर्ताओं के स्वामित्व की प्रक्रिया के बारे में जानकारी का एक बहुत कुछ शामिल होंगे:

System.Diagnostics.PerformanceCounter cpuUsage = 
     new System.Diagnostics.PerformanceCounter(); 
    cpuUsage.CategoryName = "Processor"; 
    cpuUsage.CounterName = "% Processor Time"; 
    cpuUsage.InstanceName = "_Total"; 

    float f = cpuUsage.NextValue(); 

संपादित करें:

विंडोज सीमा में उन लोगों के लिए प्रदर्शन काउंटरों के लिए उपयोग व्यवस्थापक या प्रदर्शन लॉग उपयोगकर्ता (Vista +) समूहों में लॉग इन करते हैं। रजिस्ट्री सुरक्षा सेट करना इसे हल नहीं करेगा। यह संभव है कि उपयोगकर्ता कहीं से जुड़ा हुआ है।

+0

मुझे 0 (शून्य) .. –

+0

आपको 'cupUsage.NextValue() 'दो बार चलाएं ... पहली बार हमेशा 0 में परिणाम होगा, दूसरी कॉल अंतिम कॉल के बाद औसत CPU उपयोग वापस कर देगी। – saluce

-3

उपयोग:

new PerformanceCounter("Processor Information", "% Processor Time", "_Total"); 

बजाय:

new PerformanceCounter("Processor", "% Processor Time", "_Total"); 
+1

ओपी ऐसा क्यों करना चाहिए? कृपया समझाएँ! – markus

+0

यह वास्तव में मदद नहीं करता है। हालांकि, यह क्या करता है अगर मदरबोर्ड पर कई भौतिक प्रोसेसर (सीपीयू) एकाधिक, संभवतः हाइपरथ्रेडेड, कोर के साथ होते हैं। दूसरे सीपीयू के औसत को इंगित करने के लिए पहले CPU पर पहले कोर को इंगित करने के लिए इंस्टेंस नाम '0,0' के रूप में दिए गए हैं, या' 1, _Total' के साथ-साथ CPUs के पूरे समूह के लिए '_Total'। यह भौतिक प्रसंस्करण क्षमता के बारे में थोड़ी अधिक जानकारी देता है, लेकिन यह मूल प्रश्न के साथ मदद करने के लिए कुछ भी नहीं देता है। – saluce

+0

उन लोगों में से कोई भी कैसे हल करता है ** "रजिस्ट्री कुंजी तक पहुंच 'ग्लोबल' अस्वीकार कर दिया गया है।" **? – Seabizkit

0

.NextValue (कॉल नहीं करते के लिए) दो बार आप उपयोग कर सकते MVC "वैश्विक चर:

[AllowAnonymous] 
    [HttpGet] 
    [ActionName("serverusage")] 
    public HttpResponseMessage serverusage() 
    { 
     try 
     { 

      PerformanceCounter cpuCounter; 

      if (HttpContext.Current.Application["cpuobj"] == null) 
      { 
       cpuCounter = new PerformanceCounter(); 
       cpuCounter.CategoryName = "Processor"; 
       cpuCounter.CounterName = "% Processor Time"; 
       cpuCounter.InstanceName = "_Total"; 

       HttpContext.Current.Application["cpuobj"] = cpuCounter; 
      } 
      else 
      { 
       cpuCounter = HttpContext.Current.Application["cpuobj"] as PerformanceCounter; 
      } 

      JToken json; 
      try 
      { 
       json = JObject.Parse("{ 'usage' : '" + HttpContext.Current.Application["cpu"] + "'}"); 
      } 
      catch 
      { 
       json = JObject.Parse("{ 'usage' : '" + 0 + "'}"); 
      } 

       HttpContext.Current.Application["cpu"] = cpuCounter.NextValue(); 

      var response = Request.CreateResponse(System.Net.HttpStatusCode.OK); 
      response.Content = new JsonContent(json); 
      return response; 

     } 
     catch (Exception e) 
     { 
      var response = Request.CreateResponse(System.Net.HttpStatusCode.BadRequest); 
      JToken json = JObject.Parse("{ 'problem' : '" + e.Message + "'}"); 
      response.Content = new JsonContent(json); 
      return response; 

     } 

    } 
} 

सार्वजनिक वर्ग JsonContent : HttpContent { निजी रीडोनली JToken _value;

public JsonContent(JToken value) 
    { 
     _value = value; 
     Headers.ContentType = new MediaTypeHeaderValue("application/json"); 
    } 

    protected override Task SerializeToStreamAsync(Stream stream, 
     TransportContext context) 
    { 
     var jw = new JsonTextWriter(new StreamWriter(stream)) 
     { 
      Formatting = Formatting.Indented 
     }; 
     _value.WriteTo(jw); 
     jw.Flush(); 
     return Task.FromResult<object>(null); 
    } 

    protected override bool TryComputeLength(out long length) 
    { 
     length = -1; 
     return false; 
    } 
}