2010-12-15 19 views
5

Me gustaría saber cómo calcula el comando "superior" el porcentaje de CPU utilizado por cualquier proceso.Cálculo del porcentaje de CPU por un único proceso en Unix mediante el comando "superior"

He intentado leer el archivo binario "psinfo" en el directorio/proc, pero no ayudó a encontrar el resultado.

Proporcione toda la información de cómo se puede hacer.

Gracias de antemano.

+1

No duplicado pero relacionado - http://stackoverflow.com/questions/552976/top-commands-cpu-usage-calculation – DumbCoder

Respuesta

9

El comando top calcula el uso de la CPU utilizando los datos en el proc file system. El archivo real que contiene los datos de uso de la CPU puede variar de una plataforma a otra. Por ejemplo, en Linux se encuentra en /proc/<pid>/stat y para Solaris se encuentra en /proc/<pid>/psinfo. El uso de la CPU se calcula como la diferencia en el tiempo acumulativo de CPU para un proceso dividido por la cantidad de tiempo medido entre las actualizaciones.


Para Linux, se puede inspeccionar la fuente procps que incluye ps, top, y otra herramienta de proceso de http://procps.sourceforge.net. El archivo readproc.c en particular contiene la funcionalidad para recuperar los datos.


Para Solaris, puede inspeccionar la fuente de https://hg.java.net/hg/solaris~on-src/file/tip/usr/src/lib/libproclibproc. El archivo prog_get_info.c contiene la funcionalidad para recuperar los datos y almacenarlos en una estructura psinfo_t.


Para Linux, Solaris, y otros, se puede inspeccionar la fuente de Unix Tophttp://sourceforge.net/projects/unixtop. Los archivos fuente específicos de la plataforma dentro del directorio machine contienen la funcionalidad para recuperar los datos.


actualización

Otra opción (Solaris) para recuperar el tiempo de CPU para un proceso puede estar pasando a la opción PIOCPSINFO o PIOCSTATUS a la llamada ioctl() sistema. La opción PIOCPSINFO devuelve información de proceso miscelánea en una estructura prpsinfo_t. La opción PIOCSTATUS devuelve información de estado para el proceso en una estructura prstatus_t.

Adaptado de ejemplo de código en 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); 
} 

Nota: Este código no se ha probado y omite la comprobación de errores por simplicidad.

+0

Gracias por la entrada. Estoy revisando todas las opciones que me dio, aunque el psinfo no funcionó antes para mí también. – Arunmu

Cuestiones relacionadas