fork耗时严重
如果你的Redis开启了自动生成RDB和AOF重写功能,那么有可能在后台生成RDB和AOF重写时导致Redis的访问延迟增大,而等这些任务执行完毕后,延迟情况消失 。
遇到这种情况,一般就是执行生成RDB和AOF重写任务导致的 。
生成RDB和AOF都需要父进程fork出一个子进程进行数据的持久化,在fork执行过程中,父进程需要拷贝内存页表给子进程,如果整个实例内存占用很大,那么需要拷贝的内存页表会比较耗时,此过程会消耗大量的CPU资源,在完成fork之前,整个实例会被阻塞住,无法处理任何请求,如果此时CPU资源紧张,那么fork的时间会更长,甚至达到秒级 。这会严重影响Redis的性能 。
具体原理也可以参考我之前写的文章:Redis持久化是如何做的?RDB和AOF对比分析 。
我们可以执行info命令,查看最后一次fork执行的耗时latest_fork_usec,单位微妙 。这个时间就是整个实例阻塞无法处理请求的时间 。
除了因为备份的原因生成RDB之外,在主从节点第一次建立数据同步时,主节点也会生成RDB文件给从节点进行一次全量同步,这时也会对Redis产生性能影响 。
要想避免这种情况,我们需要规划好数据备份的周期,建议在从节点上执行备份,而且最好放在低峰期执行 。如果对于丢失数据不敏感的业务,那么不建议开启AOF和AOF重写功能 。
另外,fork的耗时也与系统有关,如果把Redis部署在虚拟机上,那么这个时间也会增大 。所以使用Redis时建议部署在物理机上,降低fork的影响 。
绑定CPU
很多时候,我们在部署服务时,为了提高性能,降低程序在使用多个CPU时上下文切换的性能损耗,一般会采用进程绑定CPU的操作 。
但在使用Redis时,我们不建议这么干,原因如下 。
绑定CPU的Redis,在进行数据持久化时,fork出的子进程,子进程会继承父进程的CPU使用偏好,而此时子进程会消耗大量的CPU资源进行数据持久化,子进程会与主进程发生CPU争抢,这也会导致主进程的CPU资源不足访问延迟增大 。
所以在部署Redis进程时,如果需要开启RDB和AOF重写机制,一定不能进行CPU绑定操作!
开启AOF
上面提到了,当执行AOF文件重写时会因为fork执行耗时导致Redis延迟增大,除了这个之外,如果开启AOF机制,设置的策略不合理,也会导致性能问题 。
开启AOF后,Redis会把写入的命令实时写入到文件中,但写入文件的过程是先写入内存,等内存中的数据超过一定阈值或达到一定时间后,内存中的内容才会被真正写入到磁盘中 。
AOF为了保证文件写入磁盘的安全性,提供了3种刷盘机制:
Appendfsync always:每次写入都刷盘,对性能影响最大,占用磁盘IO比较高,数据安全性最高;
appendfsync everysec:1秒刷一次盘,对性能影响相对较小,节点宕机时最多丢失1秒的数据;
appendfsync no:按照操作系统的机制刷盘,对性能影响最小,数据安全性低,节点宕机丢失数据取决于操作系统刷盘机制 。
当使用第一种机制appendfsync always时,Redis每处理一次写命令,都会把这个命令写入磁盘,而且这个操作是在主线程中执行的 。
内存中的的数据写入磁盘,这个会加重磁盘的IO负担,操作磁盘成本要比操作内存的代价大得多 。如果写入量很大,那么每次更新都会写入磁盘,此时机器的磁盘IO就会非常高,拖慢Redis的性能,因此我们不建议使用这种机制 。
与第一种机制对比,appendfsync everysec会每隔1秒刷盘,而appendfsync no取决于操作系统的刷盘时间,安全性不高 。因此我们推荐使用appendfsync everysec这种方式,在最坏的情况下,只会丢失1秒的数据,但它能保持较好的访问性能 。
当然,对于有些业务场景,对丢失数据并不敏感,也可以不开启AOF 。
使用Swap
如果你发现Redis突然变得非常慢,每次访问的耗时都达到了几百毫秒甚至秒级,那此时就检查Redis是否使用到了Swap,这种情况下Redis基本上已经无法提供高性能的服务 。
我们知道,操作系统提供了Swap机制,目的是为了当内存不足时,可以把一部分内存中的数据换到磁盘上,以达到对内存使用的缓冲 。
但当内存中的数据被换到磁盘上后,访问这些数据就需要从磁盘中读取,这个速度要比内存慢太多!
尤其是针对Redis这种高性能的内存数据库来说,如果Redis中的内存被换到磁盘上,对于Redis这种性能极其敏感的数据库,这个操作时间是无法接受的 。
我们需要检查机器的内存使用情况,确认是否确实是因为内存不足导致使用到了Swap 。
推荐阅读
- 无线WiFi覆盖工程常见问题
- 喝枸杞会上火吗
- 茯苓怎么食用
- 贴片电阻功率及封装尺寸
- 破伤风常见的并发症有哪些
- 常见的激光脱腋毛方式有哪些
- 饼干都有哪几种,常见的饼干有哪些种类-
- 婴儿能喝姜水吗?
- 体内湿气重有什么症状 湿气重的常见症状
- |与领导常见的8句对话的话术,正例和反例都有