2010-12-15 4 views
5

"top"コマンドがどのプロセスで使用されたCPUパーセンテージをどのように計算するのか知りたいと思います。"top"コマンドによるunixでの単一プロセスによるCPUパーセンテージの計算

私は/ procディレクトリの "psinfo"バイナリファイルを読み込もうとしましたが、結果を見つけるのに役立たなかった。

どのように情報を入力してくださいか。

ありがとうございます。

+1

重複していませんが関連しています - http://stackoverflow.com/questions/552976/top-commands-cpu-usage-calculation – DumbCoder

答えて

9

topコマンドは、proc file systemのデータを使用してCPU使用率を計算します。 CPU使用量データを含む実際のファイルは、プラットフォームによって異なる場合があります。たとえば、Linuxの場合は/proc/<pid>/stat、Solarisの場合は/proc/<pid>/psinfoにあります。 CPU使用率は、プロセスの累積CPU時間の差を、更新の間に測定された時間で割ったものとして計算されます。


Linuxの場合、あなたはhttp://procps.sourceforge.netからprocpspstopを含むソース、および他のプロセスツールを検査することができます。特にreadproc.cファイルには、データを取得するための機能が含まれています。


Solarisの場合、あなたはhttps://hg.java.net/hg/solaris~on-src/file/tip/usr/src/lib/libprocからlibprocソースを検査することができます。 prog_get_info.cファイルには、データを取得して構造体psinfo_tに格納する機能が含まれています。


は、Linux、Solaris、および他の人のために、あなたは http://sourceforge.net/projects/unixtopから Unix Topソースを検査することができます。 machineディレクトリ内のプラットフォーム固有のソースファイルには、データを取得するための機能が含まれています。


更新

プロセスのCPU時間を取得するための別のオプション(Solarisのみ)はioctl()システムコールにPIOCPSINFOまたはPIOCSTATUSオプションに渡すことができます。 PIOCPSINFOオプションは、prpsinfo_t構造体内のさまざまなプロセス情報を返します。 PIOCSTATUSオプションは、prstatus_t構造体のプロセスのステータス情報を返します。

int main(int argc, char* argv[]) 
{ 
    int fd; 
    prpsinfo_t info; 
    prstatus_t status; 
    char procbuf[50]; 

    sprintf(procbuf, "/proc/%d", getpid()); 
    fd = open(procbuf, O_RDONLY); 

    ioctl(fd, PIOCPSINFO, &info); 
    printf("Process user+sys time = %ld sec %ld nsec\n" 
      "Reaped children user+sys time = %ld sec %ld nsec\n", 
      info.pr_time.tv_sec, info.pr_time.tv_nsec, 
      info.pr_ctime.tv_sec, info.pr_ctime.tv_nsec); 

    ioctl(fd, PIOCSTATUS, &status); 
    printf("Process user+sys time = %ld sec %ld nsec\n" 
      "Sum of children's user+sys time = %ld sec %ld nsec\n", 
      status.pr_utime.tv_sec+status.pr_stime.tv_sec, 
      status.pr_utime.tv_nsec+status.pr_stime.tv_nsec, 
      status.pr_cutime.tv_sec+status.pr_cstime.tv_sec, 
      status.pr_cutime.tv_nsec+status.pr_cstime.tv_nsec); 

    close(fd); 
    exit(0); 
} 

注:このコードは未検証であり、簡略化のためにエラーチェックを省略http://getthegood.com/TechNotes/Papers/ProcStatistics.htmlでコード例から採用

+0

ありがとう。私はpsinfoが以前私のために動かなかったけれども、あなたから与えられたすべてのオプションをチェックしています。 – Arunmu

関連する問題