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 ...
随机推荐
- Python input 使用
Python 3.0 中使用"input" , Python 2.0 中使用"raw_input"Python 3.5: #!C:\Program Files\ ...
- shiro实现session共享
session共享:在多应用系统中,如果使用了负载均衡,用户的请求会被分发到不同的应用中,A应用中的session数据在B应用中是获取不到的,就会带来共享的问题. 假设:用户第一次访问,连接的A服务器 ...
- 【Spring】SpringMVC中浅析Date类型数据的传递
在控制器中加入如下代码: @InitBinder public void initBinder(ServletRequestDataBinder bin){ SimpleDateFormat sdf ...
- [连载]《C#通讯(串口和网络)框架的设计与实现》- 0.前言
目 录 前言 前言 刚参加工作,使用过VB.VC开发软件,随着C#的崛起,听说是C++++,公司决定以后开发软件使用C#,凭借在 ...
- Java面试题整理二(侧重SSH框架)
1.持久化对象的状态都有哪些? 答:瞬时对象(Transient Objects):使用new 操作符初始化的对象不是立刻就持久的.它们的状态是瞬时的,也就是说它们没有任何跟数据库表相关联的行为,只要 ...
- ZeroC Ice启用SSL通讯的配置
Zeroc ICE ( Internet Communications Engine )中间件号称标准统一,开源,跨平台,跨语言,分布式,安全,服务透明,负载均衡,面向对象,性能优越,防火墙穿透,通讯 ...
- Android开发案例 - 注册登录
本文只涉及UI方面的内容, 如果您是希望了解非UI方面的访客, 请跳过此文. 在微博, 微信等App的注册登录过程中有这样的交互场景(如下图): 打开登录界面 在登录界面中, 点击注册, 跳转到注册界 ...
- ALM损坏后的恢复步骤
ALM是HP出品的软件开发生命周期软件,其全称是Application Lifecycle Management,其采用B/S结构,从需求,业务模型到测试用例和缺陷管理亦应具有,满足了一般软件企业对开 ...
- [Erlang 0122] Erlang Resources 2014年1月~6月资讯合集
虽然忙,有些事还是要抽时间做; Erlang Resources 小站 2014年1月~6月资讯合集,方便检索. 小站地址: http://site.douban.com/204209/ ...
- VMware中CPU分配不合理以及License限制引起的SQL Scheduler不能用于查询处理
有一台SQL Server(SQL Server 2014 标准版)服务器中的scheduler_count与cpu_count不一致,如下截图所示: SELECT cpu_count , ...