【进程资源】监视进程资源

做一个web仪表盘 监控quartz任务的资源消耗情况,先把实现做了。

public class SystemInfo
      {
          private int m_ProcessorCount = 0;   //CPU个数
          private PerformanceCounter pcCpuLoad;   //CPU计数器
          private long m_PhysicalMemory = 0;   //物理内存

          private const int GW_HWNDFIRST = 0;
          private const int GW_HWNDNEXT = 2;
          private const int GWL_STYLE = (-16);
          private const int WS_VISIBLE = 268435456;
          private const int WS_BORDER = 8388608;

          #region AIP声明
          [DllImport("IpHlpApi.dll")]
          extern static public uint GetIfTable(byte[] pIfTable, ref uint pdwSize, bool bOrder);

          [DllImport("User32")]
          private extern static int GetWindow(int hWnd, int wCmd);

          [DllImport("User32")]
          private extern static int GetWindowLongA(int hWnd, int wIndx);

          [DllImport("user32.dll")]
          private static extern bool GetWindowText(int hWnd, StringBuilder title, int maxBufSize);

          [DllImport("user32", CharSet = CharSet.Auto)]
          private extern static int GetWindowTextLength(IntPtr hWnd);
          #endregion

          #region 构造函数
          /// <summary>
          /// 构造函数,初始化计数器等
          /// </summary>
          public SystemInfo()
          {
              //初始化CPU计数器
              pcCpuLoad = new PerformanceCounter("Processor", "% Processor Time", "_Total");
              pcCpuLoad.MachineName = ".";
              pcCpuLoad.NextValue();

              //CPU个数
              m_ProcessorCount = Environment.ProcessorCount;

              //获得物理内存
              ManagementClass mc = new ManagementClass("Win32_ComputerSystem");
              ManagementObjectCollection moc = mc.GetInstances();
              foreach (ManagementObject mo in moc)
              {
                  if (mo["TotalPhysicalMemory"] != null)
                  {
                      m_PhysicalMemory = long.Parse(mo["TotalPhysicalMemory"].ToString());
                  }
              }
          }
          #endregion

          #region CPU个数
          /// <summary>
          /// 获取CPU个数
          /// </summary>
          public int ProcessorCount
          {
              get
              {
                  return m_ProcessorCount;
              }
          }
          #endregion

          #region CPU占用率
          /// <summary>
          /// 获取CPU占用率
          /// </summary>
          public float CpuLoad
          {
              get
              {
                  return pcCpuLoad.NextValue();
              }
          }
          #endregion

          #region 可用内存
          /// <summary>
          /// 获取可用内存
          /// </summary>
          public long MemoryAvailable
          {
              get
              {
                  long availablebytes = 0;
                  //ManagementObjectSearcher mos = new ManagementObjectSearcher("SELECT * FROM Win32_PerfRawData_PerfOS_Memory");
                  //foreach (ManagementObject mo in mos.Get())
                  //{
                  //    availablebytes = long.Parse(mo["Availablebytes"].ToString());
                  //}
                  ManagementClass mos = new ManagementClass("Win32_OperatingSystem");
                  foreach (ManagementObject mo in mos.GetInstances())
                  {
                      if (mo["FreePhysicalMemory"] != null)
                      {
                          availablebytes = 1024 * long.Parse(mo["FreePhysicalMemory"].ToString());
                      }
                  }
                  return availablebytes;
              }
          }
          #endregion

          #region 物理内存
          /// <summary>
          /// 获取物理内存
          /// </summary>
          public long PhysicalMemory
          {
              get
              {
                  return m_PhysicalMemory;
              }
          }
          #endregion

          #region 结束指定进程
          /// <summary>
          /// 结束指定进程
          /// </summary>
          /// <param name="pid">进程的 Process ID</param>
          public static void EndProcess(int pid)
          {
              try
              {
                  Process process = Process.GetProcessById(pid);
                  process.Kill();
              }
              catch { }
          }
          #endregion

          #region 查找所有应用程序标题
          /// <summary>
          /// 查找所有应用程序标题
          /// </summary>
          /// <returns>应用程序标题范型</returns>
          public static List<string> FindAllApps(int Handle)
          {
              List<string> Apps = new List<string>();

              int hwCurr;
              hwCurr = GetWindow(Handle, GW_HWNDFIRST);

              while (hwCurr > 0)
              {
                  int IsTask = (WS_VISIBLE | WS_BORDER);
                  int lngStyle = GetWindowLongA(hwCurr, GWL_STYLE);
                  bool TaskWindow = ((lngStyle & IsTask) == IsTask);
                  if (TaskWindow)
                  {
                      int length = GetWindowTextLength(new IntPtr(hwCurr));
                      StringBuilder sb = new StringBuilder(2 * length + 1);
                      GetWindowText(hwCurr, sb, sb.Capacity);
                      string strTitle = sb.ToString();
                      if (!string.IsNullOrEmpty(strTitle))
                      {
                          Apps.Add(strTitle);
                      }
                  }
                  hwCurr = GetWindow(hwCurr, GW_HWNDNEXT);
              }

              return Apps;
          }
          #endregion
      }
     private void button2_Click(object sender, EventArgs e)
        {

             //获取当前进程对象
              Process cur = Process.GetCurrentProcess();

              PerformanceCounter curpcp = new PerformanceCounter("Process", "Working Set - Private", cur.ProcessName);
              PerformanceCounter curpc = new PerformanceCounter("Process", "Working Set", cur.ProcessName);
              PerformanceCounter curtime = new PerformanceCounter("Process", "% Processor Time", cur.ProcessName);

              //上次记录CPU的时间
              TimeSpan prevCpuTime = TimeSpan.Zero;
              //Sleep的时间间隔
              int interval = 1000;

              PerformanceCounter totalcpu = new PerformanceCounter("Processor", "% Processor Time", "_Total");

              SystemInfo sys = new SystemInfo();
              const int KB_DIV = 1024;
              const int MB_DIV = 1024 * 1024;
              const int GB_DIV = 1024 * 1024 * 1024;
              while (true)
              {
                  //第一种方法计算CPU使用率
                  //当前时间
                  TimeSpan curCpuTime = cur.TotalProcessorTime;
                  //计算
                  double value = (curCpuTime - prevCpuTime).TotalMilliseconds / interval / Environment.ProcessorCount * 100;
                  prevCpuTime = curCpuTime;

                  Console.WriteLine("{0}:{1}  {2:N}KB CPU使用率:{3}", cur.ProcessName, "工作集(进程类)", cur.WorkingSet64 / 1024,value);//这个工作集只是在一开始初始化,后期不变
                  Console.WriteLine("{0}:{1}  {2:N}KB CPU使用率:{3}", cur.ProcessName, "工作集        ", curpc.NextValue() / 1024,value);//这个工作集是动态更新的
                  //第二种计算CPU使用率的方法
                  Console.WriteLine("{0}:{1}  {2:N}KB CPU使用率:{3}%", cur.ProcessName, "私有工作集    ", curpcp.NextValue() / 1024,curtime.NextValue()/Environment.ProcessorCount);
                  //Thread.Sleep(interval);

                  //第一种方法获取系统CPU使用情况
                  Console.Write("\r系统CPU使用率:{0}%", totalcpu.NextValue());
                  //Thread.Sleep(interval);

                  //第二章方法获取系统CPU和内存使用情况
                  Console.Write("\r系统CPU使用率:{0}%,系统内存使用大小:{1}MB({2}GB)", sys.CpuLoad, (sys.PhysicalMemory - sys.MemoryAvailable) / MB_DIV, (sys.PhysicalMemory - sys.MemoryAvailable) / (double)GB_DIV);
                  Thread.Sleep(interval);
              }

              Console.ReadLine();

        }
时间: 2024-10-12 03:23:10

【进程资源】监视进程资源的相关文章

Linux进程管理(二)进程的调度与资源限制

1 进程调度就绪进程最重要的特征是该进程是非阻塞的.进行用户交互.大量读写文件.响应I/O和网络事件的进程会花费大量时间来等待资源可用,在相当长的时间内无法转为就绪状态(长是相对于指令运行时间而言),因此就绪进程首先应该是非阻塞的.一个就绪进程还必须至少有部分"时间片"(调度器分配给进程的运行时间).内核用一个就绪队列维护所有的就绪进程,一旦某进程耗光它的时间片,内核就将其移出队列,直到所有就绪进程都耗光时间片才考虑将其放回队列.多任务操作系统分为两大类:协同式和抢占式.Linux实现

Windows Server 群集节点和资源监视

群集节点监视 如果将群集资源类比为鸡蛋,那么群集节点类似于装有鸡蛋的篮子,篮子本身的完整决定着里面所装的鸡蛋的安全性.群集节点首先要决定自己是否存活,所以群集节点之间定期使用心跳来判断所有群集节点是否处于健康状态.群集的可用性目标因提供的服务的要求而异,不同服务等级要求的应用对故障恢复时间要求也不同,对健康检测严格要求也不同.同理,可用性要求越高的服务,对检测节点故障和采取后续行动进行恢复的速度越快,可用性要求不高的服务,对于故障恢复时间的容忍也相对要长.鉴于此,Windows Server群集

iOS并发编程笔记,包含GCD,Operation Queues,Run Loops,如何在后台绘制UI,后台I/O处理,最佳安全实践避免互斥锁死锁优先级反转等,以及如何使用GCD监视进程文件文件夹,并发测试的方案等

iOS并发编程笔记,包含GCD,Operation Queues,Run Loops,如何在后台绘制UI,后台I/O处理,最佳安全实践避免互斥锁死锁优先级反转等,以及如何使用GCD监视进程文件文件夹,并发测试的方案等 线程 使用Instruments的CPU strategy view查看代码如何在多核CPU中执行.创建线程可以使用POSIX 线程API,或者NSThread(封装POSIX 线程API).下面是并发4个线程在一百万个数字中找最小值和最大值的pthread例子: #import

Delphi监视进程并结束进程

监视进程并结束进程在很多地方都用到这里借前人的经验写了个小例子: 以QQ的进程qq.exe为例 关键代码如下: function CheckTask(ExeFileName: string): Boolean; const PROCESS_TERMINATE=$0001; var ContinueLoop: BOOL; FSnapshotHandle: THandle; FProcessEntry32: TProcessEntry32; begin result := False; FSnaps

Tomcat进程运行监视并自动重启的脚本

#!/bin/bash   #author:yuxiaoguang #date:2016/5/22 echo "Start"   URL="http://127.0.0.1:8090"   curlit()   {       #echo "??"   curl --connect-timeout 15 --max-time 20 --head --silent "$URL" | grep '200'   # 上面的15是连接

Linux下2号进程的kthreadd--Linux进程的管理与调度

copy from:https://blog.csdn.net/gatieme/article/details/51566690 Linux下有3个特殊的进程,idle进程(PID = 0), init进程(PID = 1)和kthreadd(PID = 2) * idle进程由系统自动创建, 运行在内核态 idle进程其pid=0,其前身是系统创建的第一个进程,也是唯一一个没有通过fork或者kernel_thread产生的进程.完成加载系统后,演变为进程调度.交换 * init进程由idle

Linux中的僵尸进程和孤儿进程

在UNIX里,除了进程0(即PID=0的交换进程,Swapper Process)以外的所有进程都是由其他进程使用系统调用fork创建的,这里调用fork创建新进程的进程即为父进程,而相对应的为其创建出的进程则为子进程,因而除了进程0以外的进程都只有一个父进程,但一个进程可以有多个子进程.        操作系统内核以进程标识符(Process Identifier,即PID)来识别进程.进程0是系统引导时创建的一个特殊进程,在其调用fork创建出一个子进程(即PID=1的进程1,又称init)

孤儿进程和僵尸进程

孤儿进程和僵尸进程 一.定义:什么是孤儿进程和僵尸进程 僵尸进程:一个子进程在其父进程还没有调用wait()或waitpid()的情况下退出.这个子进程就是僵尸进程. 孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程.孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作. 僵尸进程将会导致资源浪费,而孤儿则不会. 子进程持续10秒钟的僵尸状态(EXIT_ZOMBIE)------------------------------

孤儿进程与僵尸进程[总结]

http://www.cnblogs.com/Anker/p/3271773.htm 1.前言 之前在看<unix环境高级编程>第八章进程时候,提到孤儿进程和僵尸进程,一直对这两个概念比较模糊.今天被人问到什么是孤儿进程和僵尸进程,会带来什么问题,怎么解决,我只停留在概念上面,没有深入,倍感惭愧.晚上回来google了一下,再次参考APUE,认真总结一下,加深理解. 2.基本概念 我们知道在unix/linux中,正常情况下,子进程是通过父进程创建的,子进程在创建新的进程.子进程的结束和父进程

【APUE】孤儿进程与僵死进程

基本概念: 在unix/linux中,正常情况下,子进程是通过父进程创建的,子进程在创建新的进程.子进程的结束和父进程的运行是一个异步过程,即父进程永远无法预测子进程 到底什么时候结束. 当一个 进程完成它的工作终止之后,它的父进程需要调用wait()或者waitpid()系统调用取得子进程的终止状态. 孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程.孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作. 僵尸进程:一个进程