2011-03-16 12 views
7

En C en FreeBSD, ¿cómo se accede a la utilización de la CPU?Usando llamadas al sistema desde C, ¿cómo obtengo la utilización de la (s) CPU (s)?

Estoy escribiendo algunos códigos para manejar los redireccionamientos HTTP. Si la carga de la CPU supera un umbral en un sistema FReeBSD, quiero redirigir las solicitudes del cliente. Examinando las páginas man, kvm_getpcpu() parece ser la respuesta correcta, pero las páginas man (que leo) no documentan el uso.

Cualquier sugerencia o sugerencia sería bienvenida, ¡gracias!


Después de leer las respuestas aquí, pude decir que a continuación. Debido a la documentación deficiente, no estoy 100% seguro de que sea correcta, pero la parte superior parece estar de acuerdo. Gracias a todos los que contestaron.

#include <stdio.h> 
#include <string.h> 
#include <sys/types.h> 
#include <sys/sysctl.h> 
#include <unistd.h> 

#define CP_USER 0 
#define CP_NICE 1 
#define CP_SYS 2 
#define CP_INTR 3 
#define CP_IDLE 4 
#define CPUSTATES 5 

int main() 
{ 
     long cur[CPUSTATES], last[CPUSTATES]; 
     size_t cur_sz = sizeof cur; 
     int state, i; 
     long sum; 
     double util; 

     memset(last, 0, sizeof last); 

     for (i=0; i<6; i++) 
     { 
       if (sysctlbyname("kern.cp_time", &cur, &cur_sz, NULL, 0) < 0) 
       { 
         printf ("Error reading kern.cp_times sysctl\n"); 
         return -1; 
       } 

       sum = 0; 
       for (state = 0; state<CPUSTATES; state++) 
       { 
         long tmp = cur[state]; 
         cur[state] -= last[state]; 
         last[state] = tmp; 
         sum += cur[state]; 
       } 

       util = 100.0L - (100.0L * cur[CP_IDLE]/(sum ? (double) sum : 1.0L)); 
       printf("cpu utilization: %7.3f\n", util); 
       sleep(1); 
     } 

     return 0; 
} 

Respuesta

4

Desde las páginas de manual

NOMBRE

kvm_getmaxcpu, kvm_getpcpu - acceso a los datos por CPU

BIBLIOTECA

Kernel Library acceso a datos (libkvm, -lkvm)

SINOPSIS

#include <sys/param.h> 
#include <sys/pcpu.h> 
#include <sys/sysctl.h> 
#include <kvm.h> 

int 
kvm_getmaxcpu(kvm_t *kd); 

void * 
kvm_getpcpu(kvm_t *kd, int cpu); 

DESCRIPCIÓN

El kvm_getmaxcpu() y kvm_getpcpu() se utiliza para acceder a los datos por -CPU de procesadores activos en el núcleo indicado por kd. La función kvm_getmaxcpu() devuelve la cantidad máxima de CPU compatibles con kernel. La función kvm_getpcpu() devuelve un búfer que contiene los datos de la CPU per- para una única CPU. Este buffer está descrito por el tipo struct pcpu . La persona que llama es responsable de liberar el búfer mediante una llamada al gratis (3) cuando ya no sea necesario. Si la CPU no está activa, entonces NULL es devuelto en su lugar.

CACHING

Estas funciones almacenar en caché los valores nlist por diversas variables del núcleo, que se vuelven a utilizar en llamadas sucesivas. Puede llamar a cualquiera de las funciones con el conjunto kd a NULL para borrar este caché.

VALOR DEVUELTO

En caso de éxito, la función kvm_getmaxcpu() devuelve el número máximo de CPUs soportados por el núcleo. Si ocurre un error, devuelve -1 en su lugar.

En caso de éxito, la función kvm_getpcpu() devuelve un puntero a un buffer asignado o NULL. Si ocurre un error, devuelve -1 en su lugar.

Si cualquiera función encuentra un error, a continuación, un mensaje de error puede ser recuperado a través de kvm_geterr


EDITAR

Aquí está la struct kvm_t (3.):

struct __kvm { 
    /* 
    * a string to be prepended to error messages 
    * provided for compatibility with sun's interface 
    * if this value is null, errors are saved in errbuf[] 
    */ 
    const char *program; 
    char *errp;   /* XXX this can probably go away */ 
    char errbuf[_POSIX2_LINE_MAX]; 
    #define ISALIVE(kd) ((kd)->vmfd >= 0) 
    int  pmfd;   /* physical memory file (or crashdump) */ 
    int  vmfd;   /* virtual memory file (-1 if crashdump) */ 
    int  unused;   /* was: swap file (e.g., /dev/drum) */ 
    int  nlfd;   /* namelist file (e.g., /kernel) */ 
    struct kinfo_proc *procbase; 
    char *argspc;   /* (dynamic) storage for argv strings */ 
    int  arglen;   /* length of the above */ 
    char **argv;   /* (dynamic) storage for argv pointers */ 
    int  argc;   /* length of above (not actual # present) */ 
    char *argbuf;  /* (dynamic) temporary storage */ 
    /* 
    * Kernel virtual address translation state. This only gets filled 
    * in for dead kernels; otherwise, the running kernel (i.e. kmem) 
    * will do the translations for us. It could be big, so we 
    * only allocate it if necessary. 
    */ 
    struct vmstate *vmst; 
}; 
0

No sé la biblioteca exacta, comando o llamada al sistema; sin embargo, si realmente te quedas atascado, descarga el código fuente al principio. Muestra las estadísticas por CPU cuando usa el indicador "-P" y tiene que obtener esa información de algún lugar.

1

Creo que quieres mirar en 'man sysctl'.

+0

Gracias - ¡eso fue muy útil! –

Cuestiones relacionadas