Redis因为开了AOF导致hang住的问题处理
admin
2023-02-07 12:20:03
0

问题描述

业务反馈正常有个接口正常访问在100ms以内,有时候调用时长会要10多s,根据业务提供的时间查redis日志,以现有如下记录:

8788:M 24 Aug 01:21:26.008 * Asynchronous AOF fsync is taking too long (disk is busy?). Writing the AOF buffer without waiting for fsync to complete, this may slow down Redis.
8788:M 24 Aug 01:21:45.006 * Asynchronous AOF fsync is taking too long (disk is busy?). Writing the AOF buffer without waiting for fsync to complete, this may slow down Redis.

查看redis aof相关配置

127.0.0.1:6390> config get *append*
1) "no-appendfsync-on-rewrite"
2) "yes"
3) "appendfsync"
4) "everysec"
5) "appendonly"
6) "yes"


查看rdb的配置:

127.0.0.1:6390> config get save
1) "save"
2) ""

 

 查看redis的版本:

 127.0.0.1:6390> info server
# Server
redis_version:3.2.4

 

故障分析

打开AOF持久化功能后, Redis处理完每个事件后会调用write(2)将变化写入kernel的buffer,如果此时write(2)被阻塞,Redis就不能处理下一个事件。

Linux规定执行write(2)时,如果对同一个文件正在执行fdatasync(2)将kernel buffer写入物理磁盘,或者有system wide sync在执行,write(2)会被Block住,整个Redis被Block住。

如果系统IO繁忙,比如有别的应用在写盘,或者Redis自己在AOF rewrite或RDB snapshot(虽然此时写入的是另一个临时文件,虽然各自都在连续写,但两个文件间的切换使得磁盘磁头的寻道时间加长),就可能导致fdatasync(2)迟迟未能完成从而Block住write(2),Block住整个Redis。

为了更清晰的看到fdatasync(2)的执行时长,可以使用”strace -p (pid of redis server) -T -e -f trace=fdatasync”,但会影响系统性能。

Redis提供了一个自救的方式,当发现文件有在执行fdatasync(2)时,就先不调用write(2),只存在cache里,免得被Block。但如果已经超过两秒都还是这个样子,则会硬着头皮执行write(2),即使redis会被Block住。

此时那句要命的log会打印:“Asynchronous AOF fsync is taking too long (disk is busy?). Writing the AOF buffer without waiting for fsync to complete, this may slow down Redis.”

之后用redis-cli INFO可以看到aof_delayed_fsync的值被加1。

因此,对于fsync设为everysec时丢失数据的可能性的最严谨说法是:如果有fdatasync在长时间的执行,此时redis意外关闭会造成文件里不多于两秒的数据丢失。

如果fdatasync运行正常,redis意外关闭没有影响,只有当操作系统crash时才会造成少于1秒的数据丢失。

 

 

解决方法

方法一:关闭aof

这个方法需要和业务确认是否可行,个人认为如果采用redis主从+sentinel方式的话主节点挂了从节点会自己提升为主点,主节点恢复后全量同步一次数据就可以了,关系也不是太大

方法二:修改系统配置

原来是AOF rewrite时一直埋头的调用write(2),由系统自己去触发sync。在RedHat Enterprise 6里,默认配置vm.dirty_background_ratio=10,也就是占用了10%的可用内存才会开始后台flush,而我的服务器有8G内存。

很明显一次flush太多数据会造成阻塞,所以最后果断设置了sysctl vm.dirty_bytes=33554432(32M),问题解决。

然后提了个issue,AOF rewrite时定时也执行一下fdatasync嘛, antirez回复新版中,AOF rewrite时32M就会重写主动调用fdatasync。

查看一下系统内核参数

>sysctl -a | grep dirty_background_ratio
vm.dirty_background_ratio = 10
>sysctl -a | grep vm.dirty_bytes
vm.dirty_bytes = 0

尝试修改一下配置文件/etc/sysctl.conf,并使配置立即生效

echo "vm.dirty_bytes=33554432" >> /etc/sysctl.conf
sysctl -p

验证修改是否成功

>sysctl -a | grep vm.dirty_bytes
vm.dirty_bytes = 33554432


 参考:

https://ningyu1.github.io/site/post/32-redis-aof/

https://redis.io/topics/latency


相关内容

热门资讯

【第一消息】“西兵互娱真的有挂... 有 亲,根据资深记者爆料西兵互娱是可以开挂的,确实有挂(咨询软件无需打开...
联赢激光申请显示屏加工方法专利... 国家知识产权局信息显示,深圳市联赢激光股份有限公司申请一项名为“显示屏的加工方法、加工设备和显示屏”...
模芯晶半导体取得系统级堆叠结构... 国家知识产权局信息显示,深圳模芯晶半导体有限公司取得一项名为“一种系统级堆叠结构与电子设备”的专利,...
最新引进“众合推扑克真的有挂吗... 网上科普关于“众合推扑克有没有挂”话题很是火热,小编也是针对众合推扑克作*弊开挂的方法以及开挂对应的...
最新引进“先锋炸/金/花有挂吗... 有 亲,根据资深记者爆料先锋炸/金/花是可以开挂的,确实有挂(咨询软件无...
今日重大发现“顺欣茶楼开挂神器... 家人们!今天小编来为大家解答顺欣茶楼透视挂怎么安装这个问题咨询软件客服徽9784099的挂在哪里买很...
【第一资讯】“摇钱树拼三张有没... 网上科普关于“摇钱树拼三张有没有挂”话题很是火热,小编也是针对摇钱树拼三张作*弊开挂的方法以及开挂对...
终于明白“七千在线到底有挂吗?... 终于明白“七千在线到底有挂吗?”(果然有透视挂)您好,七千在线这个游戏其实有挂的,确实是有挂的,需要...
我来教教您“新八戒牛牛到底有挂... 您好:新八戒牛牛这款游戏可以开挂,确实是有挂的,需要了解加客服微信【9752949】很多玩家在这款游...
玩家攻略科普“决战武穴麻将开挂... 您好:决战武穴麻将这款游戏可以开挂,确实是有挂的,需要了解加客服微信【9752949】很多玩家在这款...