全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1286
推到 Plurk!
推到 Facebook!

如何得知伺服器CPU忙碌程度

尚未結案
will
中階會員


發表:176
回覆:135
積分:62
註冊:2002-04-14

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-03-16 12:49:05 IP:61.221.xxx.xxx 未訂閱
小弟寫了一個Server端的程式, 用來接client端傳來的資料, 但如果太多人連上來時, 常常造成Server負擔過重而產生逾期失敗的訊息 請問如何得知伺服器CPU忙碌程度(例如cpu使用的百分比)? 如果Server負擔過重時, 就通知client端不要送資料上來
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-03-16 14:42:12 IP:202.39.xxx.xxx 未訂閱
這有一篇 Get CPU Usage, 不知能不能用? http://www.d-tnt.co.uk/readArticle.asp?id=3824&pg=4&cat=System&page=/delphitips.asp
unit  Unit1;    interface    uses
    Windows,  Messages,  SysUtils,  Classes,  Graphics,  Controls,  Forms,  Dialogs,
    StdCtrls,  Buttons;    type
    TForm1  =  class(TForm)
        Label1:  TLabel;
        procedure  Label1Click(Sender:  TObject);
        procedure  Label1DblClick(Sender:  TObject);
    private
        {  Private  declarations  }
    public
        {  Public  declarations  }
    end;    var
    Form1:  TForm1;
    stop  :  boolean;
implementation    {$R  *.DFM}
function  GetCPUSpeed:  Double;
const
    DelayTime  =  500;  //  measure  time  in  ms
var
    TimerHi,  TimerLo:  DWORD;
    PriorityClass,  Priority:  Integer;
begin
    PriorityClass  :=  GetPriorityClass(GetCurrentProcess);
    Priority  :=  GetThreadPriority(GetCurrentThread);        SetPriorityClass(GetCurrentProcess,  REALTIME_PRIORITY_CLASS);
    SetThreadPriority(GetCurrentThread,  THREAD_PRIORITY_TIME_CRITICAL);        Sleep(10);
    asm
        dw  310Fh  //  rdtsc
        mov  TimerLo,  eax
        mov  TimerHi,  edx
    end;
    Sleep(DelayTime);
    asm
        dw  310Fh  //  rdtsc
        sub  eax,  TimerLo
        sbb  edx,  TimerHi
        mov  TimerLo,  eax
        mov  TimerHi,  edx
    end;        SetThreadPriority(GetCurrentThread,  Priority);
    SetPriorityClass(GetCurrentProcess,  PriorityClass);        Result  :=  TimerLo  /  (1000.0  *  DelayTime);
end;    procedure  TForm1.Label1Click(Sender:  TObject);
begin
Stop  :=  False;
  while  not  Stop  do
  begin
    label1.Caption  :=  Format('CPU  speed:  %f  MHz',  [GetCPUSpeed]);
    Application.ProcessMessages;
   end;
end;    procedure  TForm1.Label1DblClick(Sender:  TObject);
begin
  Stop  :=  True;
end;    end.
--- 這次沒買到 cd-pro2 實在很 ...
will
中階會員


發表:176
回覆:135
積分:62
註冊:2002-04-14

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-03-17 21:41:10 IP:211.72.xxx.xxx 未訂閱
謝謝 Hangar 所提供的程式 但這集程式是在偵測CPU的運轉速度, 而非CPU的使用量 發表人 - will 於 2004/03/17 21:48:24
will
中階會員


發表:176
回覆:135
積分:62
註冊:2002-04-14

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-03-17 21:46:25 IP:211.72.xxx.xxx 未訂閱
Sorry ! 多按了一次post 發表人 - will 於 2004/03/17 21:47:59
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-03-17 22:28:25 IP:202.39.xxx.xxx 未訂閱
http://www.swissdelphicenter.ch/torry/showcode.php?id=969 不知您要的是不是紅色的部份?
const 
  SystemBasicInformation = 0; 
  SystemPerformanceInformation = 2; 
  SystemTimeInformation = 3;     type 
  TPDWord = ^DWORD;       TSystem_Basic_Information = packed record 
    dwUnknown1: DWORD; 
    uKeMaximumIncrement: ULONG; 
    uPageSize: ULONG; 
    uMmNumberOfPhysicalPages: ULONG; 
    uMmLowestPhysicalPage: ULONG; 
    uMmHighestPhysicalPage: ULONG; 
    uAllocationGranularity: ULONG; 
    pLowestUserAddress: Pointer; 
    pMmHighestUserAddress: Pointer; 
    uKeActiveProcessors: ULONG; 
    bKeNumberProcessors: byte; 
    bUnknown2: byte; 
    wUnknown3: word; 
  end;     type 
  TSystem_Performance_Information = packed record 
    liIdleTime: LARGE_INTEGER; {LARGE_INTEGER} 
    dwSpare: array[0..75] of DWORD; 
  end;     type 
  TSystem_Time_Information = packed record 
    liKeBootTime: LARGE_INTEGER; 
    liKeSystemTime: LARGE_INTEGER; 
    liExpTimeZoneBias: LARGE_INTEGER; 
    uCurrentTimeZoneId: ULONG; 
    dwReserved: DWORD; 
  end;     var 
  NtQuerySystemInformation: function(infoClass: DWORD; 
    buffer: Pointer; 
    bufSize: DWORD; 
    returnSize: TPDword): DWORD; stdcall = nil;       liOldIdleTime: LARGE_INTEGER = (); 
  liOldSystemTime: LARGE_INTEGER = ();     function Li2Double(x: LARGE_INTEGER): Double; 
begin 
  Result := x.HighPart * 4.294967296E9   x.LowPart 
end;     procedure GetCPUUsage; 
var 
  SysBaseInfo: TSystem_Basic_Information; 
  SysPerfInfo: TSystem_Performance_Information; 
  SysTimeInfo: TSystem_Time_Information; 
  status: Longint; {long} 
  dbSystemTime: Double; 
  dbIdleTime: Double;       bLoopAborted : boolean;     begin 
  if @NtQuerySystemInformation = nil then 
    NtQuerySystemInformation := GetProcAddress(GetModuleHandle('ntdll.dll'), 
      'NtQuerySystemInformation');       // get number of processors in the system       status := NtQuerySystemInformation(SystemBasicInformation, @SysBaseInfo, SizeOf(SysBaseInfo), nil); 
  if status <> 0 then Exit;       // Show some information 
  with SysBaseInfo do 
  begin 
      ShowMessage( 
      Format('uKeMaximumIncrement: %d'#13'uPageSize: %d'#13  
      'uMmNumberOfPhysicalPages: %d' #13 'uMmLowestPhysicalPage: %d' #13  
      'uMmHighestPhysicalPage: %d' #13 'uAllocationGranularity: %d'#13  
      'uKeActiveProcessors: %d'#13'bKeNumberProcessors: %d', 
      [uKeMaximumIncrement, uPageSize, uMmNumberOfPhysicalPages, 
      uMmLowestPhysicalPage, uMmHighestPhysicalPage, uAllocationGranularity, 
      uKeActiveProcessors, bKeNumberProcessors])); 
  end;       bLoopAborted := False;       while not bLoopAborted do 
  begin         // get new system time 
    status := NtQuerySystemInformation(SystemTimeInformation, @SysTimeInfo, SizeOf(SysTimeInfo), 0); 
    if status <> 0 then Exit;         // get new CPU's idle time 
    status := NtQuerySystemInformation(SystemPerformanceInformation, @SysPerfInfo, SizeOf(SysPerfInfo), nil); 
    if status <> 0 then Exit;         // if it's a first call - skip it 
    if (liOldIdleTime.QuadPart <> 0) then 
    begin           // CurrentValue = NewValue - OldValue 
      dbIdleTime := Li2Double(SysPerfInfo.liIdleTime) - Li2Double(liOldIdleTime); 
      dbSystemTime := Li2Double(SysTimeInfo.liKeSystemTime) - Li2Double(liOldSystemTime);           // CurrentCpuIdle = IdleTime / SystemTime 
      dbIdleTime := dbIdleTime / dbSystemTime;           // CurrentCpuUsage% = 100 - (CurrentCpuIdle * 100) / NumberOfProcessors 
      dbIdleTime := 100.0 - dbIdleTime * 100.0 / SysBaseInfo.bKeNumberProcessors   0.5; 

      // Show Percentage 
      Form1.Label1.Caption := FormatFloat('CPU Usage: 0.0 %',dbIdleTime);           Application.ProcessMessages;           // Abort if user pressed ESC or Application is terminated 
      bLoopAborted := (GetKeyState(VK_ESCAPE) and 128 = 128) or Application.Terminated;         end;         // store new CPU's idle and system time 
    liOldIdleTime := SysPerfInfo.liIdleTime; 
    liOldSystemTime := SysTimeInfo.liKeSystemTime;         // wait one second 
    Sleep(1000); 
  end; 
end;     procedure TForm1.Button1Click(Sender: TObject); 
begin 
  GetCPUUsage 
end; 
--- 這次沒買到 cd-pro2 實在很 ...
will
中階會員


發表:176
回覆:135
積分:62
註冊:2002-04-14

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-03-18 05:28:32 IP:211.72.xxx.xxx 未訂閱
Thank Hangar, 但是無法comple 很多關鍵字都很奇怪 如ULONG, LARGE_INTEGER 我把他們改成real, integer, 但還是有問題
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-03-18 08:41:26 IP:202.39.xxx.xxx 未訂閱
小弟在 D5 下試沒問題 您那邊有什麼錯誤訊息嗎? --- 這次沒買到 cd-pro2 實在很 ...
will
中階會員


發表:176
回覆:135
積分:62
註冊:2002-04-14

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-03-22 03:43:35 IP:218.162.xxx.xxx 未訂閱
錯誤訊息是 系統不認得 ULONG, LARGE_INTEGER
引言: 小弟在 D5 下試沒問題 您那邊有什麼錯誤訊息嗎? --- 這次沒買到 cd-pro2 實在很 ...
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-03-22 08:41:20 IP:202.39.xxx.xxx 未訂閱
小弟用 Delphi 5, 是可以 compile ULONG 和 LARGE_INTEGER 定義在 window.pas, 截錄如下:
  {$EXTERNALSYM PUINT}
  ULONG = Cardinal;
  {$EXTERNALSYM ULONG}    ...
type
  LONGLONG = Int64;
  {$EXTERNALSYM LONGLONG}
  PSID = Pointer;
  {$EXTERNALSYM PSID}
  PLargeInteger = ^TLargeInteger;
  _LARGE_INTEGER = record
    case Integer of
    0: (
      LowPart: DWORD;
      HighPart: Longint);
    1: (
      QuadPart: LONGLONG);
  end;
  {$EXTERNALSYM _LARGE_INTEGER}
  {$NODEFINE TLargeInteger}
  TLargeInteger = Int64;
  LARGE_INTEGER = _LARGE_INTEGER;
  {$EXTERNALSYM LARGE_INTEGER}    
--- 這次沒買到 cd-pro2 實在很 ...
系統時間:2024-05-12 6:45:11
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!