Redis如何监控持久化导致的延迟_开启latency-monitor追踪fsync耗时

冬瑶君_3732

冬瑶君_3732

2026-03-22

312人浏览

原创

Redis latency-monitor 能抓到 fsync 延迟,但需手动启用 latency:fsync 事件并设置合理阈值;仅主线程 AOF append 的 fsync 可被监控,RDB/AOF rewrite 子进程的 fsync 不计入;延迟高未必磁盘忙,可能受文件系统、脏页策略或容器 SELinux 标签影响。

redis如何监控持久化导致的延迟_开启latency-monitor追踪fsync耗时

Redis latency-monitor 能不能直接抓到 fsync 延迟

能,但得配对用——latency-monitor 本身不区分延迟来源,它只记录事件耗时;真正把 fsync 拉进监控视野的,是 latency-monitor-threshold 配合 latency monitor 的事件类型识别。默认它不监控 fsync,必须手动开启对应事件。

  • latency-monitor-threshold 设太低(比如 1ms),会高频打点,影响性能;设太高(比如 100ms),fsync 慢了你也收不到告警
  • Redis 6+ 默认开启 latency:command 和 latency:slowlog,但 latency:fork 和 latency:fsync 是关闭的,要显式启用
  • 启用方式不是改配置文件就完事——得用 CONFIG SET 同时打开阈值和事件:先 CONFIG SET latency-monitor-threshold 5,再 CONFIG SET latency-events "command,fsync"

怎么确认 fsync 真的被 latency-monitor 捕获到了

靠 LATENCY LATEST 和 LATENCY HISTORY fsync。前者只返回最近一次超阈值的 fsync 记录,后者能看过去 128 条(固定长度),适合排查偶发卡顿。

  • 如果 LATENCY HISTORY fsync 返回空,说明要么没触发超阈值,要么 fsync 事件根本没开——检查 CONFIG GET latency-events 输出里有没有 fsync
  • 注意:RDB 快照期间的 fsync 来自子进程,AOF rewrite 期间的 fsync 也来自子进程,但 latency-monitor 只在主线程上下文记录;所以只有 AOF append 模式下主线程调用的 fsync 才会被捕获(即 appendfsync always 或 everysec 的刷盘时刻)
  • appendfsync no 时,主线程从不调 fsync,LATENCY HISTORY fsync 永远为空——这不是 bug,是设计如此

为什么看到 fsync 延迟高,但磁盘 I/O 并不忙

常见于使用 ext4 + data=ordered 模式、或 XFS + barrier=1 的文件系统,fsync 不仅刷数据,还要等日志提交完成,而日志落盘可能被其他进程阻塞,或受存储设备写缓存策略干扰。

  • Linux 的 vm.dirty_ratio 和 vm.dirty_background_ratio 如果设得过高,内核会攒大量脏页,导致 fsync 时被迫回写,耗时陡增
  • NVMe 盘开启 Write Cache 但未配 barrier,fsync 可能假快真慢——实际数据还在易失缓存里,断电即丢;而 latency-monitor 测到的是系统调用返回时间,不是数据落盘时间
  • 容器环境(如 Docker)挂载卷时用了 :z 或 :Z SELinux 标签,可能引入额外元数据同步开销,也会抬高 fsync 耗时

生产环境开启 fsync 监控要注意什么

别在高峰期临时开,尤其别设 1ms 阈值——latency-monitor 的采样本身有开销,高频触发会挤占主线程 CPU,反而加剧延迟。

  • 建议阈值设为预期 fsync p99 的 1.5 倍,比如实测 p99 是 8ms,就设 latency-monitor-threshold 12
  • 避免在 appendfsync always 场景下长期开启——每条写命令都触发 fsync,采样密度太高,容易掩盖真实毛刺
  • LATENCY RESET fsync 清空历史前,先用 LATENCY GRAPH fsync 看一眼趋势,否则可能漏掉正在发生的持续性升高

fsync 延迟不是独立指标,它和 AOF 缓冲区大小、磁盘调度器、内核版本强耦合——看到异常值,别急着调 Redis,先查 iostat -x 1 和 cat /proc/sys/vm/dirty*。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

2023.08.10

4738

6

append用法
append用法

append是一个常用的命令行工具,用于将一个文件的内容追加到另一个文件的末尾。想了解更多append用法相关内容,可以阅读本专题下面的文章。

2023.10.25

618

4

python中append的用法
python中append的用法

在Python中,append()是列表对象的一个方法,用于向列表末尾添加一个元素。想了解更多append的更多内容,可以阅读本专题下面的文章。

2023.11.14

1496

8

python中append的含义
python中append的含义

本专题整合了python中append的相关内容,阅读专题下面的文章了解更多详细内容。

2025.09.12

3004

8

k8s和docker区别
k8s和docker区别

k8s和docker区别有抽象层次不同、管理范围不同、功能不同、应用程序生命周期管理不同、缩放能力不同、高可用性等等区别。本专题为大家提供k8s和docker区别相关的各种文章、以及下载和课程。

2023.07.24

805

4

docker进入容器的方法有哪些
docker进入容器的方法有哪些

docker进入容器的方法:1. Docker exec;2. Docker attach;3. Docker run --interactive --tty;4. Docker ps -a;5. 使用 Docker Compose。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.08

6619

6

docker容器无法访问外部网络怎么办
docker容器无法访问外部网络怎么办

docker 容器无法访问外部网络的原因和解决方法:配置 nat 端口映射以将容器端口映射到主机端口。根据主机兼容性选择正确的网络驱动(如 host 或 overlay)。允许容器端口通过主机的防火墙。配置容器的正确 dns 服务器。选择正确的容器网络模式。排除主机网络问题,如防火墙或连接问题。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.08

7757

6

docker镜像有什么用
docker镜像有什么用

docker 镜像是预构建的软件组件,用途广泛,包括:应用程序部署:简化部署,提高移植性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.08

3093

7

Docker容器化部署与DevOps实践
Docker容器化部署与DevOps实践

本专题面向后端与运维开发者,系统讲解 Docker 容器化技术在实际项目中的应用。内容涵盖 Docker 镜像构建、容器运行机制、Docker Compose 多服务编排,以及在 DevOps 流程中的持续集成与持续部署实践。通过真实场景演示,帮助开发者实现应用的快速部署、环境一致性与运维自动化。

2026.02.11

339

16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 134.1万人学习