[toc]
简介 collectd 是一个后台监控程序,用来采集其所运行系统上的系统信息,并提供各种存储方式来存储为不同值的格式,例如 RRD 文件形式、文本格式、MongoDB 等等
连接 :官网文档 、下载地址 、源码地址
优点
C语言编写,性能好,跨平台能力强
插件丰富,方便扩充
缺点
监控简单
不能直接生成图形
使用 配置 修改sudo vim /opt/collectd/etc/collectd.conf
选择自己需要的插件
启动 systemctl start collectd
启动服务
查看数据 若开启了rrdtool
插件就可在/var/lib/collectd/rrd/
目录下看到相应的统计数据
日志存储在/var/log/syslog
主要插件 virt vcpu 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 static int get_vcpu_stats (virDomainPtr domain, unsigned short nr_virt_cpu) { int max_cpus = VIR_NODEINFO_MAXCPUS(nodeinfo); virVcpuInfoPtr vinfo = calloc (nr_virt_cpu, sizeof (*vinfo)); if (vinfo == NULL ) { ERROR(PLUGIN_NAME " plugin: calloc failed." ); return -1 ; } int cpu_map_len = 0 ; unsigned char *cpumaps = NULL ; if (extra_stats & ex_stats_vcpupin) { cpu_map_len = VIR_CPU_MAPLEN(max_cpus); cpumaps = calloc (nr_virt_cpu, cpu_map_len); if (cpumaps == NULL ) { ERROR(PLUGIN_NAME " plugin: calloc failed." ); sfree(vinfo); return -1 ; } } int status = virDomainGetVcpus(domain, vinfo, nr_virt_cpu, cpumaps, cpu_map_len); if (status < 0 ) { ERROR(PLUGIN_NAME " plugin: virDomainGetVcpus failed with status %i." , status); virErrorPtr err = virGetLastError(); if (err->code == VIR_ERR_NO_SUPPORT) { if (extra_stats & ex_stats_vcpu) ERROR(PLUGIN_NAME " plugin: Disabled unsupported ExtraStats selector: vcpu" ); if (extra_stats & ex_stats_vcpupin) ERROR(PLUGIN_NAME " plugin: Disabled unsupported ExtraStats selector: vcpupin" ); extra_stats &= ~(ex_stats_vcpu | ex_stats_vcpupin); } sfree(cpumaps); sfree(vinfo); return -1 ; } for (int i = 0 ; i < nr_virt_cpu; ++i) { if (extra_stats & ex_stats_vcpu) vcpu_submit(vinfo[i].cpuTime, domain, vinfo[i].number, "virt_vcpu" ); if (extra_stats & ex_stats_vcpupin) vcpu_pin_submit(domain, max_cpus, i, cpumaps, cpu_map_len); } sfree(cpumaps); sfree(vinfo); return 0 ; }
1 2 3 4 5 6 7 static void vcpu_submit (derive_t value, virDomainPtr dom, int vcpu_nr, const char *type) { char type_instance[DATA_MAX_NAME_LEN]; ssnprintf(type_instance, sizeof (type_instance), "%d" , vcpu_nr); submit(dom, type, type_instance, &(value_t ){.derive = value}, 1 ); }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 static void submit (virDomainPtr dom, char const *type, char const *type_instance, value_t *values, size_t values_len) { value_list_t vl = VALUE_LIST_INIT; init_value_list(&vl, dom); vl.values = values; vl.values_len = values_len; sstrncpy(vl.type, type, sizeof (vl.type)); if (type_instance != NULL ) sstrncpy(vl.type_instance, type_instance, sizeof (vl.type_instance)); plugin_dispatch_values(&vl); }
CPU时间是指中央处理器(CPU)用于执行特定进程或线程的时间量
虚拟机使用的CPU时间除以宿主机的总CPU时间
总CPU时间分为用户空间时间、内核空间时间、空闲时间等
cpu FAQ idle的时候cpu在做什么?
节能:一些现代操作系统和处理器支持节能功能,当 CPU 处于空闲状态时,可以降低 CPU 的频率或进入低功耗模式,以节省能源和降低发热。
调度决策:操作系统可以使用空闲时间来评估当前的任务队列,并决定下一个要执行的任务,以优化系统的性能和响应能力。
维护任务:操作系统可以利用空闲时间来执行一些后台维护任务,如内存回收、文件系统清理等。