程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> asp.net mvc4 簡單的服務器監控開發之C#獲取服務器CPU、RAM、TCP等系統信息(上),

asp.net mvc4 簡單的服務器監控開發之C#獲取服務器CPU、RAM、TCP等系統信息(上),

編輯:關於.NET

asp.net mvc4 簡單的服務器監控開發之C#獲取服務器CPU、RAM、TCP等系統信息(上),


一、背景

   前段時間服務器出了點問題,加上學業愈來愈緊張,寫博文分享的時間越來越少。雖然不是第一次在博客園上寫經驗,但是近期分享的博文得到了不少的朋友支持和指正,在這裡內心非常感激和開心。希望以後能認真用好時間,把一些有用的經驗分享給需要的人,當然本科階段的我還有許多不懂的,如果在文章中有錯誤,希望大家多多指正,必虛心受教。

  今天要分享的是使用c#獲取服務器CPU、RAM、TCP、磁盤使用情況。前段時間,做了一個幾十人的並發測試,服務器宕機了,後來上控制管理台檢查測試時間段裡服務器各項數據,可惜沒有這塊數據的提供。為此,我想在web程序中,加入一個小監控的功能,以方便自己隨時調用和查看我想要的信息。為了實現這個功能,首先得獲取服務器上得一些數據:CPU、RAM、TCP、磁盤使用數據。

 

二、解決思路或過程

首先獲取CPU的使用情況:

添加如下代碼:

 /// <summary>
    /// 獲取CPU信息
    /// </summary>
    public class CPUInfo
    {        
        /// <summary>
        /// 輸出CPU信息
        /// </summary>
        /// <returns></returns>
        public string GetCPUInfo()
        {
           
            StringBuilder sb = new StringBuilder();
            int cpuPercent = Convert.ToInt32(GetCPUCounter());           
            sb.Append(cpuPercent);           
            return sb.ToString();
        }

        /// <summary>
        /// 獲取CPU信息
        /// </summary>
        /// <returns></returns>
        private static object GetCPUCounter()
        {
            PerformanceCounter pc = new PerformanceCounter();
            pc.CategoryName = "Processor";
            pc.CounterName = "% Processor Time";
            pc.InstanceName = "_Total";            
            dynamic Value_1 = pc.NextValue();
            System.Threading.Thread.Sleep(1000);            
            dynamic Value_2 = pc.NextValue();
            return Value_2;
        }
    }

再是獲取當前服務器內存使用數據:

    代碼如下:

 /// <summary>
    /// 獲取內存信息
    /// </summary>
    public class MemoryInfo
    {

        //定義內存的信息結構
        [StructLayout(LayoutKind.Sequential)]
        public struct MEMORY_INFO
        {
            public uint dwLength;
            public uint dwMemoryLoad;
            public uint dwTotalPhys;
            public uint dwAvailPhys;
            public uint dwTotalPageFile;
            public uint dwAvailPageFile;
            public uint dwTotalVirtual;
            public uint dwAvailVirtual;
        }

        /// <summary>
        /// kernel32.dll是Windows9x/Me中非常重要的32位動態鏈接庫文件,屬於內核級文件。
     ///它控制著系統的內存管理、數據的輸入輸出操作和中斷處理,當Windows啟動時,kernel32.dll就駐留在內存中特定的寫保護區域,使別的程序無法占用這個內存區域。 /// </summary> [DllImport("kernel32")] private static extern void GetWindowsDirectory(StringBuilder WinDir, int count); [DllImport("kernel32")] private static extern void GetSystemDirectory(StringBuilder SysDir, int count); [DllImport("kernel32")] private static extern void GlobalMemoryStatus(ref MEMORY_INFO meminfo); /// <summary> /// 獲取內存信息 /// </summary> /// <returns></returns> public string GetMemInfo() { //調用GlobalMemoryStatus函數獲取內存的相關信息 MEMORY_INFO MemInfo = new MEMORY_INFO(); GlobalMemoryStatus(ref MemInfo); //拼接字符串 StringBuilder sb = new StringBuilder(); return MemInfo.dwMemoryLoad.ToString(); } }

接著是磁盤使用數據獲取,因為我服務器只有一個C盤,因此這裡寫死了,有多盤的朋友可以寫一個List,同樣方法獲取總盤的信息:

代碼如下:

 /// <summary>
    /// 獲取磁盤信息
    /// </summary>
    public class DiskInfo
    {
        /// <summary>
        /// 獲取指定驅動器的空間總大小(單位為B) 
        /// 只需輸入代表驅動器的字母即可 (大寫) 
        /// </summary>
        /// <param name="str_HardDiskName"></param>
        /// <returns></returns>
        public float GetHardDiskSpace(string str_HardDiskName)
        {
            float totalSize = new float();
            str_HardDiskName = str_HardDiskName + ":\\";
            System.IO.DriveInfo[] drives = System.IO.DriveInfo.GetDrives();
            foreach (System.IO.DriveInfo drive in drives)
            {
                if (drive.Name == str_HardDiskName)
                {
                    totalSize = drive.TotalSize / (1024 * 1024 * 1024);
                }
            }
            return totalSize;
        }

        public string GetHardDiskSpace()
        {
            string str_HardDiskName = "C";
            float totalSize = new float();
            str_HardDiskName = str_HardDiskName + ":\\";
            System.IO.DriveInfo[] drives = System.IO.DriveInfo.GetDrives();
            foreach (System.IO.DriveInfo drive in drives)
            {
                if (drive.Name == str_HardDiskName)
                {
                    totalSize = drive.TotalSize / (1024 * 1024 * 1024);
                }
            }
            string TotalSize = totalSize.ToString();
            return TotalSize;
        }

        /// <summary>
        /// 獲取指定驅動器的剩余空間總大小(單位為B) 
        /// 只需輸入代表驅動器的字母即可  
        /// </summary>
        /// <param name="str_HardDiskName"></param>
        /// <returns></returns>
        public string GetHardDiskFreeSpace(string str_HardDiskName)
        {
            long freeSpace = new long();
            string FreeSpace = "";
            str_HardDiskName = str_HardDiskName + ":\\";
            System.IO.DriveInfo[] drives = System.IO.DriveInfo.GetDrives();
            foreach (System.IO.DriveInfo drive in drives)
            {
                if (drive.Name == str_HardDiskName)
                {
                    freeSpace = drive.TotalFreeSpace / (1024 * 1024 * 1024);
                }
            }
            FreeSpace = freeSpace.ToString();

            return FreeSpace;
        }
    }

最後是TCP連接數:

代碼如下:

/// <summary>
    /// 獲取端口連接數
    /// </summary>
    public class TCPInfo
    {
        public string Get_TCP_Count()
        {
            string TCPCount = "";
            IPGlobalProperties properties = IPGlobalProperties.GetIPGlobalProperties();
            TcpConnectionInformation[] connections = properties.GetActiveTcpConnections();            
            TCPCount = connections.Count().ToString();
            return TCPCount;
        }
    }

這裡還需要補充一個類 Trans,這可以幫助轉換格式,如將byte進行轉換為GB:

 /// <summary>
    /// 轉換
    /// </summary>
    public class Trans
    {
        public static decimal ConvertBytes(string b, int iteration)
        {
            long iter = 1;
            for (int i = 0; i < iteration; i++)
                iter *= 1024;
            return Math.Round((Convert.ToDecimal(b)) / Convert.ToDecimal(iter), 2, MidpointRounding.AwayFromZero);
        }
    }

 

三、總結與看法

  上述代碼或許有一些許不全的地方,因為這是我從項目裡剝離出來的,所以缺少的一些代碼得補上,如果有疑問請留言吧。如果我思路和方法有誤,懇請各位指正,虛心求教。轉載請注明來源與出處,謝謝合作 By 點將台無將

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved