asp.net mvc4 简单的服务器监控开发之C#获取服务器CPU、RAM、TCP等系统信息(上)
一、背景
前段时间服务器出了点问题,加上学业愈来愈紧张,写博文分享的时间越来越少。虽然不是第一次在博客园上写经验,但是近期分享的博文得到了不少的朋友支持和指正,在这里内心非常感激和开心。希望以后能认真用好时间,把一些有用的经验分享给需要的人,当然本科阶段的我还有许多不懂的,如果在文章中有错误,希望大家多多指正,必虚心受教。
今天要分享的是使用c#获取服务器CPU、RAM、TCP、磁盘使用情况。前段时间,做了一个几十人的并发测试,服务器宕机了,后来上控制管理台检查测试时间段里服务器各项数据,可惜没有这块数据的提供。为此,我想在web程序中,加入一个小监控的功能,以方便自己随时调用和查看我想要的信息。为了实现这个功能,首先得获取服务器上得一些数据:CPU、RAM、TCP、磁盘使用数据。
二、解决思路或过程
首先获取CPU的使用情况:
- 在mvc目录下创建类SystemMonitor.cs,引入命名空间:using System.Runtime.InteropServices;//提供各种各样支持 COM 互操作 及平台调用服务的成员。using System.Diagnostics;//System.Diagnostics 命名空间中,该命名空间提供了用于与事件日志、性能计数器和系统进程进行交互的类。您可以在生产应用程序中保持对此监控代码的启用,并在发生问题时查看相关信息。
添加如下代码:
/// <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();
dynamic Value_2 = pc.NextValue();
return Value_2;
}
}
再是获取当前服务器内存使用数据:
- 这里需要用到struct和DllImport[""],这里用到的kernel32.dll是Windows9x/Me中非常重要的32位动态链接库文件,属于内核级文件。它控制着系统的内存管理、数据的输入输出操作和中断处理,当Windows启动时,kernel32.dll就驻留在内存中特定的写保护区域,使别的程序无法占用这个内存区域。
代码如下:
/// <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 / ( * * );
}
}
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 / ( * * );
}
}
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 / ( * * );
}
}
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)
{
;
; i < iteration; i++)
iter *= ;
, MidpointRounding.AwayFromZero);
}
}
三、总结与看法
上述代码或许有一些许不全的地方,因为这是我从项目里剥离出来的,所以缺少的一些代码得补上,如果有疑问请留言吧。如果我思路和方法有误,恳请各位指正,虚心求教。转载请注明来源与出处,谢谢合作 By 点将台无将
asp.net mvc4 简单的服务器监控开发之C#获取服务器CPU、RAM、TCP等系统信息(上)的更多相关文章
- ASP.NET MVC4简单使用ELMAH记录系统日志
ASP.NET MVC4简单使用ELMAH记录系统日志 前言 在项目开发.测试以及已经上线的项目中都会存在bug,而如果我们在项目的各个阶段都能及时的监控系统出现的任何问题,那么对于我们开发人员来说完 ...
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(32)-swfupload多文件上传[附源码]
原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(32)-swfupload多文件上传[附源码] 文件上传这东西说到底有时候很痛,原来的asp.net服务器 ...
- js进阶ajax基本用法(创建对象,连接服务器,发送请求,获取服务器传过来的数据)
js进阶ajax基本用法(创建对象,连接服务器,发送请求,获取服务器传过来的数据) 一.总结 1.ajax的浏览器的window对象的XMLHtmlRequest对象的两个重要方法:open(),se ...
- asp.net mvc4 简单使用Autofac依赖注入小结
1,首先使用 NuGet下载适当的Autofac版本 文件一,Autofac.3.5.2 文件二,Autofac.Mvc4.3.1.0 1,接口类 public interface IReposito ...
- ASP.NET MVC4应用程序无法建立控制器的解决方案/获取自己需要的EF版本
具体错误是我建立控制器的时候出现如下图那样的错误: Unable to cast object of type 'System.Data.Entity.Core.Objects.ObjectConte ...
- .NET平台下,钉钉微应用开发之:获取userid
工作需求,开发钉钉微应用和小程序,之前有接触过支付宝小程序和生活号的开发,流程没有很大的差别,这里记录下我用ASP.NET MVC实现钉钉微应用的开发,并实现获取用户的userid.小弟我技术有限,本 ...
- Java Web开发之Servlet获取ckeditor内容
js: <!-- ckeditor插件 --> <script type="text/javascript" src="js/ckeditor/cked ...
- iOS开发之#iPhone6与iPhone6Plus适配#Xcode6.0/Xcode6.1上传应用过程中一些变动以及#解决方案#
更新时间2014年11月13日 本博文创建时,只有Xcode6.0, Xcode6.0尝试多次,确实如此 之后在6.1版本经博主少量尝试,确实也有如下问题,现更新下博客! iOS8发布之后,苹果强制 ...
- Android开发之ActivityManager获取系统信息
1.判断指定的service是否在运行 public static boolean isServiceRunning(Context ctx, String serviceName) { Activi ...
随机推荐
- java socket编程(li)
一.网络编程中两个主要的问题 一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输.在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可以 ...
- java代码解压zip文件
import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.Inp ...
- Mac下启动和停止Mysql服务
方法1. 启动Mysql服务 sudo /Library/StartupItems/MySQLCOM/MySQLCOM start 停止Mysql服务 sudo /Library/Star ...
- mysql can't create threads in threadpool
最近,我们在券商端的mysql运行一段时间后,发生mysql can't create threads in threadpool,如下所示: 据官网一个报告显示,目测是一个bug,内存紧张导致,那天 ...
- java静态修饰符static的使用
class Person { private String name; private int age; /* * 假设每个Person对象的国籍都一样, * 那么每次调用都要赋值就会不合理. * 使 ...
- iOS 报错汇总
1. Unknown type name 'class'; did you mean 'Class' 问题解决方法 objectice-c 工程中的类(比如 类 A)使用 C++ 文件时 A.m 文 ...
- Splash页面跳转主页面,去掉主页面标题栏
requestWindowFeature(Window.FEATURE_NO_TITLE); // 去除标题,必须在setContentView之前调用
- Xcode8+和iOS10+使用Masonry自动计算行高
说起tableView的自动计算行高,真的是不想再提了,写了不知道几百遍了.可就是这麽一个小玩意儿,把我给难的不行不行的,眼看都要没头发了. 1.设置tableView的预估行高和行高为自动计算 // ...
- MAC OS X El CAPITAN 搭建SPRING MVC (1)- 目录、包名、创建web.xml
一. 下载STS(Spring Tool Suite) 官方地址:http://spring.io/tools/sts 下载spring tool suite for mac 最新版本.这个IDE是很 ...
- Android开发案例 - 欢迎界面
本文详细描述了如何实现如下图中的微信启动界面. 该类启动界面的特点是在整个Application的生命周期里, 它只会出现在第一次进入应用时, 即便按回退键到桌面之后. 使用该类启动界面的应用还有: ...