Linux

Redis持久化配置不当带来的性能问题分析

一 背景说明

两台机器,server1跑Redis缓存数据库和应用;

server2向server1的应用执行一个Redis查询请求,并持续监控该请求延迟;

server1: 172.16.17.7,4C 8G;

server2: 172.16.11.36,24C 64G;

二 分析步骤和思路

1 server1启动并验证容器正常工作

2 server1初始化Redis缓存数据

3 server2调用接口访问server1 redis

发现,通过接口调用serve1的Redis需要62秒,1分多钟,这太慢了。

4 使用top和iostat工具对server1资源使用情况分析和监测

server2对server1持续进行接口访问请求:

然后再在server1上分别使用top监控资源使用情况:

看到服务器上CPU资源并没有被严重消耗,同时内存资源也充足,机器整体负载也不高。但是,客户端请求Redis响应就是慢。

使用iostat -dx 1;监测系统磁盘IO情况:

系统的IO资源使用率偏高,随着时间的推移,当客户的请求结束时,磁盘使用率%util下降。同时,也看到随着磁盘使用率的上升和下降,磁盘的写次数w/s和wkB/s指标也响应的上升和下降。

这里有个疑问出现:客户端请求服务端的Redis,为啥服务端出现比较明显的磁盘写,而不是磁盘读?通常来讲,Redis作为缓存数据库服务来用,应该读大于写才符合常理的啊。

5 pidstat来跟踪Redis进程的磁盘IO

在server2上,通过pidstat -d -l -p redis_pid 1;命令来检测Redis进程的磁盘IO情况:

明显可以看到,Redis后台进程的13375磁盘IO也主要是写kB_wr/s,读操作kB_rd/s为0。更为重要的是,跟随客户端调用Redis请求时,13375开始写磁盘,客户端请求停止时,看到磁盘写的值为0.

到这里,基本可以判断出客户端请求Redis响应慢的问题,基本上可以认定是Redis自身的配置或者是使用的问题了。服务器上的资源充足够用,CPU消耗不高,内存够用,缓存也稳定,几乎没有太大抖动,系统负载也不高。

6 跟踪查看Redis进程在内核的系统调用和打开文件信息

strace跟踪进程的内核调用:strace -fp 13375

Redis进程主要系统调用是write(),read(),和fdatasync()以及epoll_pwait()等操作。

查看进程打开文件信息:lsof -p 13375

Redis进程在写文件描述符为18号的文件,读取3号文件是pipe,以及8号文件的TCP Socket文件。

7 调整Redis的持久化配置参数

进入Redis container里,查看Redis的持久化配置:

这里,看到当前的Redis持久化存储方式采用的是AOF (Append Only File),即追加文件的方式。并且配置(“appendfsync”=”always”)的是每新增一个key-value,就把它持久化写入到文件里,防止内存中的这个key-value丢失。

我们这里尝试把Redis的持久化方式改为”appendfsync”=”no”,即不是每次都要实时写出追加到文件,而是交给文件系统去处理的方式。

然后,观察客户端发送的Redis请求从之前的耗时60秒左右,降低到1-2秒左右。

并且,服务端也不再看到Redis进程频繁的磁盘写操作了。

三 小结和收获

1 思路

客户端发起Redis调用请求耗时偏高,服务端监控到CPU、内存、负载、系统缓存都比较正常;此时,不能判断没有性能问题,客户端请求延迟很高,继续跟踪Redis进程的磁盘IO情况(pidstat -d -l -p redis_pid 1;),strace -fp redis_pid;和lsof -p redis_pid;查看Redis进程在内核中的系统调用和打开文件信息;判断问题基本上是Redis自身的配置和使用不对;

2 学习了Redis的持久化不同配置方案

详细的信息,可以从Redis官网查看:https://redis.io/topics/persistence

3 主机资源正常不代表没有性能问题

此案例中,服务端监控到CPU、内存、负载、系统缓存都比较正常;此时,不能判断没有性能问题,

4 Redis的异常写操作

Redis的异常写操作和当前的场景不太吻合,客户端发起Redis调用请求,查询缓存数据库,不应该在服务器端看到明显的Redis写请求操作。

四 参考和链接

倪朋飞老师的Linux性能优化实战,29 | 案例篇:Redis响应严重延迟,如何解决?

Redis官网关于持久化配置查看:https://redis.io/topics/persistence