2010-12-15 12 views
5

Chciałbym wiedzieć, w jaki sposób polecenie "top" oblicza procent procesora wykorzystywany przez dowolny proces.Obliczanie procentu procesora przez pojedynczy proces w systemie Unix za pomocą polecenia "top"

Próbowałem odczytywać plik binarny "psinfo" w katalogu/proc, ale to nie pomogło w znalezieniu wyniku.

Proszę podać wszelkie informacje, jak można to zrobić.

Z góry dziękuję.

+1

Nie powielać ale powiązanych - http://stackoverflow.com/questions/552976/top-commands-cpu-usage-calculation – DumbCoder

Odpowiedz

9

Komenda top oblicza użycie procesora przy użyciu danych z proc file system. Rzeczywisty plik zawierający dane o wykorzystaniu procesora może się różnić w zależności od platformy. Na przykład w Linuksie można go znaleźć pod numerem /proc/<pid>/stat, a w systemie Solaris - w /proc/<pid>/psinfo. Wykorzystanie procesora jest obliczane jako różnica w łącznym czasie procesora dla procesu podzielona przez czas mierzony między aktualizacjami.


Dla Linuksa, można sprawdzić źródło procps który zawiera ps, top i inne narzędzia procesowe od http://procps.sourceforge.net. W szczególności plik readproc.c zawiera funkcję pobierania danych.


Dla Solaris można skontrolować źródło z https://hg.java.net/hg/solaris~on-src/file/tip/usr/src/lib/libproclibproc. Plik prog_get_info.c zawiera funkcje pobierania danych i przechowywania ich w strukturze psinfo_t.


dla systemów Linux, Solaris i innych, można sprawdzić źródło Unix Top z http://sourceforge.net/projects/unixtop. Pliki źródłowe specyficzne dla platformy w katalogu machine zawierają funkcje pobierania danych.


Aktualizacja

Inną opcją (tylko Solaris) do pobierania czasu procesora dla procesu można przechodząc do opcji do wywołania systemowego ioctl()PIOCPSINFO lub PIOCSTATUS. Opcja PIOCPSINFO zwraca różne informacje o procesach w strukturze prpsinfo_t. Opcja PIOCSTATUS zwraca informacje o statusie dla procesu w strukturze prstatus_t.

adaptowany z przykładowym kodem w http://getthegood.com/TechNotes/Papers/ProcStatistics.html:

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); 
} 

Uwaga: Ten kod jest niesprawdzone i pomija sprawdzanie błędów dla prostoty.

+0

Dzięki za wejście. Sprawdzam wszystkie opcje podane przez ciebie, chociaż psinfo nie wyszło mi wcześniej. – Arunmu

Powiązane problemy