通过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插件,可以再下面的链接中下载 ...
随机推荐
- linux部署不同版本mysql
测试环境部署过程中经常会遇到同一个服务器上部署两个不同版本的mysql数据库,在部署过程中也会有各种各样的问题,现将部署多版本mysql的方法总结如下: 1.下载mysql版本 http://down ...
- keepalived+nginx配置文件及检查nginx服务的脚本
脚本一启动的速度要快一些哦,因为脚本二要判断两次以后才启动哎 这两个一般配合keepalived使用 脚本一: #!/bin/bash #author:fansik #description:chec ...
- Android Saving Data(一)
Saving Key-value Sets 保存键值对 SharedPreferences只能用来保存一些简单的数据,并且这些数据可以是共享的,也可以是私有的. SharedPreferences没 ...
- VS2008编译bat
工程文件为AirCode,批处理文件为bulit.bat(与*.sln文件在同级目录). 以下是批处理的代码: echo %~dp0 rem set build_config="Debug| ...
- linux显示器常见设置
1. 设置系统默认的分辨率 xrandr 命令: > xrandr Screen 0: minimum 1 x 1, current 1920 x 1080, maximum 8192 x 8 ...
- JSONP和CORS两种跨域方式的简单介绍和解决方案实例
随着软件开发分工趋于精细,前后端开发分离成为趋势,前端同事负责前端页面的展示及页面逻辑处理,服务端同事负责业务逻辑处理同时通过API为前端提供数据也为前端提供数据的持久化能力,考虑到前后端同事开发工具 ...
- SpringMVC 拦截器不拦截静态资源的三种处理方式
SpringMVC提供<mvc:resources>来设置静态资源,但是增加该设置如果采用通配符的方式增加拦截器的话仍然会被拦截器拦截,可采用如下方案进行解决: 方案一.拦截器中增加针对静 ...
- qt的moc,uic,rcc命令的使用
qt是一个c++的界面库,其特点就是其源码可以跨平台编译,这样在写自己的小工具时可以方便地在windows,mac或linux环境下移植了.在windows下写c++程序当然选vs,在mac下写程序当 ...
- java内存的那些事
在Java中,内存的管理分为以下几个部分: Heap:堆区域,存放对象实例,凡是New出来的东西都存放在此. Stack:栈区域,存放基本数据类型.常量.局部变量.对象的引用地址 Data Segme ...
- ajax-向服务器发送请求
ajax-向服务器发送请求 1.将请求发送到服务器,使用XMLHttpRequest对象的 open() 和 send() 方法. xmlhttp. open(method,url,async ...