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



cpu-usage (9)

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

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

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


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

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

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


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

এছাড়াও Win32_Process নামস্থান জন্য MSDN রেফারেন্স হতে পারে।

একটি CodeProject উদাহরণটি দেখুন কীভাবে: (প্রায়) সবকিছু WMI এ C # এর মাধ্যমে


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

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

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


আপনি 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";
} 

এটা ঠিক আছে, আমি এটা পেয়েছিলাম! আপনার সাহায্যের জন্য ধন্যবাদ!

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

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

আপনার ক্লাস ব্যবহারকারীদের সমস্ত পদ্ধতি এবং বৈশিষ্ট্য প্রয়োজন ** তালিকা আছে, আপনি এটি থেকে আপনার বর্গ অর্জন করা উচিত। যদি তাদের প্রয়োজন হয় না, তালিকাটি ঘিরে রাখুন এবং আপনার ক্লাস ব্যবহারকারীদের আসলে প্রয়োজনীয় পদ্ধতিগুলির জন্য মোড়ক তৈরি করুন।

এটি একটি কঠোর নিয়ম, যদি আপনি একটি পাবলিক API টি লিখেন , বা অন্য কোনও কোড ব্যবহার করেন যা অনেক লোকের দ্বারা ব্যবহৃত হবে। আপনার যদি একটি ছোট অ্যাপ্লিকেশন থাকে এবং 2 টিরও বেশি ডেভেলপার থাকে তবে আপনি এই নিয়মটি উপেক্ষা করতে পারেন। এটি আপনাকে কিছু সময় বাঁচাবে।

ক্ষুদ্র অ্যাপ্লিকেশনের জন্য, আপনি আরও কম কঠোর ভাষা বেছে নেওয়ার কথা বিবেচনা করতে পারেন। রুবি, জাভাস্ক্রিপ্ট - আপনি কম কোড লিখতে পারবেন যা কিছু।





c# cpu-usage