Collectd 配置参数详解

逐段实测讲解 collectd.conf 配置:全局段(Interval/Hostname/TypesDB/LoadPlugin 机制)与 cpu/memory/load/disk/interface/df/processes/rrdtool/unixsock/write_graphite/write_http 核心插件参数,含转发链路端到端验证回显。

CollectdCollectd监控可观测性2026/10/30

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 日志或接收端日志验证配置真实生效。逐项改动的验证结论均来自本机。

二、前置条件

  1. 已按《Ubuntu 22.04 安装 Collectd 指南》装好 collectd 并能 systemctl is-active collectd 返回 active;
  2. 会用编辑器修改 /etc/collectd/collectd.conf 并执行 systemctl restart collectd;
  3. 了解 RRD 落盘验证方式:ls /var/lib/collectd/rrd/<主机名>/;
  4. 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

语法四要素:

  1. 全局指令:指令 值 形式,如 Interval 10、Hostname "web01",作用于守护进程本体;
  2. 插件加载:LoadPlugin 名字,对应 /usr/lib/collectd/名字.so;
  3. 插件配置块:<Plugin 名字> ... </Plugin>,内部是该插件专属选项;
  4. 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 一级目录名
FQDNLookupfalse(Ubuntu 模板设 true)是否用 FQDN 反解作为主机名
Interval10(秒)全局采集间隔,可被插件级覆盖
MaxReadInterval86400(秒)读插件单次 read 的最大间隔上限
Timeout2读回调允许的超时间隔数(超过视为缺失)
ReadThreads5读线程数
WriteThreads5写线程数
WriteQueueLimitHigh120000写队列高水位条数(超过丢弃)
WriteQueueLimitLow1200000写队列低水位条数(超过随机丢弃)
BaseDir/var/lib/collectd数据根目录
PIDFile/var/run/collectd.pidPID 文件路径
PluginDir/usr/lib/collectd插件 .so 搜索目录
TypesDB/usr/share/collectd/types.db类型字典文件,可多行多个
AutoLoadPluginfalse是否按插件块自动隐式 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

要点:

  1. Disk 支持设备名或正则(正则按完整路径匹配,如 /dev/vd[a-z]);
  2. Disk 可重复多次;是否「包含/排除」由 IgnoreSelected 决定;
  3. 选择性采集不删旧 RRD,只是不再写入(7.4);
  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 为准):

  1. DataDir:RRD 根目录,与全局 BaseDir 下的 rrd 子目录一致;
  2. StepSize:RRD 步长(秒),应与全局 Interval 一致——不配时自动取 Interval;
  3. HeartBeat:超过该秒数没有新值即记 NaN,默认两倍步长(10 秒间隔 → 20 秒心跳,rrdtool info 实查 minimal_heartbeat = 20);
  4. RRARows × RRATimespan:每个归档窗口的行数与跨度,决定历史保留时长与分辨率;
  5. CacheTimeout/CacheFlush:内存缓存写盘节奏——缓存可把多条更新合并写入,降低 IO,代价是宕机丢缓存窗口;
  6. 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 行排除项即可避免。

八、参考链接