使用C的系统调用,如何获得CPU的利用率?

时间:2011-03-16 17:21:56

标签: c freebsd

在FreeBSD的C中,如何访问CPU利用率?

我正在编写一些代码来处理HTTP重定向。如果CPU负载超过FReeBSD系统的阈值,我想重定向客户端请求。查看手册页,kvm_getpcpu()似乎是正确的答案,但是手册页(我读过)没有记录用法。

欢迎任何提示或指示 - 谢谢!


在阅读完答案后,我能够提出以下内容。由于文档很差,我不是100%肯定它是正确的,但顶部似乎同意。感谢所有回答的人。

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

3 个答案:

答案 0 :(得分:4)

从MAN页面

命名

kvm_getmaxcpu,kvm_getpcpu - 访问每CPU数据

<强>库

内核数据访问库(libkvm,-lkvm)

<强>概要

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

<强>描述

kvm_getmaxcpu()和kvm_getpcpu()函数用于访问 由kd指示的内核中活动处理器的每CPU数据。该 kvm_getmaxcpu()函数返回支持的最大CPU数 内核。 kvm_getpcpu()函数返回一个缓冲区,其中包含 单个CPU的CPU数据。这个缓冲区由struct pcpu描述 类型。调用者负责通过调用释放缓冲区 免费(3)不再需要时。如果cpu不活动,则为NULL 而是返回。

<强> CACHING

这些函数缓存各种内核变量的nlist值 在连续的调用中重复使用。您可以使用kd set调用任一函数 为NULL以清除此缓存。

返回值

成功时,kvm_getmaxcpu()函数返回最大数量 内核支持的CPU。如果发生错误,则返回-1。

成功时,kvm_getpcpu()函数返回指向已分配的指针 缓冲区或NULL。如果发生错误,则返回-1。

如果任一函数遇到错误,则可能出现错误消息 通过kvm_geterr(3。)

检索

修改

这是kvm_t结构:

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

答案 1 :(得分:1)

我相信你想要研究'man sysctl'。

答案 2 :(得分:0)

我不知道确切的库,命令或系统调用;但是,如果你真的遇到困难,请将源代码下载到顶部。当您使用“-P”标志时,它会显示每个cpu的统计信息,并且必须从某个地方获取该信息。