Collectd 配置参数详解
逐段实测讲解 collectd.conf 配置:全局段(Interval/Hostname/TypesDB/LoadPlugin 机制)与 cpu/memory/load/disk/interface/df/processes/rrdtool/unixsock/write_graphite/write_http 核心插件参数,含转发链路端到端验证回显。
Collectd 配置参数详解
目标:把 collectd.conf 的全局参数与核心插件参数逐段讲透,每个参数配实测验证(配置变更 → 重启 → 落盘/转发回显对照)。已在 Ubuntu 22.04 服务器(collectd 5.12.0-10ubuntu0.1)逐项实测通过。
一、环境信息
- 操作系统:Ubuntu 22.04 LTS(jammy),amd64 架构
- collectd 版本:5.12.0-10ubuntu0.1(apt 安装,安装步骤见《Ubuntu 22.04 安装 Collectd 指南》)
- 主配置文件:/etc/collectd/collectd.conf(36 KB 注释模板,本机实查)
- 配置片段目录:/etc/collectd/collectd.conf.d/(含 filters.conf、thresholds.conf)
- 插件目录:/usr/lib/collectd/(152 个 .so 文件)
- TypesDB:/usr/share/collectd/types.db
- 数据目录:/var/lib/collectd/rrd/(rrdtool 插件默认输出)
- 转发验证接收端:内网另一台服务器 receiver-server(TCP 2003 接收 Graphite 明文、HTTP 8080 接收 JSON POST)
💡 说明:本文所有「实测」的固定套路是——修改 /etc/collectd/collectd.conf 对应段落 →
collectd -t语法自检 →systemctl restart collectd→ 用 RRD 文件清单、journalctl日志或接收端日志验证配置真实生效。逐项改动的验证结论均来自本机。
二、前置条件
- 已按《Ubuntu 22.04 安装 Collectd 指南》装好 collectd 并能
systemctl is-active collectd返回 active; - 会用编辑器修改 /etc/collectd/collectd.conf 并执行
systemctl restart collectd; - 了解 RRD 落盘验证方式:
ls /var/lib/collectd/rrd/<主机名>/; - 5.11/5.12 节的转发实测需要一台可达的接收端(Graphite/Carbon 或任意 TCP/HTTP 接收器),没有接收端时可先跳过,配置语法与参数说明不受影响。
三、参数查看与修改方式
配置全在一个主文件里,先看「当前实际生效了什么」。Ubuntu 模板 90% 是注释,用下面命令看生效行:
# 查看主配置实际生效行(去注释去空行)
grep -vE '^\s*(#|$)' /etc/collectd/collectd.conf | head -20
实测回显(输出节选,实测首部):
FQDNLookup true
LoadPlugin syslog
<Plugin syslog>
LogLevel info
</Plugin>
LoadPlugin battery
LoadPlugin cpu
LoadPlugin df
LoadPlugin disk
LoadPlugin entropy
LoadPlugin interface
LoadPlugin irq
LoadPlugin load
LoadPlugin memory
LoadPlugin processes
LoadPlugin rrdtool
LoadPlugin swap
LoadPlugin users
语法四要素:
- 全局指令:
指令 值形式,如Interval 10、Hostname "web01",作用于守护进程本体; - 插件加载:
LoadPlugin 名字,对应 /usr/lib/collectd/名字.so; - 插件配置块:
<Plugin 名字> ... </Plugin>,内部是该插件专属选项; - Include 引入:
Include "/etc/collectd/collectd.conf.d"+Filter "*.conf",把片段文件并入主配置。Ubuntu 模板末尾自带:
<Include "/etc/collectd/collectd.conf.d">
Filter "*.conf"
</Include>
# 查看片段目录内容
ls /etc/collectd/collectd.conf.d/
实测回显:
filters.conf
thresholds.conf
修改后必经两步:语法自检 + 重启。
# 语法自检(无输出、退出码 0 即通过)
collectd -t
echo $?
# 重启生效
systemctl restart collectd
实测回显:
0
⚠️ 注意:
collectd -t只查语法结构,查不出「插件不存在」「TypesDB 路径错误」这类运行期问题(实测证据见本文 7.1/7.2)。改配置后的最终确认一定是重启 + 看日志/数据。
四、参数总览
collectd.conf 全局段主要指令一览(默认值来自 collectd -h 内置默认与 man collectd.conf,5.12.0):
| 指令 | 默认值 | 作用 |
|---|---|---|
| Hostname | 自动探测(FQDN) | 指标五元组里的 host 字段,RRD 一级目录名 |
| FQDNLookup | false(Ubuntu 模板设 true) | 是否用 FQDN 反解作为主机名 |
| Interval | 10(秒) | 全局采集间隔,可被插件级覆盖 |
| MaxReadInterval | 86400(秒) | 读插件单次 read 的最大间隔上限 |
| Timeout | 2 | 读回调允许的超时间隔数(超过视为缺失) |
| ReadThreads | 5 | 读线程数 |
| WriteThreads | 5 | 写线程数 |
| WriteQueueLimitHigh | 120000 | 写队列高水位条数(超过丢弃) |
| WriteQueueLimitLow | 1200000 | 写队列低水位条数(超过随机丢弃) |
| BaseDir | /var/lib/collectd | 数据根目录 |
| PIDFile | /var/run/collectd.pid | PID 文件路径 |
| PluginDir | /usr/lib/collectd | 插件 .so 搜索目录 |
| TypesDB | /usr/share/collectd/types.db | 类型字典文件,可多行多个 |
| AutoLoadPlugin | false | 是否按插件块自动隐式 LoadPlugin |
| Include | 无 | 引入外部配置片段 |
表解读:日常调得最多的是 Interval(采样粒度)与 Hostname(数据归属);ReadThreads/WriteThreads/WriteQueueLimit* 在大规模转发场景才需要动;AutoLoadPlugin 是配置写法的糖,不建议开(失去 LoadPlugin 的显式清单)。
指标数据的「身份」由五元组构成:host/plugin/plugin_instance/type/type_instance。例如 collectd-server/cpu-2/cpu-idle 表示主机 collectd-server 上 cpu 插件第 3 颗逻辑核的 idle 状态。plugin_instance 与 type_instance 是否存在取决于插件配置(如 cpu 的 ReportByCpu、processes 的 Process)——这正是各插件参数操纵的对象。
五、核心参数分类详解
5.1 全局段:Interval 与 Hostname
Interval 决定采集节奏,是 collectd 最核心的全局参数。实测验证:把 #Interval 10 改为生效的 Interval 5,重启后观察 RRD 文件的修改时间步进。
# /etc/collectd/collectd.conf
Interval 5
# 用 mtime 步进验证采集节奏
systemctl restart collectd
S1=$(stat -c %Y /var/lib/collectd/rrd/collectd-server/load/load.rrd)
sleep 6
S2=$(stat -c %Y /var/lib/collectd/rrd/collectd-server/load/load.rrd)
echo "stat_delta=$((S2-S1))s"
实测回显:
stat_delta=5s
改回默认 #Interval 10(注释掉)后同法实测 stat_delta=10s。RRD 文件头也可佐证:
# RRD 步长与全局 Interval 对应
rrdtool info /var/lib/collectd/rrd/collectd-server/load/load.rrd | head -6
实测回显:
filename = "/var/lib/collectd/rrd/collectd-server/load/load.rrd"
rrd_version = "0003"
step = 10
last_update = 1793371640
header_size = 6360
ds[shortterm].index = 0
Hostname 决定数据归属:五元组 host 字段 + RRD 一级目录名。本机目录 /var/lib/collectd/rrd/collectd-server/ 即来自主机名(Ubuntu 模板 FQDNLookup true)。生产建议显式写死:
Hostname "web01"
这样主机名/反解变化不再影响数据连续性。⚠️ 改 Hostname 重启后 rrdtool 会在新目录重新建文件,旧目录保留(见 7.4)。
5.2 日志插件:syslog 与 logfile
日志插件决定 collectd 的日志去向,二者选其一为主。Ubuntu 默认用 syslog(日志进 journald,用 journalctl -u collectd 查看)。改用文件日志:
LoadPlugin logfile
<Plugin logfile>
LogLevel info
File "/var/log/collectd.log"
Timestamp true
</Plugin>
参数说明:LogLevel 取 debug/info/notice/warning/err(info 能看到每个插件的 plugin_load 记录);File 是日志文件路径;Timestamp true 在每行前加时间戳。重启后验证:
# 查看文件日志
tail -3 /var/log/collectd.log
实测回显:
[2026-10-30 14:47:26] Systemd detected, trying to signal readiness.
[2026-10-30 14:47:26] Initialization complete, entering read-loop.
[2026-10-30 14:47:26] unixsock plugin: No such group: `collectd'
💡 技术拓展:collectd 的日志输出插件不止这两个——logfile(文件)、syslog(系统日志)之外还有 log_logstash(JSON 行格式,便于接 ELK 采集)。本文采用默认 syslog + 临时 logfile 双轨验证,理由:syslog 与 systemd 生态零配置,logfile 便于直接
tail教学演示。
5.3 cpu 插件:ReportByCpu
cpu 插件采集每颗逻辑核的使用分布(user/system/wait/idle 等)。ReportByCpu 控制是否逐核上报(5.12 默认 true,逐核目录 cpu-0..cpu-N):
<Plugin cpu>
ReportByCpu false
</Plugin>
重启后 RRD 目录变化(由逐核聚合为单目录):
ls /var/lib/collectd/rrd/collectd-server/ | grep '^cpu'
实测回显(改动前 6 颗逻辑核):
cpu-0
cpu-1
cpu-2
cpu-3
cpu-4
cpu-5
实测回显(改动后新增聚合目录 cpu):
cpu
cpu-0
cpu-1
cpu-2
cpu-3
cpu-4
cpu-5
cpu 目录即聚合后的整机数据;cpu-0..cpu-5 变成陈旧文件(不再更新)。其他常用参数:ReportByState true(按 user/system/idle 等状态分别出 DS,默认 true)、ValuesPercentage true(额外产出 percent 系列,与 5.4 memory 的用法一致)、ReportNumCpu true(额外上报核数)。改聚合方式会产生新旧两套 RRD 并存,见 7.4 FAQ。
5.4 memory 插件:ValuesPercentage
memory 插件默认上报绝对字节(memory-free/used/buffered/cached/slab_recl/slab_unrecl 六个 DS)。ValuesPercentage 让它同时产出百分比形态:
<Plugin memory>
ValuesPercentage true
</Plugin>
重启后验证:
ls /var/lib/collectd/rrd/collectd-server/memory/
实测回显:
memory-buffered.rrd
memory-cached.rrd
memory-free.rrd
memory-slab_recl.rrd
memory-slab_unrecl.rrd
memory-used.rrd
percent-buffered.rrd
percent-cached.rrd
percent-free.rrd
percent-slab_recl.rrd
percent-slab_unrecl.rrd
percent-used.rrd
percent-*.rrd 六个新文件即百分比指标(type 为 percent,取值 0~100)。同族参数:ValuesAbsolute true(默认 true,字节形态)。只想要百分比时可设 ValuesAbsolute false。
5.5 load 插件
load 插件零参数可用,产出 shortterm/midterm/longterm 三个 GAUGE(1/5/15 分钟负载)。配置只有一行:
LoadPlugin load
值可直接通过 unixsock 实查(插件配置见 5.10):
collectdctl -s /var/run/collectd-unixsock getval collectd-server/load/load
实测回显:
shortterm=1.732422e+00
midterm=1.896484e+00
longterm=1.704590e+00
5.6 disk 插件:Disk 与 IgnoreSelected
disk 插件默认采集全部块设备(含 loop 虚拟设备)。Disk 指定设备名,配 IgnoreSelected false(默认)表示「只采所选」;IgnoreSelected true 则反转为「排除所选」:
<Plugin disk>
Disk "sda"
Disk "/dev/vd[a-z]"
IgnoreSelected false
</Plugin>
实测验证「只采 sda」:
systemctl restart collectd
stat -c "%y %n" /var/lib/collectd/rrd/collectd-server/disk-sda/disk_octets.rrd /var/lib/collectd/rrd/collectd-server/disk-loop2/disk_octets.rrd
实测回显(第一行时间持续前进=活跃采集,第二行冻结=已停止采集):
14:40:48 /var/lib/collectd/rrd/collectd-server/disk-sda/disk_octets.rrd
14:40:06 /var/lib/collectd/rrd/collectd-server/disk-loop2/disk_octets.rrd
要点:
Disk支持设备名或正则(正则按完整路径匹配,如/dev/vd[a-z]);Disk可重复多次;是否「包含/排除」由IgnoreSelected决定;- 选择性采集不删旧 RRD,只是不再写入(7.4);
- sda 的分区(sda1/sda2)作为独立 disk-sda1/disk-sda2 目录存在;只想看整盘就显式列出。
5.7 interface 插件:Interface 与 IgnoreSelected
用法与 disk 完全同构,对象换成网卡:
<Plugin interface>
Interface "eth0"
IgnoreSelected false
</Plugin>
重启后 ls /var/lib/collectd/rrd/collectd-server/ | grep '^interface' 实测回显(eth0 活跃、lo 冻结):
interface-eth0
interface-lo
不配置时默认采集所有网卡(含 lo 回环)。服务器只关心外网流量时,明确 Interface "eth0" 可把 RRD 数量与写盘量砍半。
5.8 df 插件:文件系统采集与默认排除清单
df 插件采集文件系统用量(df_complex-free/reserved/used)。Ubuntu 默认配置用一串 FSType + IgnoreSelected true 排除虚拟文件系统,防止 rootfs 重复上报刷错误日志:
<Plugin df>
# ignore rootfs; else, the root file-system would appear twice, causing
# one of the updates to fail and spam the log
FSType rootfs
FSType sysfs
FSType proc
FSType devtmpfs
FSType devpts
FSType tmpfs
FSType fusectl
FSType cgroup
IgnoreSelected true
</Plugin>
实测效果:只出现真实文件系统与个别小文件(本机目录含 df-root、df-etc-hostname、df-etc-hosts、df-etc-resolv.conf):
ls /var/lib/collectd/rrd/collectd-server/ | grep '^df-'
实测回显:
df-etc-hostname
df-etc-hosts
df-etc-resolv.conf
df-root
参数要点:MountPoint "/mnt/data" 按挂载点选择(可重复)、FSType ext4 按文件系统类型选择、IgnoreSelected true 排除所选 / false 只采所选、ValuesPercentage true 产出 percent 系列。⚠️ 保留注释里那几个 FSType 排除项——漏掉 rootfs 排除会让根文件系统同时以两个身份上报,触发写冲突。
5.9 processes 插件:Process 进程匹配
processes 插件默认上报整机进程状态统计(ps_state-running/sleeping/zombies 等 + fork_rate)。Process 把指定进程名单独建档:
<Plugin processes>
Process "collectd"
</Plugin>
重启后用 unixsock 看新出现的标识:
collectdctl -s /var/run/collectd-unixsock listval | grep processes-collectd
实测回显:
collectd-server/processes-collectd/disk_octets
collectd-server/processes-collectd/io_octets
collectd-server/processes-collectd/io_ops
collectd-server/processes-collectd/ps_code
collectd-server/processes-collectd/ps_count
collectd-server/processes-collectd/ps_cputime
collectd-server/processes-collectd/ps_data
collectd-server/processes-collectd/ps_pagefaults
collectd-server/processes-collectd/ps_rss
collectd-server/processes-collectd/ps_stacksize
collectd-server/processes-collectd/ps_vm
注意目录名是 processes-collectd(插件-插件实例),不是 processes/ 下的新文件——per-process 指标(CPU 时间 ps_cputime、内存 ps_rss/vm、句柄 disk_octets 等)以独立的 plugin_instance 命名空间存在。ProcessMatch "name" "正则" 可按命令行正则归组。原目录里的整机统计不变:
ls /var/lib/collectd/rrd/collectd-server/processes/
实测回显:
fork_rate.rrd
ps_state-blocked.rrd
ps_state-paging.rrd
ps_state-running.rrd
ps_state-sleeping.rrd
ps_state-stopped.rrd
ps_state-zombies.rrd
5.10 unixsock 插件:SocketFile/SocketGroup/SocketPerms
unixsock 插件开启本地控制套接字,是 collectdctl/collectd-nagios 的服务端前提:
LoadPlugin unixsock
<Plugin unixsock>
SocketFile "/var/run/collectd-unixsock"
SocketPerms "0660"
</Plugin>
参数说明:SocketFile 套接字路径(默认 /var/run/collectd-unixsock);SocketGroup 套接字属组(默认 collectd 组,本机没有该组则告警回退,见实测回显);SocketPerms 权限位(默认 0770)。重启验证:
ls -la /var/run/collectd-unixsock
实测回显:
srw-rw---- 1 root root 0 Oct 30 14:41 /var/run/collectd-unixsock
journalctl -u collectd --no-pager -n 30 -o cat | grep unixsock
实测回显:
unixsock plugin: No such group: `collectd'
⚠️ 注意:默认
SocketGroup "collectd"要求系统存在 collectd 用户组;没有时出现上面这行告警,套接字以 root:root 创建,服务继续运行。需要非 root 用户访问套接字时,先groupadd collectd+chgrp collectd /var/run/collectd-unixsock或显式SocketGroup指向已有组。
5.11 rrdtool 插件:数据落盘参数
rrdtool 插件把指标写成 RRD 环形库文件,是 Ubuntu 默认的输出插件:
<Plugin rrdtool>
DataDir "/var/lib/collectd/rrd"
StepSize 10
HeartBeat 20
RRARows 1200
RRATimespan 3600
RRATimespan 86400
RRATimespan 604800
CacheTimeout 120
CacheFlush 900
WritesPerSecond 50
</Plugin>
参数说明(默认值以 man collectd.conf 为准):
DataDir:RRD 根目录,与全局 BaseDir 下的 rrd 子目录一致;StepSize:RRD 步长(秒),应与全局 Interval 一致——不配时自动取 Interval;HeartBeat:超过该秒数没有新值即记 NaN,默认两倍步长(10 秒间隔 → 20 秒心跳,rrdtool info 实查minimal_heartbeat = 20);RRARows × RRATimespan:每个归档窗口的行数与跨度,决定历史保留时长与分辨率;CacheTimeout/CacheFlush:内存缓存写盘节奏——缓存可把多条更新合并写入,降低 IO,代价是宕机丢缓存窗口;WritesPerSecond:写盘限速,保护慢盘。
实测佐证(默认配置下的 RRD 头):
rrdtool info /var/lib/collectd/rrd/collectd-server/load/load.rrd | head -10
实测回显:
filename = "/var/lib/collectd/rrd/collectd-server/load/load.rrd"
rrd_version = "0003"
step = 10
last_update = 1793371640
header_size = 6360
ds[shortterm].index = 0
ds[shortterm].type = "GAUGE"
ds[shortterm].minimal_heartbeat = 20
ds[shortterm].min = 0.0000000000e+00
ds[shortterm].max = 5.0000000000e+03
⚠️ 注意:改 StepSize/RRARows 只对「新建的 RRD」生效,存量文件结构不变;需要统一时清空 DataDir 让 collectd 重建(历史数据会丢)。
5.12 write_graphite 插件:转发 Graphite/Carbon(实测)
write_graphite 用 TCP 明文协议把指标推给 Graphite 的 Carbon 组件(或其他兼容 TCP 明文行协议的接收端):
LoadPlugin write_graphite
<Plugin write_graphite>
<Node "graphite">
Host "receiver-server"
Port "2003"
Protocol "tcp"
Prefix "collectd."
</Node>
</Plugin>
参数说明:<Node "名"> 定义一个转发目标,可配多个;Host/Port/Protocol 目标地址(协议 tcp/udp);Prefix/Postfix 给指标名加前后缀(Prefix "collectd." 让 Graphite 树里集中收拢);StoreRates true(默认,把 DERIVE/COUNTER 换算成速率再发)、SeparateInstances false(默认,实例并入路径)、EscapeCharacter "_"(特殊字符替换符)。
重启后接收端日志(实测,接收端每行打印 [时间] 来源IP -> 指标名 值 时间戳):
[graphite 14:41:15] 10.89.59.2 -> collectd.collectd-server.processes.ps_state-zombies 0 1793371276
[graphite 14:41:15] 10.89.59.2 -> collectd.collectd-server.processes.fork_rate 9.907707 1793371276
[graphite 14:41:15] 10.89.59.2 -> collectd.collectd-server.processes.ps_state-stopped 0 1793371276
[graphite 14:41:15] 10.89.59.2 -> collectd.collectd-server.cpu.percent-system 3.30103465265232 1793371276
[graphite 14:41:15] 10.89.59.2 -> collectd.collectd-server.cpu.percent-user 21.0872064378387 1793371276
[graphite 14:41:15] 10.89.59.2 -> collectd.collectd-server.cpu.percent-wait 0.0328461159467893 1793371276
[graphite 14:41:15] 10.89.59.2 -> collectd.collectd-server.cpu.percent-nice 0 1793371276
[graphite 14:41:15] 10.89.59.2 -> collectd.collectd-server.cpu.percent-interrupt 0 1793371276
[graphite 14:41:15] 10.89.59.2 -> collectd.collectd-server.cpu.percent-softirq 3.66234192806701 1793371276
[graphite 14:41:15] 10.89.59.2 -> collectd.collectd-server.cpu.percent-steal 0 1793371276
[graphite 14:41:15] 10.89.59.2 -> collectd.collectd-server.cpu.percent-idle 71.9165708654952 1793371276
[graphite 14:41:15] 10.89.59.2 -> collectd.collectd-server.swap.swap-used 2493136896 1793371276
(输出节选:完整流包含 processes/irq/memory 等全部插件指标,每 Interval 一批。)
路径结构 collectd.<host>.<plugin>[.<plugin_instance>].<type>[.<type_instance>] 由五元组 + Prefix 拼接而成。目标不可达时服务不会崩,只在日志里刷 DNS/连接错误(实测错误样例见《Collectd 常用 CLI 命令与排障详解》篇第六章)。
5.13 write_http 插件:HTTP POST 转发(实测)
write_http 把指标打成 JSON 批量 POST 到 HTTP 接收端(自研网关、KairosDB 等常用):
LoadPlugin write_http
<Plugin write_http>
<URL "http://receiver-server:8080/collectd-post">
Format "JSON"
</URL>
</Plugin>
参数说明:<URL "…"> 定义一个 HTTP 目标(可多个);Format 取 JSON 或 KairosDB;同族参数 VerifyPeer/VerifyHost/CACert 控制 HTTPS 证书校验,Header "X-Auth-Token: mytoken123" 可加认证头。重启后接收端收到的 POST(实测):
POST /collectd-post HTTP/1.1 body=[{"values":[0],"dstypes":["derive"],"dsnames":["value"],"time":1793371285.799,"interval":10.000,"host":"collectd-server","plugin":"irq","plugin_instance":"","type":"irq","type_instance":"54"},{"values":[8271413248],"dstypes":["gauge"],"dsnames":["value"],"time":1793371285.799,"interval":10.000,"host":"collectd-server","plugin":"memory","plugin_instance":"","type":"memory","type_instance":"used"}]
(输出节选:单次 POST 批量携带多条指标,字段完整保留五元组、interval 与原始时间戳。)
JSON 里 dstypes 的 derive/gauge 区分计数器与瞬时值——正是 5.12 的 StoreRates 在 JSON 格式下的换算依据。
六、生产配置模板
一台 4C8G 的 Ubuntu 22.04 应用服务器、本地 RRD 落盘 + 转发 Graphite 的推荐模板(配置片段,按需取舍):
# ===== 全局 =====
Hostname "app01" # 固定主机名,防反解漂移
Interval 10 # 10 秒粒度,主机监控通用值
Timeout 2
ReadThreads 5
# ===== 日志 =====
LoadPlugin syslog
<Plugin syslog>
LogLevel info
</Plugin>
# ===== 系统指标 =====
LoadPlugin cpu
LoadPlugin memory
LoadPlugin load
LoadPlugin interface
LoadPlugin disk
LoadPlugin df
LoadPlugin processes
<Plugin disk>
Disk "sda" # 只采系统盘,排除 loop 设备
IgnoreSelected false
</Plugin>
<Plugin interface>
Interface "eth0"
IgnoreSelected false
</Plugin>
<Plugin memory>
ValuesPercentage true # 同时产出百分比,方便面板
</Plugin>
# ===== 本地落盘 =====
LoadPlugin rrdtool
<Plugin rrdtool>
DataDir "/var/lib/collectd/rrd"
CacheTimeout 120
CacheFlush 900
</Plugin>
# ===== 转发 Graphite =====
LoadPlugin write_graphite
<Plugin write_graphite>
<Node "graphite">
Host "graphite.internal"
Port "2003"
Protocol "tcp"
Prefix "collectd."
</Node>
</Plugin>
# ===== 本地运维工具面 =====
LoadPlugin unixsock
<Plugin unixsock>
SocketFile "/var/run/collectd-unixsock"
SocketPerms "0660"
</Plugin>
适用场景说明:2C4G 及以下小内存机器把 Interval 放宽到 30、去掉 write_* 转发可显著降低 IO;转发场景磁盘压力小(rrdtool 只做本地双保险),CacheTimeout/CacheFlush 保持默认即可。修改任何一段后:collectd -t → systemctl restart collectd → journalctl -u collectd -o cat | tail -20 三步走。
七、常见问题(FAQ)
7.1 为什么 collectd -t 全绿,启动却失败?
-t 只解析语法,不加载插件。实测:配置写入 LoadPlugin foobarbaz(不存在的插件),collectd -t 退出码 0 无输出;实际启动时才报:
plugin_load: Could not find plugin "foobarbaz" in /usr/lib/collectd
Error: Parsing the config file failed!
结论:插件名拼写检查要靠启动日志,改配置后必须重启并看 journalctl。
7.2 全局选项拼错了会报错吗?
实测不会。把 Interval 误写成 IntervalX 10,前台启动全程无警告,Initialization complete, entering read-loop. 照常出现——未知全局选项被静默忽略,实际仍用默认值 10 秒。这是隐蔽的坑:改了参数「没生效」先检查拼写,用 5.1 节的 mtime 步进法验证真实间隔。
7.3 TypesDB 文件路径写错会怎样?
启动时告警但服务继续(实测回显):
Failed to open types database `/usr/share/collectd/types_missing.db': No such file or directory.
Failed to open types database `/usr/share/collectd/types_missing.db': No such file or directory
Initialization complete, entering read-loop.
后果是所有插件上报值因「类型不在字典」被丢弃——服务活着但零数据。TypesDB 改动后务必用 collectdctl ... listval 确认有值进来。
7.4 改了插件选择/聚合方式,旧 RRD 目录怎么办?
保留但冻结。实测两例:cpu 从逐核改聚合后新增 cpu/ 目录、cpu-0..5 不再更新;disk 加 Disk "sda" 后 loop 设备目录 mtime 停在重启时刻。RRD 是环形文件不能改名复用,清理陈旧目录需要手工确认后删除。
7.5 write_graphite 目标挂了会怎样?
服务不崩,持续在日志刷解析/连接错误(实测:目标改为不存在的域名 nosuchhost.invalid 后):
write_graphite plugin: getaddrinfo (nosuchhost.invalid, 2003, tcp) failed: Name or service not known
systemctl is-active 仍为 active。监控 collectd 自身健康要看日志关键词,不能只看服务状态。
7.6 df 插件刷「Value too old」类写冲突?
根文件系统被重复上报时(如把 rootfs 从排除清单删掉),同一 RRD 文件被两个身份交替写入,时间戳回跳触发 rrdtool 拒写。保留默认配置里 FSType rootfs 等 8 行排除项即可避免。
八、参考链接
- collectd.conf 手册(全部指令权威定义):https://collectd.org/documentation.shtml
- 插件 Wiki(各插件专属参数):https://collectd.org/wiki/index.php/Table_of_Plugins
- collectd 官网:https://collectd.org/
- 本专栏姊妹篇:《Ubuntu 22.04 安装 Collectd 指南》、《Collectd 常用 CLI 命令与排障详解》、《Collectd 介绍与选型指南》