[toc]

简介

collectd 是一个后台监控程序,用来采集其所运行系统上的系统信息,并提供各种存储方式来存储为不同值的格式,例如 RRD 文件形式、文本格式、MongoDB 等等

连接官网文档下载地址源码地址

优点

  1. C语言编写,性能好,跨平台能力强
  2. 插件丰富,方便扩充

缺点

  1. 监控简单
  2. 不能直接生成图形

使用

配置

修改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在做什么?

  1. 节能:一些现代操作系统和处理器支持节能功能,当 CPU 处于空闲状态时,可以降低 CPU 的频率或进入低功耗模式,以节省能源和降低发热。
  2. 调度决策:操作系统可以使用空闲时间来评估当前的任务队列,并决定下一个要执行的任务,以优化系统的性能和响应能力。
  3. 维护任务:操作系统可以利用空闲时间来执行一些后台维护任务,如内存回收、文件系统清理等。