using Aitex.Core.RT.Device.Unit; using Aitex.Core.RT.Log; using Aitex.Core.RT.SCCore; using MECF.Framework.Common.Equipment; using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.ServiceModel.Channels; using System.Text; using System.Timers; using System.Windows; namespace Venus_RT.Modules { public class ResourceMonitor { private string processname = Process.GetCurrentProcess().ProcessName; private int _stringlen = 20; private int threshold = 800; //数据波动监测可用 //List _Numberofhandlesopened = new List() { }; //List _Numberofmodules = new List() { }; //List _Basicpriority = new List() { }; //List _processor = new List() { }; //List _Minimumworkingset = new List() { }; //List _MaximumWorkingSet = new List() { }; //List _Workset = new List() { }; //List _Peakworkingset = new List() { }; //List _Dedicatedmemorysize = new List() { }; //List _UnpagedMemorySize = new List() { }; //List _PagingMemorySize = new List() { }; //List _Peakpagingmemorysize = new List() { }; //List _VirtualMemorySize = new List() { }; //List _PeakVirtualMemorySize = new List() { }; //string ProcessName = string.Empty; //string ProcessID = string.Empty; //string Starttime = string.Empty; string Response = string.Empty; string MainWindowHandle = string.Empty; //string MainWindowTitle = string.Empty; string AssociatedProcessHandle = string.Empty; string Numberofhandlesopened = string.Empty; string Numberofmodules = string.Empty; string Basicpriority = string.Empty; string Increasepriority = string.Empty; string processor = string.Empty; string Minimumworkingset = string.Empty; string MaximumWorkingSet = string.Empty; string Workset = string.Empty; string Peakworkingset = string.Empty; string Dedicatedmemorysize = string.Empty; string UnpagedMemorySize = string.Empty; string PagingMemorySize = string.Empty; string Peakpagingmemorysize = string.Empty; string VirtualMemorySize = string.Empty; string PeakVirtualMemorySize = string.Empty; string Occupytime = string.Empty; string PrivilegeOccupancytime = string.Empty; string Useroccupiedtime = string.Empty; public ResourceMonitor() { //ProcessName = "进程名称"; //ProcessID = "进程ID".PadRight(_stringlen - 2, ' '); //Starttime = "启动时间"; Response = "是否响应"; MainWindowHandle = "主窗口句柄"; //MainWindowTitle = "主窗口标题"; AssociatedProcessHandle = "关联进程句柄"; Numberofhandlesopened = "进程打开的句柄数"; Numberofmodules = "模块数量"; Basicpriority = "基本优先级"; Increasepriority = "提升优先级"; processor = "处理器"; Minimumworkingset = "最小工作集"; MaximumWorkingSet = "最大工作集"; Workset = "工作集"; Peakworkingset = "峰值工作集"; Dedicatedmemorysize = "专用内存大小"; UnpagedMemorySize = "未分页内存大小"; PagingMemorySize = "分页内存大小"; Peakpagingmemorysize = "峰值分页内存大小"; VirtualMemorySize = "虚拟内存大小"; PeakVirtualMemorySize = "峰值虚拟内存大小"; Occupytime = "占用时间"; PrivilegeOccupancytime = "特权占用时间"; Useroccupiedtime = "用户占用时间"; } public bool Initialize() { //>0 开启否则不开启 if (SC.GetValue("System.CheckResourceInterval") > 0) { Timer _timer = new Timer(); _timer.Enabled = true; _timer.Interval = SC.GetValue("System.CheckResourceInterval") * 60 * 1000; _timer.Elapsed += GetProcessInfo; _timer.Start(); //LOG.Write($"{ProcessName}" + //$"{ProcessID}" + ////$"{Starttime}"+ //$"{Response}" + //$"{MainWindowHandle}" + ////$"{MainWindowTitle}"+ //$"{AssociatedProcessHandle}" + //$"{Numberofhandlesopened}" + //$"{Numberofmodules}" + //$"{Basicpriority}" + //$"{Increasepriority}" + //$"{processor}" + //$"{Minimumworkingset}" + //$"{MaximumWorkingSet}" + //$"{Workset}" + //$"{Peakworkingset}" + //$"{Dedicatedmemorysize}" + //$"{UnpagedMemorySize}" + //$"{PagingMemorySize}" + //$"{Peakpagingmemorysize}" + //$"{VirtualMemorySize}" + //$"{PeakVirtualMemorySize}" + //$"{Occupytime}" + //$"{PrivilegeOccupancytime}" + //$"{Useroccupiedtime}"); } return true; } private void GetProcessInfo(object sender, ElapsedEventArgs e) { try { //判断是否存在该进程 //有就开始记录 if (Process.GetProcessesByName(processname).Length > 0) { Process pro = Process.GetProcessesByName(processname)[0]; //_Numberofhandlesopened.Add(pro.HandleCount); //进程打开的句柄数 //_Numberofmodules.Add(pro.Modules.Count); //模块数量 //_Basicpriority.Add(pro.BasePriority); //基本优先级 //_processor.Add(pro.ProcessorAffinity.ToInt32()); //处理器 //_Minimumworkingset.Add(pro.MinWorkingSet.ToInt32()); //最小工作集 //_MaximumWorkingSet.Add(pro.MaxWorkingSet.ToInt32()); //最大工作集 //_Workset.Add(Convert.ToInt32(pro.WorkingSet64)); //工作集 //_Peakworkingset.Add(Convert.ToInt32(pro.PeakWorkingSet64)); //峰值工作集 //_Dedicatedmemorysize.Add(Convert.ToInt32(pro.PrivateMemorySize64 / 1048576)); //专用内存大小 //_UnpagedMemorySize.Add(Convert.ToInt32(pro.NonpagedSystemMemorySize64 / 1048576)); //未分页内存大小 //_PagingMemorySize.Add(Convert.ToInt32(pro.PagedMemorySize64 / 1048576)); //分页内存大小 //_Peakpagingmemorysize.Add(Convert.ToInt32(pro.PeakPagedMemorySize64 / 1048576)); //峰值分页内存大小 //_VirtualMemorySize.Add(Convert.ToInt32(pro.VirtualMemorySize64 / 1024)); //虚拟内存大小 //_PeakVirtualMemorySize.Add(Convert.ToInt32(pro.PeakVirtualMemorySize64 / 1048576)); //峰值虚拟内存大小 LOG.Write(eEvent.INFO_WINRESOURCE, ModuleName.System, //$"{ProcessName}:{pro.ProcessName}" + //$"{pro.StartTime.ToLongDateString() + pro.StartTime.ToLongTimeString()}" + $"{Response}:{pro.Responding.ToString()}\t" + $"{MainWindowHandle}:{pro.MainWindowHandle.ToString()}\t" + //$"{pro.MainWindowTitle}" + $"{AssociatedProcessHandle}:{pro.Handle.ToString()}\t" + $"{Numberofhandlesopened}:{pro.HandleCount.ToString()}\t" + $"{Numberofmodules}:{pro.Modules.Count.ToString()}\t" + $"{Basicpriority}:{pro.BasePriority.ToString()} \t" + $"{Increasepriority}:{pro.PriorityBoostEnabled.ToString()}\t" + $"{processor}:{pro.ProcessorAffinity.ToInt32().ToString()}\t" + $"{Minimumworkingset}:{pro.MinWorkingSet.ToInt32().ToString()}\t" + $"{MaximumWorkingSet}:{pro.MaxWorkingSet.ToInt32().ToString()}\t" + $"{Workset}:{pro.WorkingSet64.ToString()}\t" + $"{Peakworkingset}:{pro.PeakWorkingSet64.ToString()}\t" + $"{Dedicatedmemorysize}:{(pro.PrivateMemorySize64 / 1048576).ToString()}\t" + $"{UnpagedMemorySize}:{(pro.NonpagedSystemMemorySize64 / 1048576).ToString()}\t" + $"{PagingMemorySize}:{(pro.PagedMemorySize64 / 1048576).ToString()}\t" + $"{Peakpagingmemorysize}:{(pro.PeakPagedMemorySize64 / 1048576).ToString()}\t" + $"{VirtualMemorySize}:{(pro.VirtualMemorySize64 / 1048576).ToString()}\t" + $"{PeakVirtualMemorySize}:{(pro.PeakVirtualMemorySize64 / 1048576).ToString()}\t" + $"{Occupytime}:{pro.TotalProcessorTime.ToString()}\t" + $"{PrivilegeOccupancytime}:{pro.PrivilegedProcessorTime.ToString()}\t" + $"{Useroccupiedtime}:{pro.UserProcessorTime.ToString()}\t"); //如果虚拟内存大于800MB 即报警 if (pro.PagedMemorySize64 / 1048576 >= threshold) { LOG.Write(eEvent.WARN_WINRESOURCE, ModuleName.System, $"警告!内存异常增长,超过{threshold}MB阈值!"); MessageBox.Show($"警告!内存异常增长,超过{threshold}MB阈值!"); } } //没有就不做任何操作 } catch (Exception ex) { LOG.Write(eEvent.ERR_WINRESOURCE, ModuleName.System,$"Monitor Error happened: {ex}"); } } } }