সি # তে সিপিইউ ব্যবহার কীভাবে পাবেন?


204

আমি সি # তে একটি অ্যাপ্লিকেশনের জন্য সামগ্রিক মোট সিপিইউ ব্যবহার পেতে চাই। প্রক্রিয়াগুলির বৈশিষ্ট্যগুলি খনন করার জন্য আমি অনেকগুলি উপায় পেয়েছি, তবে আমি কেবলমাত্র প্রক্রিয়াগুলির সিপিইউ ব্যবহার করতে চাই এবং আপনার মতো মোট সিপিইউ টাস্কম্যানেজারে পেতে চাই।

আমি কেমন করে ঐটি করি?



36
পৃথিবীতে কীভাবে এই বিষয় বন্ধ? হাস্যকর।
পিটার মুর

উত্তর:


205

আপনি System.Diagnostics থেকে পারফরম্যান্স কাউন্টার ক্লাসটি ব্যবহার করতে পারেন ।

এর মতো সূচনা করুন:

PerformanceCounter cpuCounter;
PerformanceCounter ramCounter;

cpuCounter = new PerformanceCounter("Processor", "% Processor Time", "_Total");
ramCounter = new PerformanceCounter("Memory", "Available MBytes");

এটি গ্রহণ করুন:

public string getCurrentCpuUsage(){
            return cpuCounter.NextValue()+"%";
}

public string getAvailableRAM(){
            return ramCounter.NextValue()+"MB";
} 

80
দুর্দান্ত - তবে আসল উত্সটি এখান থেকে উপস্থিত বলে মনে হচ্ছে: zamov.online.fr/EXHTML/CSharp/CSharp_927308.html
ম্যাট রেফগি

19
আমি যে বিষয়টি আবিষ্কার করেছি তার থেকে আমাকে দুবার সিপুউউটার.নেক্সটভ্যালু () ব্যবহার করতে হয়েছিল এবং তাদের মধ্যে আমাকে ঘুমাতে হয়েছিল (500)
অ্যাঞ্জেল.কিং .৪7

ম্যাট ঠিক আছে। এমনকি বাগগুলি সহ "রিটার্ন" কীওয়ার্ডটি ভুলে যাওয়ার মতো।
র‌্যাম্প 51

8
হ্যাঁ, এটি link লিঙ্কটি থেকে অনুলিপিটির মতো দেখাচ্ছে, তাই মূল রেফারেন্সের জন্য একটি লিঙ্কটি সুন্দর স্টাইলটি দিত। অন্যদিকে, উত্তরটি প্রদান করতে এটি সিএমএসের খুব সুন্দর তাই অলস বিকাশকারীদের একই উত্তর খুঁজতে সমস্ত গুগলে অনুসন্ধান করতে হবে না। : ও)
বার্গগ্রিনডিকে

13
আপনাকে সিস্টেম.থ্রেডিং.ড্রেড.স্লিপ কল ইন-এর মধ্যে (১০০০ মিমি পর্যাপ্ত হওয়া উচিত) সহ দু'বার কল করতে হবে N এটি কেন প্রয়োজন তা সম্পর্কে আরও তথ্যের জন্য ব্লগস.এমএসএন / বি / বিসিএলটিম / অর্কিভ / ২০০6/০/0/২০/6১15১156. এএসপিএক্স দেখুন , তবে উচ্চ স্তরের সংক্ষিপ্তসারটি হ'ল মানটি নির্ধারণ করার জন্য আপনার দুটি নমুনা দরকার, এবং এগুলি দুটি পেতে আপনাকে ওএসকে একটি সময় দেওয়া দরকার।
Cleggy

63

পুনঃস্থাপনের চেয়ে কিছুটা বেশি ছিল তবে সিপিইউ ব্যবহারটি 1 মিনিট বা তারও বেশি সময় ধরে 90% বা তার বেশি হলে ট্র্যাক এবং সতর্ক করতে আমি অতিরিক্ত টাইমার কোডটি ব্যবহার করি।

public class Form1
{

    int totalHits = 0;

    public object getCPUCounter()
    {

        PerformanceCounter cpuCounter = new PerformanceCounter();
        cpuCounter.CategoryName = "Processor";
        cpuCounter.CounterName = "% Processor Time";
        cpuCounter.InstanceName = "_Total";

                     // will always start at 0
        dynamic firstValue = cpuCounter.NextValue();
        System.Threading.Thread.Sleep(1000);
                    // now matches task manager reading
        dynamic secondValue = cpuCounter.NextValue();

        return secondValue;

    }


    private void Timer1_Tick(Object sender, EventArgs e)
    {
        int cpuPercent = (int)getCPUCounter();
        if (cpuPercent >= 90)
        {
            totalHits = totalHits + 1;
            if (totalHits == 60)
            {
                Interaction.MsgBox("ALERT 90% usage for 1 minute");
                totalHits = 0;
            }                        
        }
        else
        {
            totalHits = 0;
        }
        Label1.Text = cpuPercent + " % CPU";
        //Label2.Text = getRAMCounter() + " RAM Free";
        Label3.Text = totalHits + " seconds over 20% usage";
    }
}

7
GetRAMCounter () কোথায়?
ডিয়েটার বি

1
cpuCounter.NextValueফেরত afloat । সুতরাং এটি একটি নিয়োগ dynamic? তাহলে কেন সেই dynamicহিসাবে ফিরে object? তারপরে কেন লাইনে objectএকটি নির্দিষ্ট করার চেষ্টা করবেন ? (এই কোডটি সংকলন করবে না))intint cpuPercent = getCPUCounter()
উইক

21

বেশ কয়েকটি জটিল থ্রো যা বেশ জটিল বলে মনে হয়েছিল কিছু সময় পড়ার পরে আমি এগুলি নিয়ে এসেছি। আমার এটি একটি 8 টি মূল মেশিনের জন্য দরকার যেখানে আমি এসকিউএল সার্ভারটি নিরীক্ষণ করতে চেয়েছিলাম। তারপরে নীচের কোডটির জন্য আমি অ্যাপ্লিকেশন হিসাবে "sqlservr" এ পাস করেছি।

private static void RunTest(string appName)
{
    bool done = false;
    PerformanceCounter total_cpu = new PerformanceCounter("Process", "% Processor Time", "_Total");
    PerformanceCounter process_cpu = new PerformanceCounter("Process", "% Processor Time", appName);
    while (!done)
    {
        float t = total_cpu.NextValue();
        float p = process_cpu.NextValue();
        Console.WriteLine(String.Format("_Total = {0}  App = {1} {2}%\n", t, p, p / t * 100));
        System.Threading.Thread.Sleep(1000);
    }
}

এটি আমার 8 টি মূল সার্ভারে এসকিউএল দ্বারা ব্যবহৃত সিপিইউর% সঠিকভাবে পরিমাপ করছে বলে মনে হচ্ছে।


টোটাল_সিপিই পারফরম্যান্স কাউন্টার ("প্রসেসর") হওয়া উচিত, পারফরম্যান্স কাউন্টার ("প্রক্রিয়া") নয় .. অন্যথায় আপনি কেবল 100% * সংখ্যা পাবেন।
স্টিভ কুক

3
আপনি কোথায় doneসত্য সেট করেন? আমি যদি কিছু উপেক্ষা না করি তবে এটি একটি অন্তহীন লুপ হিসাবে while(!done){...}
প্রতীয়মান

@ মানফ্রেড এটি প্রকৃতপক্ষে একটি অন্তহীন লুপ
জেনি

16

ঠিক আছে, বুঝেছি! আপনার সাহায্যের জন্য ধন্যবাদ!

এটি করার কোডটি এখানে:

private void button1_Click(object sender, EventArgs e)
{
    selectedServer = "JS000943";
    listBox1.Items.Add(GetProcessorIdleTime(selectedServer).ToString());
}

private static int GetProcessorIdleTime(string selectedServer)
{
    try
    {
        var searcher = new
           ManagementObjectSearcher
             (@"\\"+ selectedServer +@"\root\CIMV2",
              "SELECT * FROM Win32_PerfFormattedData_PerfOS_Processor WHERE Name=\"_Total\"");

        ManagementObjectCollection collection = searcher.Get();
        ManagementObject queryObj = collection.Cast<ManagementObject>().First();

        return Convert.ToInt32(queryObj["PercentIdleTime"]);
    }
    catch (ManagementException e)
    {
        MessageBox.Show("An error occurred while querying for WMI data: " + e.Message);
    }
    return -1;
}

পরিবর্তনশীল সিলেক্ট সার্ভারের পরিবর্তে সার্ভারের নাম পাওয়া ভাল ছিল। like this.string computername = পরিবেশের.GetEnVNVA পরিবর্তনশীল ("computername");
ডেভ

9

সিপিইউ শতাংশের তথ্য পেতে আপনি ডাব্লুএমআই ব্যবহার করতে পারেন। এমনকি আপনার কাছে সঠিক অনুমতি থাকলে দূরবর্তী কম্পিউটারে লগ ইন করতে পারেন। এ http://www.csharphelp.com/archives2/archive334.htmlআপনি কী অর্জন করতে পারেন তার ধারণা পেতে ।

উইন 32_প্রসেসের জন্য এমএসডিএন রেফারেন্স হতে পারে সহায়ক নেমস্পেসের ।

একটি কোডপ্রজেক্ট উদাহরণও দেখুন কীভাবে: (প্রায়) ডাব্লুএমআইতে সি # এর মাধ্যমে সমস্ত কিছু


5

সিএমএসের এটি ঠিক আছে তবে আপনি যদি ভিজ্যুয়াল স্টুডিওতে সার্ভার এক্সপ্লোরার ব্যবহার করেন এবং পারফরম্যান্স কাউন্টারের ট্যাবটি নিয়ে খেলা করেন তবে কীভাবে প্রচুর দরকারী মেট্রিক পাবেন তা আপনি বুঝতে পারেন।


3

এটি আমার পক্ষে কাজ করে বলে মনে হচ্ছে, প্রসেসরের নির্দিষ্ট শতাংশে না আসা পর্যন্ত অপেক্ষা করার উদাহরণ waiting

var cpuCounter = new PerformanceCounter("Processor", "% Processor Time", "_Total");
int usage = (int) cpuCounter.NextValue();
while (usage == 0 || usage > 80)
{
     Thread.Sleep(250);
     usage = (int)cpuCounter.NextValue();
}

আপনি যখন 0 ব্যবহার করছেন তখন ঘুমাচ্ছেন কেন?
वाटশীশুন

2

এই শ্রেণিটি প্রতি 1 সেকেন্ডে স্বয়ংক্রিয়ভাবে কাউন্টারটি পোল করে এবং সুরক্ষিত থ্রেড হয়:

public class ProcessorUsage
{
    const float sampleFrequencyMillis = 1000;

    protected object syncLock = new object();
    protected PerformanceCounter counter;
    protected float lastSample;
    protected DateTime lastSampleTime;

    /// <summary>
    /// 
    /// </summary>
    public ProcessorUsage()
    {
        this.counter = new PerformanceCounter("Processor", "% Processor Time", "_Total", true);
    }

    /// <summary>
    /// 
    /// </summary>
    /// <returns></returns>
    public float GetCurrentValue()
    {
        if ((DateTime.UtcNow - lastSampleTime).TotalMilliseconds > sampleFrequencyMillis)
        {
            lock (syncLock)
            {
                if ((DateTime.UtcNow - lastSampleTime).TotalMilliseconds > sampleFrequencyMillis)
                {
                    lastSample = counter.NextValue();
                    lastSampleTime = DateTime.UtcNow;
                }
            }
        }

        return lastSample;
    }
}

System.DateTimeআসলে একটি 8 বাইট মান টাইপ যার অর্থ একটি DateTimeভেরিয়েবলের অ্যাসাইনমেন্টগুলি পারমাণবিক নয়। এই কোডটি 32 বিট প্ল্যাটফর্মগুলিতে নিরাপদ নয়।
অ্যান্ড্রুজ

1

আমি সমস্ত PerformanceCounterসমাধানে 1 সেকেন্ডের স্টলে যুক্ত হওয়া পছন্দ করি না । পরিবর্তে আমি একটি WMIসমাধান ব্যবহার করতে বেছে নিয়েছি । 1 সেকেন্ড অপেক্ষার / স্টল বিদ্যমান থাকার কারণটি হ'ল একটি ব্যবহার করার সময় পঠন সঠিক হতে দেওয়াPerformanceCounter । তবে আপনি যদি এই পদ্ধতিটি প্রায়শই কল করে এবং এই তথ্যটি সতেজ করেন তবে আমি পরামর্শ দিচ্ছি যে এই বিলম্বটি ক্রমাগত না করা উচিত ... এমনকি এটি পাওয়ার জন্য একটি অ্যাসিঙ্ক প্রক্রিয়া করার চিন্তাভাবনা করা হলেও।

আমি এখানে থেকে স্নিপেট দিয়ে শুরু করেছি ডাব্লুএমআইতে সি # ব্যবহার করে সি # ব্যবহার করে ফিরে আসছি এবং নীচের আমার ব্লগ পোস্টে সমাধানের সম্পূর্ণ ব্যাখ্যা যুক্ত করেছি:

সি # ডাব্লুএমআই ব্যবহার করে সমস্ত কোর জুড়ে সিপিইউ ব্যবহার পান


আপনার ব্লগে লিঙ্ক করার পরিবর্তে দয়া করে উত্তরটি এখানে অন্তর্ভুক্ত করুন।
হারমান

@ হারমান - আমি কেবল আমার ব্লগে লিঙ্ক দিইনি; আমি 1 তম ব্যাখ্যা দিয়েছি এবং এখানে পোস্টের বাইরে গভীরতর উত্তরের জন্য একটি লিঙ্ক সরবরাহ করতে এগিয়ে চলেছি।
এটকনওয়ে

আপনার ব্লগ পোস্টে সমাধান 12 লাইনের কোডের মতো। লোকেরা আপনার ব্লগটি দেখার জন্য চেষ্টা করা ছাড়া অন্য উত্তরগুলিতে কেন তা অন্তর্ভুক্ত করবেন না?
হারমান

@ হারমান - লিঙ্কটিতে ক্লিক করতে সমস্যা কীহেতু এটিতে গভীরতর ব্যাখ্যা রয়েছে; এটাই ধারণা কেন 'কেন' অংশ বিস্তৃত? এছাড়াও এটি 7 বছর বয়সী, শুধু বলছি। এই সঠিক পোস্টটি মনে রাখার পক্ষে শক্ত এবং আমি তখন এসওতে নতুন হয়েছি।
এটকনওয়ে

লিঙ্কটি নষ্ট হয়ে যেতে পারে এবং মূল বিষয়বস্তু ইনলাইন হলে উত্তর স্ক্যান করা অনেক সহজ। আমার অন্য উত্তরে রূ .় হওয়ার জন্য দুঃখিত, আমি আপনাকে কঠোর সময় দেওয়ার জন্য এখানে নেই। :)
হারমান

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.