鑑於我擁有適當的權限,如何從遠程獲得性能數據(即「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