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

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://www.mfbz.cn/a/284685.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

软件测试/测试开发丨Python 常用第三方库 yaml

YAML 一种数据序列化格式用于人类的可读性和与脚本语言的交互一种被认为可以超越 XML、JSON 的配置文件 YAML 基本语法规则 大小写敏感使用缩进表示层级关系缩进时不允许使用 Tab 键&#xff0c;只允许使用空格缩进的空格数目不重要&#xff0c;只要相同层级的元素左侧对齐即…

储能应用中的BMS系统设计

概要&#xff1a;设计了一款适用于储能应用中的电池管理系统。该系统为&#xff13;层结构&#xff0c;采用&#xff2d;&#xff23;&#xff13;&#xff13;&#xff17;&#xff17;&#xff11;作为模拟量采样芯片&#xff0c;实现了电池的电压、电流、温度等数据的获取&a…

Node.js+Express 路由配置,实现接口分类管理

首先创建一个路由目录及文件 routes/user.js代码 const express require(express); const router express.Router(); // 使用express提供的router对象 const db require(../dbserver/mysql);router.get(/api/user, (req, res) > {const sqlStr SELECT * FROM sys_user;…

IO进程线程 day1 IO基础+标准IO

1、使用fgets统计一个文件的行号 #include <stdio.h> #include<string.h> #include<stdlib.h> int main(int argc, const char *argv[]) {FILE *fpNULL;if((fpfopen("1.c","r"))NULL){return -1;}int count0;char buf;while(buf!EOF){b…

javaWeb商城2

一、家居电子商城 线上电子商城系统&#xff0c;主要实现了用户注册&#xff0c;登录、浏览&#xff0c;查看家居商品信息&#xff0c;购物车&#xff0c;订单&#xff0c;支付&#xff0c;查看通知以及管理员对用户信息的管理&#xff0c;订单管理&#xff0c;商品管理&#…

约翰瑟尔的故事

约翰瑟尔的故事 你即将看到的是“瑟尔效能机”创始者&#xff0c;约翰瑟尔的故事 据瑟尔原话&#xff0c;该装置会是通向自由能源的关键 “他”拥有“会飞”等不可思议的特性相关说法还有待证实&#xff0c;此记录篇仅为告知观者 制片方对瑟尔技术持中立态度 以下是我们所搜集…

2023-12-12LeetCode每日一题(下一个更大元素 IV)

2023-12-12每日一题 一、题目编号 2454. 下一个更大元素 IV二、题目链接 点击跳转到题目位置 三、题目描述 给你一个下标从 0 开始的非负整数数组 nums 。对于 nums 中每一个整数&#xff0c;你必须找到对应元素的 第二大 整数。 如果 nums[j] 满足以下条件&#xff0c;那…

easyx的窗口函数

文章目录 前言一、EasyX的颜色二、EasyX的坐标和设备1&#xff0c;EasyX的坐标2&#xff0c;EasyX的设备 三、窗口函数1&#xff0c;初始化窗口函数2&#xff0c;关闭绘图窗口3&#xff0c;设置窗口背景板颜色4&#xff0c;清空绘图设备 前言 easyx是针对c的图形库&#xff0c;…

48、激活函数 - 梯度消失和梯度爆炸

简单介绍下梯度消失和梯度爆炸,这个不是重点,但是我觉得有必要再深入了解这个概念,以及很多激活函数为什么是可以防止梯度消失的。 梯度消失和梯度爆炸实际上是在神经网络训练过程中经常会遇到的两类问题,这两类问题都与梯度有关。 什么是梯度 在神经网络训练中,梯度是指…

2023年总结及2024年规划:我们结婚啦

目录 1、回首2023 1.1、生活方面 1.2、工作方面 1.3、学习方面 2、展望2024 2.1、生活方面 2.2、工作方面 2.3、学习方面 2023年最重要的事情当然是我们结婚啦&#xff01; 1、回首2023 1.1、生活方面 今年五一假期&#xff0c;我和对象回老家在双方亲友的见证下完…

【LMM 004】LLaVA-RLHF:用事实增强的 RLHF 对齐大型多模态模型

论文标题&#xff1a;Aligning Large Multimodal Models with Factually Augmented RLHF 论文作者&#xff1a;Zhiqing Sun, Sheng Shen, Shengcao Cao, Haotian Liu, Chunyuan Li, Yikang Shen, Chuang Gan, Liang-Yan Gui, Yu-Xiong Wang, Yiming Yang, Kurt Keutzer, Trevor…

图片预览 element-plus 带页码

vue3、element-plus项目中&#xff0c;点击预览图片&#xff0c;并显示页码效果如图 安装 | Element Plus <div class"image__preview"><el-imagestyle"width: 100px; height: 100px":src"imgListArr[0]":zoom-rate"1.2":max…

Java中利用Redis,ZooKeeper,数据库等实现分布式锁(遥遥领先)

1. 分布式锁 1.1 什么是分布式锁 在我们进行单机应用开发涉及并发同步的时候&#xff0c;我们往往采用synchronized或者ReentrantLock的方式来解决多线程间的代码同步问题。但是当我们的应用是在分布式集群工作的情况下&#xff0c;那么就需要一种更加高级的锁机制&#xff0…

【2023年终总结】 | 时光之舟:乘载着回忆与希望穿越2023,抵达2024

文章目录 1 回忆2 希望 1 回忆 2023年对我来说是非常梦幻的一年&#xff0c;我在2023年初的时候确认去做AI方向&#xff0c;在这之前我尝试了前端开发&#xff0c;移动App开发&#xff0c;云FPGA等方向&#xff0c;但是感觉自己都不是很喜欢&#xff0c;然后就开始尝试新的方向…

2023年“中银杯”四川省职业院校技能大赛“云计算应用”赛项样题卷③

2023年“中银杯”四川省职业院校技能大赛“云计算应用”赛项&#xff08;高职组&#xff09; 样题&#xff08;第3套&#xff09; 目录 2023年“中银杯”四川省职业院校技能大赛“云计算应用”赛项&#xff08;高职组&#xff09; 样题&#xff08;第3套&#xff09; 模块…

vmware安装openEuler 22.03 LTS操作系统

vmware安装openEuler 22.03 LTS操作系统 1、下载openEuler操作系统镜像文件2、安装openEuler操作系统3、配置openEuler操作系统3.1、配置静态IP地址 和 dns3.2、查看磁盘分区3.3、查看系统版本 1、下载openEuler操作系统镜像文件 官网下载链接 链接: https://www.openeuler.or…

010、切片

除了引用&#xff0c;Rust还有另外一种不持有所有权的数据类型&#xff1a;切片&#xff08;slice&#xff09;。切片允许我们引用集合中某一段连续的元素序列&#xff0c;而不是整个集合。 考虑这样一个小问题&#xff1a;编写一个搜索函数&#xff0c;它接收字符串作为参数&a…

QT上位机开发(图形绘制)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 图形绘制是上位机软件开发很重要的一个功能。这个图形绘制&#xff0c;有的是离线的&#xff0c;有的是实时绘制的。就我个人而言&#xff0c;离线…

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK获取相机当前数据吞吐量(C#)

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK里函数来获取相机当前数据吞吐量&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机的数据吞吐量的技术背景CameraExplorer如何查看相机吞吐量信息在NEOAPI SDK里通过函数获取相机接口吞吐量 Baumer工业相机通过NEOAPISDK获…

美团到店终端从标准化到数字化的演进之路

总第580篇 | 2023年第032篇 本文整理自美团技术沙龙第76期《大前端研发协同效能提升与实践》。前端团队在产研多角色协同形式上存在不同阶段&#xff0c;而大前端多技术栈在各阶段都有其独特的实践&#xff0c;同时又有类似的演进路线。本文从到店终端团队移动端和前端技术栈持…
最新文章