📄 udimonitor.pas
字号:
unit uDIMonitor;
interface
uses
Windows, SysUtils, StrUtils, DateUtils, uCriticalSection;
type
TDIMonitor = Class
private
m_bStart: Boolean; //是否开始监视
m_nTotalRecvBytes: LongWord; //总接受字节
m_nTotalSendBytes: LongWord; //总发送字节
m_nTotalRecvKB: LongWord; //总接受KB
m_nTotalSendKB: LongWord; //总发送KB
m_nTotalRecvMB: LongWord; //总接受MB
m_nTotalSendMB: LongWord; //总发送MB
m_nTotalRecvGB: LongWord; //总接受GB
m_nTotalSendGB: LongWord; //总接受GB
m_nTotalRecvTB: LongWord; //总接受TB
m_nTotalSendTB: LongWord; //总接受TB
m_nSecondRun: LongWord; //运行秒
m_nMinuteRun: LongWord; //运行分
m_nHourRun: LongWord; //运行时
m_nDayRun: LongWord; //运行天
m_StartRun: DWORD; //起始时间 (上一次)
m_LastRun: DWORD; //终止时间 (最后一次)
m_SendRate: Real; //发送每秒字节流量
m_RecvRate: Real; //接受每秒字节流量
m_RecvCount: DWORD; //Recv投递数
m_SendCount: DWORD; //Send投递数
m_iocpRecvCount: DWORD; //IOCP队列中Recv数
m_iocpSendCount: DWORD; //IOCP队列中Send数
m_iocpCloseSockeCount:DWORD; //IOCP队列中ClostSocket数
m_AcceptExBufCount: DWORD; //AcceptEx数量
m_iNewBufferCount: DWORD; //申请Buffer次数
m_iFreeBufferCount: DWORD; //释放Buffer次数
m_iNewClientCount: DWORD; //申请上下文次数
m_iFreeClientCount: DWORD; //释放上下文次数
m_iPostCloseCounrt: DWORD; //投递PostClose次数
m_iExitFreeContextCount: DWORD; //服务器释放上下文次数
m_ActiveConnections:DWORD; //系统连接数
m_FreeContextCount: DWORD; //上下文池中数
m_FreeBufCount: DWORD; //内存池中Buffer数量
m_LogCount: DWORD; //日志次数
m_MonitorLock: TCriticalSection;
public
procedure ClearMonitor; //清空
procedure StartMonitor; //开始
procedure StopMonitor; //停止
procedure CalcCapability; //计算性能
//每次增加,接受,发送字节时,同时增加次数
procedure AddRecvByte(nRecvByte: DWORD); //增加接受字节数
procedure AddSendByte(nSendByte: DWORD); //增加发送字节数
procedure AddIOCPRecv; //IOCP挂起数加1 (Recv)
procedure SubIOCPRecv; //IOCP挂起数减1 (Recv)
procedure AddIOCPSend; //IOCP挂起数加1 (Send)
procedure SubIOCPSend; //IOCP挂起数加1 (Send)
procedure AddIOCPCloseSocke; //IOCP挂起数加1 (CloseSocke)
procedure SubIOCPCloseSocke; //IOCP挂起数加1 (CloseSocke)
procedure AddIOCPAcceptEx; //IOCP AcceptEx挂起数加1
procedure SubIOCPAcceptEx; //IOCP AcceptEx挂起数加1
procedure AddNewBuffer; //IOCP 真正分配Buffer次数
procedure AddFreeBuffer; //IOCP 真正释放Buffer次数
procedure AddNewContext; //IOCP 真正分配上下文次数
procedure AddFreeContext; //IOCP 真正释放上下文次数
procedure AddExitFreeContextCount; //IOCP 器释放上下文次数
function GetExitFreeContextCount: DWORD; //IOCP 器释放上下文次数
procedure AddPostClose; //投递PostClose次数
function GetPostClose: DWORD; //投递PostClose次数
procedure AddLogCount; //增加日志次数
procedure AddActiveConn; //IOCP 系统连接数加1
procedure SubActiveConn; //IOCP 系统连接数减1
procedure GetParams( var nDay: Integer;
var nHour: Integer;
var nMinute: Integer;
var nSecond: Integer;
var nRecvGB: Integer;
var nRecvMB: Integer;
var nRecvKB: Integer;
var nRecvByte: Integer;
var nSecvGB: Integer;
var nSecvMB: Integer;
var nSecvKB: Integer;
var nSecvByte: Integer;
var rRecvRate: Real;
var rSendRate: Real;
var nNewBufferCount: Integer;
var nFreeBufferCount: Integer;
var nNewClientCount: Integer;
var nFreeClientCount: Integer;
var nExitFreeContextCount: Integer;
var nRecvCount: Integer;
var nSendCount: Integer;
var nIocpRecvCount: Integer;
var nIocpSendCount: Integer;
var nAcceptExBufCount: Integer;
var nIocpBufCount: Integer;
var nContextCount: Integer;
var nFreeContextCount: Integer );
public
constructor Create;
destructor Destroy; override;
end;
var
_DIMonitor: TDIMonitor;
implementation
constructor TDIMonitor.Create;
begin
inherited Create;
m_MonitorLock := TCriticalSection.Create;
ClearMonitor;
end;
destructor TDIMonitor.Destroy;
begin
FreeAndNil(m_MonitorLock);
inherited Destroy;
end;
procedure TDIMonitor.ClearMonitor;
begin
try
m_MonitorLock.Lock;
m_nTotalRecvBytes := 0;
m_nTotalSendBytes := 0;
m_nTotalRecvKB := 0;
m_nTotalSendKB := 0;
m_nTotalRecvMB := 0;
m_nTotalSendMB := 0;
m_nTotalRecvGB := 0;
m_nTotalSendGB := 0;
m_nSecondRun := 0;
m_nMinuteRun := 0;
m_nHourRun := 0;
m_nDayRun := 0;
m_RecvCount := 0;
m_SendCount := 0;
m_iocpRecvCount := 0;
m_iocpSendCount := 0;
m_iocpCloseSockeCount := 0;
m_iNewBufferCount := 0;
m_iFreeBufferCount := 0;
m_iNewClientCount := 0;
m_iFreeClientCount := 0;
m_iExitFreeContextCount := 0;
m_iPostCloseCounrt := 0;
m_ActiveConnections := 0;
m_FreeContextCount := 0;
m_FreeBufCount := 0;
m_AcceptExBufCount := 0;
m_LogCount := 0;
m_StartRun := 0;
m_LastRun := 0;
finally
m_MonitorLock.UnLock;
end;
end;
procedure TDIMonitor.StartMonitor;
begin
if not m_bStart then begin
ClearMonitor;
m_bStart := TRUE;
m_StartRun := GetTickCount;
end;
end;
procedure TDIMonitor.StopMonitor;
begin
if m_bStart then begin
ClearMonitor;
m_bStart := FALSE;
end;
end;
procedure TDIMonitor.CalcCapability;
var
m_CountSec: Integer;
m_RecvByte: Real;
m_SendByte: Real;
begin
m_LastRun := GetTickCount;
//得到秒
m_nSecondRun := m_nSecondRun + (m_LastRun - m_StartRun) div 1000;
//修改起始时间 (最后时间-余数)
m_StartRun := m_LastRun - (m_LastRun - m_StartRun) mod 1000;
//秒转成分
m_nMinuteRun := m_nMinuteRun + m_nSecondRun div 60;
m_nSecondRun := m_nSecondRun mod 60;
//分转成时
m_nHourRun := m_nHourRun + m_nMinuteRun div 60;
m_nMinuteRun := m_nMinuteRun mod 60;
//时转换成天
m_nDayRun := m_nDayRun + m_nHourRun div 24;
m_nHourRun := m_nHourRun mod 24;
//字节转化成KB
m_nTotalRecvKB := m_nTotalRecvKB + m_nTotalRecvBytes div 1024;
m_nTotalSendKB := m_nTotalSendKB + m_nTotalSendBytes div 1024;
m_nTotalRecvBytes := m_nTotalRecvBytes mod 1024;
m_nTotalSendBytes := m_nTotalSendBytes mod 1024;
//KB转化成MB
m_nTotalRecvMB := m_nTotalRecvMB + m_nTotalRecvKB div 1024;
m_nTotalSendMB := m_nTotalSendMB + m_nTotalSendKB div 1024;
m_nTotalRecvKB := m_nTotalRecvKB mod 1024;
m_nTotalSendKB := m_nTotalSendKB mod 1024;
//MB转化成GB
m_nTotalRecvGB := m_nTotalRecvGB + m_nTotalRecvMB div 1024;
m_nTotalSendGB := m_nTotalSendGB + m_nTotalSendMB div 1024;
m_nTotalRecvMB := m_nTotalRecvMB mod 1024;
m_nTotalSendMB := m_nTotalSendMB mod 1024;
//计算RECV流量 秒
m_CountSec := m_nDayRun * 24*60*60+ //天
m_nHourRun * 60*60+ //时
m_nMinuteRun*60+ //分
m_nSecondRun; //秒
m_RecvByte := m_nTotalRecvGB*1024*1024*1024 +
m_nTotalRecvMB*1024*1024+
m_nTotalRecvKB*1024+
m_nTotalRecvBytes;
//每秒字节流量
if m_CountSec<>0 then
m_RecvRate := m_RecvByte/m_CountSec
else
m_RecvRate := 0;
m_SendByte := m_nTotalSendGB*1024*1024*1024 +
m_nTotalSendMB*1024*1024+
m_nTotalSendKB*1024+
m_nTotalSendBytes;
if m_CountSec<>0 then
m_SendRate := m_SendByte/m_CountSec
else
m_SendRate := 0;
end;
procedure TDIMonitor.AddRecvByte(nRecvByte: DWORD);
begin
try
m_MonitorLock.Lock;
m_nTotalRecvBytes := m_nTotalRecvBytes + nRecvByte;
m_RecvCount := m_RecvCount +1;
CalcCapability;
finally
m_MonitorLock.UnLock;
end;
end;
procedure TDIMonitor.AddSendByte(nSendByte: DWORD);
begin
try
m_MonitorLock.Lock;
m_nTotalSendBytes := m_nTotalSendBytes + nSendByte;
m_SendCount := m_SendCount + 1;
CalcCapability;
finally
m_MonitorLock.UnLock;
end;
end;
//增加日志次数
procedure TDIMonitor.AddLogCount;
begin
try
m_MonitorLock.Lock;
m_LogCount := m_LogCount + 1;
finally
m_MonitorLock.UnLock;
end;
end;
//IOCP挂起数加1 (Recv)
procedure TDIMonitor.AddIOCPRecv;
begin
try
m_MonitorLock.Lock;
m_iocpRecvCount := m_iocpRecvCount + 1;
finally
m_MonitorLock.UnLock;
end;
end;
//IOCP挂起数减1 (Recv)
procedure TDIMonitor.SubIOCPRecv;
begin
try
m_MonitorLock.Lock;
m_iocpRecvCount := m_iocpRecvCount - 1;
finally
m_MonitorLock.UnLock;
end;
end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -