当 Redis 发生高延迟时,到底发生了什么 (3)

> redis-cli -c -p 7000 info | grep -w latest_fork_usec

latest_fork_usec:315

当我们开启AOF持久化功能时,文件刷盘的方式一般采用每秒一次,后 台线程每秒对AOF文件做 fsync 操作。当硬盘压力过大时,fsync 操作需要等待,直到写入完成。如果主线程发现距离上一次的 fsync 成功超过2秒,为了数据安全性它会阻塞直到后台线程执行 fsync 操作完成。这种阻塞行为主要是硬盘压力引起,可以查看 Redis日志识别出这种情况,当发生这种阻塞行为时,会打印如下日志:

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.

也可以查看 info persistence 统计中的 aofdelayedfsync 指标,每次发生 fdatasync 阻塞主线程时会累加。

>info persistence

loading:0

aof_pending_bio_fsync:0

aof_delayed_fsync:0

内存交换

内存交换(swap)对于 Redis 来说是非常致命的,Redis 保证高性能的一个重要前提是所有的数据在内存中。如果操作系统把 Redis 使用的部分内存换出到硬盘,由于内存与硬盘读写速度差几个数量级,会导致发生交换后的 Redis 性能急剧下降。识别 Redis 内存交换的检查方法如下:

>redis-cli -p 6383 info server | grep process_id # 查询 redis 进程号

>cat /proc/4476/smaps | grep Swap # 查询内存交换大小

Swap: 0 kB

Swap: 4 kB

Swap: 0 kB

Swap: 0 kB

如果交换量都是0KB或者个别的是4KB,则是正常现象,说明Redis进程内存没有被交换。

有很多方法可以避免内存交换的发生。比如说:

保证机器充足的可用内存

确保所有Redis实例设置最大可用内存(maxmemory),防止极端情况下 Redis 内存不可控的增长。

降低系统使用swap优先级,如 echo10>/proc/sys/vm/swappiness

参考

https://redis.io/topics/latency

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpdzzp.html