C#获取windows系统资源使用情况

news/2024/7/7 10:15:48

1.前言

之前有一篇博客介绍如何获取Linux服务器上的资源使用情况《Java 获取服务器资源(内存、负载、磁盘容量)》,这里介绍如何通过C#获取Window系统的资源使用。

2.获取服务器资源

2.1.内存

[DllImport("kernel32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        private static extern bool GlobalMemoryStatusEx(ref MEMORY_INFO mi);

        //定义内存的信息结构
        [StructLayout(LayoutKind.Sequential)]
        private struct MEMORY_INFO {
            public uint DWLength;//当前结构体大小
            public uint DWMemoryLoad;//当前内存使用率
            public ulong ullTotalPhys;//总计物理内存大小
            public ulong ullAvailPhys;//可用物理内存代销
            public ulong ullTotalPagefiles;//总计交换文件大小
            public ulong ullAvailPagefiles;//可用交换文件大小
            public ulong ullTotalVirtual;//总计虚拟内存大小
            public ulong ullAvailVirtual;//可用虚拟内存大小
        }

        private static MEMORY_INFO GetMemoryInfo() {
            MEMORY_INFO memoryInfo = new MEMORY_INFO();
            memoryInfo.DWLength = (uint)System.Runtime.InteropServices.Marshal.SizeOf(memoryInfo);
            GlobalMemoryStatusEx(ref memoryInfo);
            return memoryInfo;
        }

        /// <summary>
        /// 获取内存信息
        /// </summary>
        /// <returns></returns>
        public static ServerMemory GetSysMemoryInfo()
        {
            try
            {
                MEMORY_INFO memoryInfo = GetMemoryInfo();
                ServerMemory serverMemory = new ServerMemory();
                serverMemory.serverId = serverId;
                serverMemory.serverName = serverName;
                serverMemory.memTotal = (uint)(memoryInfo.ullTotalPhys / 1024);
                serverMemory.memFree = (uint)(memoryInfo.ullTotalPagefiles / 1024);
                serverMemory.memAvailable = (uint)(memoryInfo.ullAvailPhys / 1024);
                serverMemory.active = (uint)(memoryInfo.ullAvailPhys/1024);
                long timestamp = CommonUtil.getNowDateTimestamp();
                serverMemory.dateTimestamp = timestamp;
                serverMemory.dateTime = CommonUtil.dateTime2Timestamp(timestamp);
                
                return serverMemory;
            }
            catch (Exception ex) {
                Log.Instance.Error("GetSysMemoryInfo:" + ex.Message);
                return null;
            }
        }

因为获取到的资源是以byte为单位,我这里将其转成了KB,所以除以了1024.

ServerMemory实体类

public class ServerMemory
    {
        public string serverId { set; get; }
        public string serverName { set; get; }
        /// <summary>
        /// 内存总量
        /// </summary>
        public uint memTotal { set; get; }
        /// <summary>
        /// 系统保留量
        /// </summary>
        public uint memFree { set; get; }
        /// <summary>
        /// 应用程序可用量
        /// </summary>
        public uint memAvailable { set; get; }
        /// <summary>
        /// 可使用量
        /// </summary>
        public uint active { set; get; }
        public string dateTime { set; get; }
        public long dateTimestamp { set; get; }
    }

2.2.磁盘

public static ServerDisk GetUsedDisk() {
            try
            {
                List<Dictionary<string, string>> diskInfoList = new List<Dictionary<string, string>>();
                ManagementClass diskClass = new ManagementClass("Win32_LogicalDisk");
                ManagementObjectCollection disks = diskClass.GetInstances();
                foreach (ManagementObject disk in disks)
                {
                    Dictionary<string, string> diskInfoDic = new Dictionary<string, string>();
                    try
                    {
                        // 磁盘名称
                        diskInfoDic["Name"] = disk["Name"].ToString();
                        // 磁盘描述
                        diskInfoDic["Description"] = disk["Description"].ToString();
                        // 磁盘总容量,可用空间,已用空间
                        if (System.Convert.ToInt64(disk["Size"]) > 0)
                        {
                            long totalSpace = System.Convert.ToInt64(disk["Size"]) / 1024;
                            long freeSpace = System.Convert.ToInt64(disk["FreeSpace"]) / 1024;
                            long usedSpace = totalSpace - freeSpace;
                            diskInfoDic["totalSpace"] = totalSpace.ToString();
                            diskInfoDic["usedSpace"] = usedSpace.ToString();
                            diskInfoDic["freeSpace"] = freeSpace.ToString();
                        }
                        diskInfoList.Add(diskInfoDic);
                    }
                    catch (Exception ex)
                    {
                        Log.Instance.Error("ManagementObject->disk:" + ex.Message);
                    }
                }
                if (diskInfoList.Count > 0)
                {
                    ServerDisk serverDisk = new ServerDisk();
                    serverDisk.serverId = serverId;
                    serverDisk.serverName = serverName;
                    Dictionary<string, DiskInfo> diskMap = new Dictionary<string, DiskInfo>();
                    foreach (Dictionary<string, string> dic in diskInfoList)
                    {
                        if (dic.ContainsKey("totalSpace") && dic.ContainsKey("usedSpace") && dic.ContainsKey("freeSpace"))
                        {
                            DiskInfo diskInfo = new DiskInfo();
                            diskInfo.diskName = dic["Name"];
                            diskInfo.diskSize = double.Parse(dic["totalSpace"]);
                            diskInfo.used = double.Parse(dic["usedSpace"]);
                            diskInfo.avail = double.Parse(dic["freeSpace"]);
                            diskInfo.usageRate = (int)((diskInfo.used / diskInfo.diskSize) * 100);
                            diskMap.Add(diskInfo.diskName, diskInfo);
                        }
                    }
                    serverDisk.diskInfoMap = diskMap;
                    long timestamp = CommonUtil.getNowDateTimestamp();
                    serverDisk.dateTimestamp = timestamp;
                    serverDisk.dateTime = CommonUtil.dateTime2Timestamp(timestamp);
                    return serverDisk;
                }
                else
                {
                    return null;
                }
            }
            catch (Exception ex) {
                Log.Instance.Error("GetUsedDisk:"+ex.Message);
                return null;
            }
        }

ServerDisk实体类

   public class ServerDisk
    {
        public string serverId { set; get; }
        public string serverName { set; get; }
        public Dictionary<string,DiskInfo> diskInfoMap { set; get; }
        public string dateTime { set; get; }
        public long dateTimestamp { set; get; }
    }

DiskInfo实体类

    public class DiskInfo
    {
        public string diskName { set; get; }
        public double diskSize { set; get; }
        public double used { set; get; }
        public double avail { set; get; }
        public int usageRate { set; get; }
    }

2.3.CPU

public static ServerCpu GetUsedCPU() {
            ManagementClass mc = new ManagementClass("Win32_PerfFormattedData_PerfOs_Processor");
            ManagementObjectCollection moc = mc.GetInstances();
            List <string> list = new List <string> ();
            foreach (ManagementObject mo in moc) {
                if (mo["Name"].ToString() == "_Total") {
                    list.Add(mo["percentprocessorTime"].ToString());
                }
            }
            int percentage = list.Sum(s => int.Parse(s));
            ServerCpu serverCpu = new ServerCpu();
            serverCpu.serverId = serverId;
            serverCpu.serverName = serverName;
            serverCpu.percentage = percentage;
            long timestamp = CommonUtil.getNowDateTimestamp();
            serverCpu.dateTimestamp = timestamp;
            serverCpu.dateTime = CommonUtil.dateTime2Timestamp(timestamp);
            return serverCpu;
        }

ServerCpu实体类

 public class ServerCpu
    {
        public string serverId { set; get; }
        public string serverName { set; get; }
        public int percentage { set; get; }
        public string dateTime { set; get; }
        public long dateTimestamp { set; get; }
    }

3.最终效果

最终我想实现对Linux和Windows服务器的监控,类似效果如下:


http://lihuaxi.xjx100.cn/news/1920460.html

相关文章

【轻松入门】OpenCV4.8 + QT5.x开发环境搭建

引言 大家好&#xff0c;今天给大家分享一下最新版本OpenCV4.8 QT5 如何一起配置&#xff0c;完成环境搭建的。 下载OpenCV4.8并解压缩 软件版本支持 CMake3.13 或者以上版本 https://cmake.org/ VS2017专业版或者以上版本 QT5.15.2 OpenCV4.8源码包 https://github.com/op…

TSINGSEE青犀智能分析网关V4在智慧小区场景中的应用

一、方案背景 随着物联网、AI、大数据、5G、边缘计算、移动互联网等新兴技术的不断成熟和应用&#xff0c;社区作为汇聚科技社会人、房、车三大物联网时代最核心的要素&#xff0c;其价值将不言而喻。建设智慧小区需要充分发挥信息技术在社区管理中的作用&#xff0c;提高居民…

NFC刷卡soc芯片SI3262集成刷卡+触摸+ACD超低功耗一体

简介 13.56mhz刷卡soc芯片SI3262集成刷卡触摸ACD超低功耗&#xff0c;ACD模式刷卡距离可达到5cm以上&#xff0c;非常适用于小体积门锁&#xff0c;密码锁&#xff0c;柜锁&#xff0c;接下来介绍一下这款芯片的具体功能。 优势 1.超低功耗&#xff0c;最低功耗达 1.7uA&…

C语言中关于switch语句的理解

首先我们来看一下switch的定义 switch&#xff08;整型表达式&#xff09; { case 整型常量表达式: 语句&#xff1b; } 我们在书写时要注意一下&#xff0c;无论是在switch还是case&#xff0c;后面跟着的都一定要是整型&#xff0c;而且case这一行写完时&#xff0c;最后要用…

SQL备忘--子查询与ALL/ANY运算符

概念 在SQL查询语句中包含了其他的查询语句&#xff0c;出现了SQL语句的嵌套&#xff0c;即为使用了嵌套子查询 子查询用法 子查询可以用在&#xff1a; SELECT查询字段中FROM表名语句中WHERE条件中 由此可见子查询用法广泛&#xff0c;可用在SQL基本语句的每个位置。但具…

【多线程】常见问题简单总结

目录 1. 竞态条件&#xff08;Race Condition&#xff09; 场景: 解决方法: 2. 死锁&#xff08;Deadlock&#xff09; 场景: 解决方法: 3. 线程饥饿&#xff08;Thread Starvation&#xff09; 场景: 解决方法: 4. 活锁&#xff08;Livelock&#xff09; 场景: 解…

K8S Helm安装RocketMQ standalone单机版,配置外网地址注册到nameserver中方便本地开发

K8S Helm安装RocketMQ standalone单机版&#xff0c;配置外网地址注册到nameserver中方便本地开发 helm地址 rocketmq 3.0.2 sir5kong/rocketmq helm repo add rocketmq https://helm-charts.itboon.top/rocketmq helm pull rocketmq/rocketmq tar -xvf rocketmq-3.0.2.t…

【五】【C语言\动态规划】删除并获得点数、粉刷房子、买卖股票的最佳时机含冷冻期,三道题目深度解析

动态规划 动态规划就像是解决问题的一种策略&#xff0c;它可以帮助我们更高效地找到问题的解决方案。这个策略的核心思想就是将问题分解为一系列的小问题&#xff0c;并将每个小问题的解保存起来。这样&#xff0c;当我们需要解决原始问题的时候&#xff0c;我们就可以直接利…