一、背景

  前段时间服务器出了点问题,加上学业愈来愈紧张,写博文分享的时间越来越少。虽然不是第一次在博客园上写经验,但是近期分享的博文得到了不少的朋友支持和指正,在这里内心非常感激和开心。希望以后能认真用好时间,把一些有用的经验分享给需要的人,当然本科阶段的我还有许多不懂的,如果在文章中有错误,希望大家多多指正,必虚心受教。

  今天要分享的是使用c#获取服务器CPU、RAM、TCP、磁盘使用情况。前段时间,做了一个几十人的并发测试,服务器宕机了,后来上控制管理台检查测试时间段里服务器各项数据,可惜没有这块数据的提供。为此,我想在web程序中,加入一个小监控的功能,以方便自己随时调用和查看我想要的信息。为了实现这个功能,首先得获取服务器上得一些数据:CPU、RAM、TCP、磁盘使用数据。

 

二、解决思路或过程

首先获取CPU的使用情况:

  1. 在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;
        }
    }

再是获取当前服务器内存使用数据:

  1. 这里需要用到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等系统信息(上)的更多相关文章

  1. ASP.NET MVC4简单使用ELMAH记录系统日志

    ASP.NET MVC4简单使用ELMAH记录系统日志 前言 在项目开发.测试以及已经上线的项目中都会存在bug,而如果我们在项目的各个阶段都能及时的监控系统出现的任何问题,那么对于我们开发人员来说完 ...

  2. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(32)-swfupload多文件上传[附源码]

    原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(32)-swfupload多文件上传[附源码] 文件上传这东西说到底有时候很痛,原来的asp.net服务器 ...

  3. js进阶ajax基本用法(创建对象,连接服务器,发送请求,获取服务器传过来的数据)

    js进阶ajax基本用法(创建对象,连接服务器,发送请求,获取服务器传过来的数据) 一.总结 1.ajax的浏览器的window对象的XMLHtmlRequest对象的两个重要方法:open(),se ...

  4. asp.net mvc4 简单使用Autofac依赖注入小结

    1,首先使用 NuGet下载适当的Autofac版本 文件一,Autofac.3.5.2 文件二,Autofac.Mvc4.3.1.0 1,接口类 public interface IReposito ...

  5. ASP.NET MVC4应用程序无法建立控制器的解决方案/获取自己需要的EF版本

    具体错误是我建立控制器的时候出现如下图那样的错误: Unable to cast object of type 'System.Data.Entity.Core.Objects.ObjectConte ...

  6. .NET平台下,钉钉微应用开发之:获取userid

    工作需求,开发钉钉微应用和小程序,之前有接触过支付宝小程序和生活号的开发,流程没有很大的差别,这里记录下我用ASP.NET MVC实现钉钉微应用的开发,并实现获取用户的userid.小弟我技术有限,本 ...

  7. Java Web开发之Servlet获取ckeditor内容

    js: <!-- ckeditor插件 --> <script type="text/javascript" src="js/ckeditor/cked ...

  8. iOS开发之#iPhone6与iPhone6Plus适配#Xcode6.0/Xcode6.1上传应用过程中一些变动以及#解决方案#

    更新时间2014年11月13日  本博文创建时,只有Xcode6.0, Xcode6.0尝试多次,确实如此 之后在6.1版本经博主少量尝试,确实也有如下问题,现更新下博客! iOS8发布之后,苹果强制 ...

  9. Android开发之ActivityManager获取系统信息

    1.判断指定的service是否在运行 public static boolean isServiceRunning(Context ctx, String serviceName) { Activi ...

随机推荐

  1. Windows下删除.svn文件夹的最简易方法

    建立一个文本文件,取名为kill-svn-folders.reg(扩展名由txt改为reg),内容如下: Windows Registry Editor Version 5.00 [HKEY_LOCA ...

  2. Amazon Interview | Set 27

    Amazon Interview | Set 27 Hi, I was recently interviewed for SDE1 position for Amazon and got select ...

  3. java中如何实现多态

    复习基础知识 多态,就是重载和重写.重载发生在一个类中.重写发生在子类,意思就是子类重写父类相同名称的方法.刚学语言有的东西,不必搞得那么清楚,只有知道怎么用就行了,有的问题你要想真正把它搞得很懂,短 ...

  4. animation-timing-function: steps() 详解

    在应用 CSS3 渐变/动画时,有个控制时间的属性 <animation-timing-function> .它的取值中除了常用到的 贝萨尔曲线以外,还有个让人比较困惑的 steps()  ...

  5. Scala 变长参数

    如果Scala定义变长参数 def sum(i Int*), 那么调用sum时,可以直接输入sum(1,2,3,4,5) 但是不可以sum(1 to 5) 必须要将1 to 5 强制为seq sum( ...

  6. Ionic设置ion-slide-box不启用(不通过$ionicSlideBoxDelegate)

    猛地一看这个标题,可能觉得多此一举,直接$ionicSlideBoxDelegate. $getByHandle(handle). enableSlide(false)设置不就行了?是的,按理说就是这 ...

  7. xUtils 3.0 post使用详解

    github:https://github.com/wyouflf/xUtils3 xUtils3简介 xUtils 包含了很多实用的android工具. xUtils 支持超大文件(超过2G)上传, ...

  8. iOS --SQL的增加、删除、查找、修改

    iOS对于数据库的操作:增加.删除.查找.修改 首先需要创建一个数据库:本程序的数据库是在火狐浏览器里的插件里写的微量型数据库 火狐找查找SQLite Manager的步骤: 第一步:在工具栏找到附加 ...

  9. 分享一下Java写的坦克大战游戏,相信很多人小时候玩过

    写在前面 程序是五六年前读书的时候写的,里面会有一些不规范的,我已经将代码传到github上了,有时间会优化修改. 程序运行机制 定义了一个JPanel,然后每隔一小段时间重绘一遍. 重绘的内容如下: ...

  10. JAVA编程思想(第四版)学习笔记----11.5 List,11.6迭代器

    Collection类的层次结构图(来源与网络)如下所示: 接口:Iterator<T> public interface Iterable<T> Iterable<T& ...