要降低syslog写入磁盘频率,需关闭强制同步($actionfileenablesync off)、设置64kb缓冲区($actionfilebuffersize 64k)与1秒刷盘间隔($actionfileflushinterval 1000),并配置异步内存队列($actionqueuetype linkedlist)及精简日志模板。

要降低 Syslog 写入磁盘的频率,核心是让日志先在内存中积攒、批量落盘,而不是每来一条就写一次。这能显著减少 I/O 次数,尤其对 SSD 延长寿命、缓解碎片很关键。
关闭强制同步(fsync)
默认情况下,rsyslog 的 omfile 会在每次写入后执行 fsync(),确保数据立即落盘——这对可靠性有利,但代价是高频小写。生产环境通常可接受短暂缓存风险,应主动关闭:
- 在 /etc/rsyslog.d/50-optim.conf 中添加:
$ActionFileEnableSync off - 该设置适用于所有后续文件输出规则,禁用后写入仅进入内核页缓存,由系统统一调度刷盘。
启用大容量内存缓冲区
缓冲区太小起不到聚合效果,太大会占用过多内存。64KB 是兼顾吞吐与资源的常用值:
- 添加配置:
$ActionFileBufferSize 64k - 配合 $ActionFileFlushInterval 1000(单位毫秒),表示缓冲区满或每秒至少刷盘一次,避免日志滞留过久。
- 注意:此缓冲作用于每个输出文件独立生效,不是全局共享缓冲池。
搭配队列类型提升稳定性
单纯靠内存缓冲不够应对突发流量,需结合队列机制防丢日志:
- 使用异步内存队列:
$ActionQueueType LinkedList
$ActionQueueFileName srvfw
$ActionResumeRetryCount -1 - 若担心内存溢出,可启用磁盘后备缓冲(disk buffer),但会引入额外磁盘开销,建议仅在日志峰值波动极大时启用。
模板精简减少单条日志体积
日志越短,同等缓冲区能容纳越多条目,批量写入效率越高:
- 避免动态长度字段(如未截断的 traceID、完整堆栈);
- 使用固定宽度模板,例如:
$template CompactLog,"%timestamp:::date-rfc3339% %hostname% %syslogtag:1:32% %msg%\n" - 去掉冗余空格、禁用 JSON 格式输出(除非解析端强依赖)。











