017.redis 在实践中的一些常见问题以及优化思路(包含 linux 内核参数优化)
[toc] fork 耗时导致高并发请求延时 RDB 和 AOF 的时候会存在 RDB 快照生成、AOF rewrite,耗费磁盘 IO 的过程 主进程 fork 子进程的时候,子进程是需要拷贝父进程的空间内存页表的,也是会耗费一定的时间的 一般来说,如果父进程内存有 1 个 G 的数据,那么 fork 可能会耗费在 20ms 左右,如果是 10G~30G,那么就会耗费 20 * 10,甚至 20 * 30,也就是几百毫秒的时间 info stats 中的 latest_fork_usec,可以看到最近一次 fork 的时长 redis 单机 QPS 一般在几万,fork 可能一下子就会拖慢几万条操作的请求时长,从几毫秒变成 1 秒 优化思路 :fork 耗时跟 redis 主进程的内存有关系,一般控制 redis 的内存在 10GB 以内;否则 slave -> master 在全量复制等时候就可能会出现一些问题 AOF 的阻塞问题 redis 将数据写入 AOF 缓冲区,单独开一个线程做 fsync 操作,每秒一次 但是 redis 主线程会检查两次 fsync 的时间,如果距离上次 fsync 时间超过了 2 秒,那么写请求就会阻塞 everysec,最多丢失 2 秒的数据 一旦 fsync 超过 2 秒的延时,整个 redis 就被拖慢 优化思路 :优化硬盘写入速度