ZBLOG

int GetAllDomainState(struct kvm_state*st){ virConnectPtr conn; virDomainPtr *alldomain=NULL; virDomainInfo domain_info; int num=0,i=0; struct timeval tv; conn = virConnectOpen("qemu:///system"); if (conn ==...

根据提供的代码,可以看出这是一个使用libvirt库获取虚拟机状态信息的函数。如果你想获取virConnectGetAllDomainStats信息,你可以进行如下修改:

int GetAllDomainState(struct kvm_state* st) {
    virConnectPtr conn;
    virDomainPtr *alldomain = NULL;
    virDomainInfo domain_info;
    int num = 0, i = 0;
    struct timeval tv;

    conn = virConnectOpen("qemu:///system");
    if (conn == NULL) {
        fprintf(stderr, "Failed to open connection to qemu+tcp://localhost/system\n");
        return 0;
    }

    num = virConnectListAllDomains(conn, &alldomain, VIR_CONNECT_LIST_DOMAINS_ACTIVE | VIR_CONNECT_LIST_DOMAINS_RUNNING);
    
    for (i = 0; i < num; i++) {
        strncpy(st[i].name, virDomainGetName(alldomain[i]), NAME_SIZE);   // name

        // Get the statistics for each domain
        virTypedParameterPtr params = NULL;
        int nparams = 0;

        int ret = virDomainGetStats(alldomain[i], VIR_DOMAIN_STATS_CPU_TOTAL | VIR_DOMAIN_STATS_BALLOON_USED,
                                    &params, &nparams, 0);
        
        if (ret >= 0 && nparams > 1) {
            for (int j = 0; j < nparams; j++) {
                if (params[j].type == VIR_TYPED_PARAM_UINT &&
                    STREQ(params[j].field, VIR_DOMAIN_STATS_CPU_TOTAL)) {
                        st[i].cpu_time_ms = params[j].value.ui / NANOSECONDS_PER_MILLISECOND; // cpu time in milliseconds
                }
                else if (params[j].type == VIR_TYPED_PARAM_ULLONG &&
                         STREQ(params[j].field, VIR_DOMAIN_STATS_BALLOON_USED)) {
                        st[i].mem_used_mb = params[j].value.ul / MEGABYTES; // memory used in megabytes
                }
            }
        }

        st[i].vcpus = virDomainGetVcpusFlags(alldomain[i], VIR_DOMAIN_VCPU_MAXIMUM);
        
        gettimeofday(&(st[i].h_real_time), NULL);
        
        virDomainFree(alldomain[i]);
    }

    sleep(1);

    for (i = 0; i < num; i++) {
        struct timeval curr_tv;
        gettimeofday(&curr_tv, NULL);
        
        long elapsed_usec = (curr_tv.tv_sec - st[i].h_real_time.tv_sec) * MICROSECONDS_PER_SECOND +
                            (curr_tv.tv_usec - st[i].h_real_time.tv_usec);
        
        if (elapsed_usec > 0) {
            double elapsed_sec = elapsed_usec / MICROSECONDS_PER_SECOND;
            st[i].cpu_rate = (st[i].cpu_time_ms / elapsed_sec) / st[i].vcpus * 100.0;
        }
    }

    virConnectClose(conn);

    return num;
}

请注意,这只是一个参考修改的示例,可能还需要根据你的具体需求和环境进行进一步调整。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://sdn.0voice.com/?id=3150

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?