通过WMI接口监控服务器性能
WMI 是微软操作系统的一个内置的组件,通过使用WMI我们可以获取服务器硬件信息、收集服务器性能数据、操作Windows服务,甚至可以远程关机或是重启服务器。
一、在C#编程中使用WMI
要想在C#程序中使用WMI,必须添加System.Management.dll的引用,并使用System.Management命名空间。该命名空间提供对一组符合WMI基础结构的系统、设备和应用程序的管理信息和管理事件的访问。这里介绍一下常用的几个类:
ManagementScope用以连接WMI命名空间。
ManagementBaseObject包含管理对象的基本元素。
ManagementObject表示WMI实例。
ManagementObjectCollection表示通过WMI检索到的管理对象的集合。
ManagementObjectSearcher表示基于指定的查询检索管理对象的集合。该类也是用于检索管理信息的较为常用的入口点之一。
本人在写代码时将自己常用的一些关于WMI的基本操作进行了简单的包装。
1.ManagementScope
public ManagementScope GetManagementScope()
{
if (_managementScope == null)
{
if (Environment.MachineName.ToLower() == ServerName.ToLower())
{
_managementScope = new ManagementScope("\\\\" + ServerIP + "\\root\\cimv2");
}
else if (UserName != null && UserName.Length > )
{
ConnectionOptions connectionOptions = new ConnectionOptions();
connectionOptions.Username = UserName;
connectionOptions.Password = Password;
_managementScope = new ManagementScope("\\\\" + ServerIP + "\\root\\cimv2", connectionOptions);
}
else
{
throw new ManagementException();
}
}
return _managementScope;
}
2.ManagementObjectSearcher
private ManagementObjectSearcher GetManagementObjectSearcher(string wql)
{
return new ManagementObjectSearcher(GetManagementScope(), new SelectQuery(wql));
}
3.得到ManagementBaseObject集合
public List<ManagementBaseObject> GetManagementObjects(string wql)
{
List<ManagementBaseObject> managementObjects = new List<ManagementBaseObject>();
ManagementObjectCollection collection = GetManagementObjectCollection(wql);
foreach (ManagementObject managementObject in collection)
{
managementObjects.Add(managementObject);
}
return managementObjects;
}
4.获取系统信息
public object GetSystemInfo(ManagementBaseObject managementObject, string type)
{
return managementObject[type];
}
public object GetSystemInfo(string wql, string type)
{
return GetSystemInfo(GetManagementObjects(wql)[], type);
}
有了这些基本操作作为基础,我们就来看一下如何方便的获取CPU、内存、硬盘等基本信息。
二、CPU
1.CPU型号
public string Model()
{
return GetSystemInfo("SELECT * FROM Win32_Processor", "Name").ToString().Trim();
}
2.获取CPU个数
public int Number()
{
return GetManagementObjects("SELECT * FROM Win32_Processor").Count;
}
3.CPU使用率
public int AverageLoadPercentage()
{
int loadPercentage = ;
List<ManagementBaseObject> collection = GetManagementObjects("SELECT * FROM Win32_Processor");
foreach (ManagementObject managementObject in collection)
{
object load = GetSystemInfo(managementObject, "LoadPercentage");
if (load == null)
{
load = ;
}
loadPercentage += Int32.Parse(load.ToString());
}
return loadPercentage / collection.Count;
}
三、内存
1.总内存数
public string TotalSize()
{
float size = ;
List<ManagementBaseObject> collection = GetManagementObjects("SELECT * FROM Win32_OperatingSystem");
foreach (ManagementObject managementObject in collection)
{
size += long.Parse(GetSystemInfo(managementObject, "TotalVisibleMemorySize").ToString());
}
return (size / ).ToString("0.00") + "MB";
}
2.剩余内存数
public string FreeSize()
{
float size = ;
List<ManagementBaseObject> collection = GetManagementObjects("SELECT * FROM Win32_OperatingSystem");
foreach (ManagementObject managementObject in collection)
{
size += float.Parse(GetSystemInfo(managementObject, "FreePhysicalMemory").ToString());
}
return (size / ).ToString("0.00") + "MB";
}
四、硬盘
1.定义逻辑硬盘结构
public struct LogicalDisk
{
private string _deviceID;
private long _size;
private long _freeSize; public string Size
{
get
{
return ((float) _size / / / ).ToString("0.00") + "GB";
}
} public string FreeSize
{
get
{
return ((float) _freeSize / / / ).ToString("0.00") + "GB";
}
} public LogicalDisk(string deviceID, long size, long freeSize)
{
_deviceID = deviceID;
_size = size;
_freeSize = freeSize;
}
}
2.获取逻辑硬盘信息
private void GetLogicalDisk()
{
List<ManagementBaseObject> collection = GetManagementObjects("SELECT * FROM Win32_LogicalDisk WHERE DriveType = " + (int)System.IO.DriveType.Fixed); foreach (ManagementObject managementObject in collection)
{
long size, freeSize;
object managementObjectInfo;
managementObjectInfo = GetSystemInfo(managementObject, "Size");
if (managementObjectInfo == null)
{
continue;
}
else
{
size = long.Parse(GetSystemInfo(managementObject, "Size").ToString());
}
managementObjectInfo = GetSystemInfo(managementObject, "FreeSpace");
if (managementObjectInfo == null)
{
freeSize = ;
}
else
{
freeSize = long.Parse(GetSystemInfo(managementObject, "FreeSpace").ToString());
}
string deviceID = GetSystemInfo(managementObject, "deviceid").ToString();
_logicalDisks.Add(new LogicalDisk(deviceID, size, freeSize));
}
}
五、Windows服务
1.两个辅助方法
private ManagementObject GetServiceObject()
{
return GetManagementObjects("SELECT * FROM Win32_Service WHERE Name = '" + Name + "'")[] as ManagementObject;
} private object GetManagementObjectInfo(string type)
{
return GetSystemInfo(GetServiceObject(), type);
}
2.服务运行状况
public string Status()
{
return GetManagementObjectInfo("State") as string;
}
3.启动服务
public bool Start()
{
try
{
if (Status() == "Stopped")
{
GetServiceObject().InvokeMethod("StartService", null);
while (Status() == "Start Pending") ;
return true;
}
return false;
}
catch (Exception e)
{
throw new Exception(Name + "服务启动失败", e);
}
}
4.停止服务
public bool AcceptStop()
{
return (bool)GetManagementObjectInfo("AcceptStop");
} public bool Stop()
{
try
{
if (AcceptStop())
{
GetServiceObject().InvokeMethod("StopService", null);
while (Status() == "Stop Pending") ;
return true;
}
return false;
}
catch (Exception e)
{
throw new Exception(Name + "服务停止失败", e);
}
}
通过WMI接口监控服务器性能的更多相关文章
- Spring AOP在函数接口调用性能分析及其日志处理方面的应用
面向切面编程可以实现在不修改原来代码的情况下,增加我们所需的业务处理逻辑,比如:添加日志.本文AOP实例是基于Aspect Around注解实现的,我们需要在调用API函数的时候,统计函数调用的具体信 ...
- 性能测试培训:Ajax接口级性能测试之jmeter版
性能测试培训:Ajax接口级性能测试之jmeter版 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.在poptest认为工具 ...
- 4月27号开学! 第6期《jmeter实战接口自动化+性能》课程,零基础也能学
2019年 第6期<jmeter实战接口自动化+性能>课程,4月27号开学! 主讲老师:飞天小子 上课方式:QQ群视频在线教学 本期上课时间:4月27号-6月9号,每周六.周日晚上20:0 ...
- Jmeter————监控服务器性能
1. 下载jmeter插件 上面2个是jmeter插件,第3个要放在监控的服务器中. 2. 解压压缩包 找到解压包中的JAR文件,并拷贝到jmeter的lib/ext目录下,这里下载的1.4版本的插件 ...
- Linux常用监控服务器性能命令
列举比较常用的几种监控服务器性能的Linux命令.其实,在我看来,目前针对Linux系统内存.硬盘.TCP/IP等等相关的指标,Linux本身自带的或者是一些开源项目等基本上都能达到这个获取服务器性能 ...
- 性能测试篇 :Jmeter监控服务器性能
转载:http://www.cnblogs.com/chengtch/p/6079262.html jmeter也可以像loadrunner一样监控服务器CPU.内存等性能参数,不过需要安装一些插件 ...
- Windows Server2008 监控服务器性能
下面学习Windows Server2008监控服务器性能包括 日志管理,归档日志,日志排错,怎么配置计算机以转发和收集事件,使用任务管理监控内存和CPU的使用,查看程序内存使用,查看程序CPU使用, ...
- Jmeter(四十八) - 从入门到精通高级篇 - Jmeter监控服务器性能(详解教程)
1.简介 JMeter是一款压力.接口等等的测试工具,Jmeter也可以像loadrunner一样监控服务器CPU.内存等性能参数,用来监控服务器资源使用情况,不过需要安装一些插件.JMeter正常自 ...
- Jmeter如何监控服务器性能
1.jmeter只需要安装一些插件 ,就可以像loadrunner一样监控服务器CPU.内存等性能参数 1.下载需要的jmeter插件 如图上面两个是jmeter插件,可以再下面的链接中下载 ...
随机推荐
- window.onload用法详解:
网页中的javaScript脚本代码往往需要在文档加载完成后才能够去执行,否则可能导致无法获取对象的情况,为了避免这种情况的发生,可以使用以下两种方式: 一.将脚本代码放在网页的底端,这样在运行脚本代 ...
- HDU-3247 Resource Archiver(AC自动机+BFS)
Description Great! Your new software is almost finished! The only thing left to do is archiving all ...
- jQuery中方法html()与text()的不同
区别一:html()方法设置或者返回被选元素的内容,其效果类似于操作元素对象的“innerHTML”属性:text()方法设置或者返回被选元素的文本内容,其效果等同于操作元素对象的“textConte ...
- squid源码安装下的conf文件默认值和提示
# WELCOME TO SQUID 3.0.STABLE26# ----------------------------## This is the default Squid c ...
- quick sort 的简化实现
Pivot 随机选取意义不大 第一种方法使用随机pivot,使得尽可能平均二分序列,而实际上一般来说需要排序的集合往往是乱序的,无需重新生成随机数作为pivot,大可使用固定位置的数作为pivot,这 ...
- 论文笔记--Fast RCNN
很久之前试着写一篇深度学习的基础知识,无奈下笔之后发现这个话题确实太大,今天发一篇最近看的论文Fast RCNN.这篇文章是微软研究院的Ross Girshick大神的一篇作品,主要是对RCNN的一些 ...
- 【阿迪达斯 ZX850 系列】
[阿迪达斯zx850系列 灰蓝桔 36-44] [阿迪达斯 ZX850 新配色B34720 情侣鞋 36-44] [阿迪达斯 ZX850 新配色B34720 情侣鞋 36-44] [阿迪达斯 ZX85 ...
- SSL安全证书-概念解析
一.关于证书 数字证书是一种认证机制.简单点说,它代表了一种由权威机构颁发授权的安全标志. 由来 在以前,传统网站采用HTTP协议进行数据传输,所有的数据几乎都用的明文,很容易发生隐私泄露.为了解决安 ...
- Eclipse中将Java项目转换成Web项目的方法
前言: 用Eclipse开发项目的时候,把一个Web项目导入到Eclipse里会变成了一个java工程,将无法在Tomcat中进行部署运行. 方法: 1.找到.project文件,找到里面的<n ...
- time 模块
import time导入时间模块print(time.strftime("%Y-%m-%d %X"))其中 time.strftime("Y-%m-%d")输 ...