鉴于我拥有适当的权限,如何从远程获得性能数据(即“Pages/Sec”,“平均磁盘队列”等)电脑?如何使用Delphi从远程计算机获取性能数据
基本上我想编写一个函数是这样的:
function GetPerformanceData(aComputerName, aPerformanceIndicator: string): variant;
这是最好(当然)制定出在Windows和Linux的方块。
鉴于我拥有适当的权限,如何从远程获得性能数据(即“Pages/Sec”,“平均磁盘队列”等)电脑?如何使用Delphi从远程计算机获取性能数据
基本上我想编写一个函数是这样的:
function GetPerformanceData(aComputerName, aPerformanceIndicator: string): variant;
这是最好(当然)制定出在Windows和Linux的方块。
我不太清楚“开箱即用”的含义 - 您不想对服务器进行任何修改?另外,既然你使用Delphi,我假设客户端是Windows--服务器呢?
最简单的做法是制作一个守护进程/服务来收集服务器上的这些信息,并且客户端上的功能可以连接并读取它。服务器可以像运行在Apache中的CGI shell脚本或自定义的Delphi程序一样简单。另外请注意,您通常可以通过SSH在远程UNIX计算机上运行命令,因此您可以在远程服务器上运行诸如vm_stat之类的内容,而无需编写任何内容。 Windows有与PSEXEC工具类似的功能,你可以在这里读到它: http://technet.microsoft.com/en-us/sysinternals/bb897553.aspx
如果WMI (Windows Management Instrumentation)已启用,您可以使用免费的WMI component collection它可为Delphi:
MagWMI允许访问和使用Windows管理工具 更新Windows系统信息的 。 MagWMI到 提供总体视图访问使用SQL等 命令的任何WMI信息,并且还若干 专用功能与TCP/IP 配置,如设置 适配器的IP地址,并且该计算机 名和域/工作组。
注意这只解决了Windows部分的问题 – 2009-11-12 14:56:01
看看this answer。
你可以重写GetPerformanceData
功能允许连接到远程注册表:
function GetPerformanceData(const RegValue: string; const ComputerName: string = ''): PPerfDataBlock;
const
BufSizeInc = 4096;
var
BufSize, RetVal: Cardinal;
Key: HKEY;
begin
BufSize := BufSizeInc;
Result := AllocMem(BufSize);
try
if ComputerName = '' then
Key := HKEY_PERFORMANCE_DATA
else if RegConnectRegistry(PChar(ComputerName), HKEY_PERFORMANCE_DATA, Key) <> ERROR_SUCCESS then
RaiseLastOSError;
RetVal := RegQueryValueEx(Key, PChar(RegValue), nil, nil, PByte(Result), @BufSize);
try
repeat
case RetVal of
ERROR_SUCCESS:
Break;
ERROR_MORE_DATA:
begin
Inc(BufSize, BufSizeInc);
ReallocMem(Result, BufSize);
RetVal := RegQueryValueEx(Key, PChar(RegValue), nil, nil, PByte(Result), @BufSize);
end;
else
RaiseLastOSError;
end;
until False;
finally
RegCloseKey(Key);
end;
except
FreeMem(Result);
raise;
end;
end;
查看等功能于该单位为例如何从返回的性能数据检索特定的计数器值。请注意,他们都写在本地工作,所以你需要对其进行修改,以便能够指定计算机名称作为附加参数,例如:
function GetSystemUpTime(const ComputerName: string = ''): TDateTime;
const
SecsPerDay = 60 * 60 * 24;
var
Data: PPerfDataBlock;
Obj: PPerfObjectType;
Counter: PPerfCounterDefinition;
SecsStartup: UInt64;
begin
Result := 0;
Data := GetPerformanceData(IntToStr(ObjSystem), ComputerName);
try
Obj := GetObjectByNameIndex(Data, ObjSystem);
if not Assigned(Obj) then
Exit;
Counter := GetCounterByNameIndex(Obj, CtrSystemUpTime);
if not Assigned(Counter) then
Exit;
SecsStartup := GetCounterValue64(Obj, Counter);
// subtract from snapshot time and divide by base frequency and number of seconds per day
// to get a TDateTime representation
Result := (Obj^.PerfTime.QuadPart - SecsStartup)/Obj^.PerfFreq.QuadPart/SecsPerDay;
finally
FreeMem(Data);
end;
end;
您可以得到由PERF对象和计数器索引命令lodctr /s:<filename>
。 例如,'Pages/sec'计数器索引为40,属于perf对象'Memory',索引4. 还有关于如何解释原始计数器数据的外观here,具体取决于它们的定义。
注意这只解决了Windows部分的问题 – 2009-11-12 14:56:41
当然你是对的。我忽略了Linux的要求,对不起。 – 2009-11-12 15:23:46
+1特别是因为这是在Windows和Linux上“开箱即用”的唯一方式:远程机器应该提供数据,然后Delphi只是一个客户端。 – 2009-11-12 14:55:25