c# - কিভাবে সি#সি CPU ব্যবহার পেতে?




cpu-usage (6)

অনুরোধ করা চেয়ে একটু বেশি কিন্তু আমি অতিরিক্ত টাইমার কোডটি ট্র্যাক এবং সতর্কতার জন্য ব্যবহার করি যদি CPU ব্যবহারটি 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 = 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";
    }
}

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

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


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

এইভাবে শুরু করুন:

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";
} 

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

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

সি-তে সব সিওর জুড়ে CPU ব্যবহার করুন # WMI ব্যবহার করে


এই ক্লাস স্বয়ংক্রিয়ভাবে প্রতি 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;
    }
}

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

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();
}

বেশ কিছু জটিল থ্রেড পড়ার সময় কিছুটা সময় কাটানোর পর বেশ জটিল মনে হল আমি এই সাথে এসেছি। আমি একটি 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 কোর সার্ভারে SQL দ্বারা ব্যবহৃত CPU এর% সঠিকভাবে পরিমাপ করা হচ্ছে।





cpu-usage