Redis 6.0的String读写性能不因io-threads单独配置而提升,因命令执行仍为单线程;必须同时启用io-threads-do-reads yes且合理设线程数(推荐min(4, CPU核心数×0.7)),才能通过多线程加速网络I/O读写。
io-threads 参数本身不直接提升 String 读写性能——它只控制网络 I/O 线程数,而 GET、SET 等命令执行仍由主线程串行完成。真正起效的前提是同时开启 io-threads-do-reads yes,且线程数设置合理;否则配置无效。io-threads 没用?Redis 6.0 的 I/O 多线程必须“读+写”协同生效:io-threads 定义线程池大小,但默认仅用于响应写出(write),请求读取(read)仍走主线程。漏配 io-threads-do-reads yes 会导致整个 pipeline 卡在第一步——客户端请求压根没被多线程分摊。
io-threads 值必须 ≥ 2:设为 1 等价于禁用io-threads-do-reads 默认是 no,必须显式改为 yes
redis.conf 修改,CONFIG SET 不支持热更新redis-cli config rewrite 或重启服务才生效io-threads 设多少才合适?线程数不是越多越好,超配反而引发频繁上下文切换和锁竞争,%sy(系统态 CPU)飙升但 QPS 下降。
min(4, CPU核心数 × 0.7)
INFO threads 查看 io_threads_num 和 io_threads_active 确认是否真正激活因为 I/O 线程只加速数据搬移(read/write 系统调用),不加速命令执行。以下情况开再多线程也无济于事:
GET 返回 value > 100 KB:主线程 memcpy 耗时占主导,I/O 加速无效maxmemory 接近阈值:LRU/LFU 驱逐扫描阻塞主线程,查 evicted_keys 突增可验证notify-keyspace-events(尤其含 E 或 g):每个 key 变更都广播事件,主线程负担翻倍io-threads 提速的场景只有当瓶颈确实在网络 I/O 层时,配置才有意义。典型高收益组合:
GET/SET)cat /proc/interrupts | grep eth0 显示某核 IRQ 占比 >70%)MSET/MGET,客户端启用了连接池和合理 pipeline 深度(16–128)jemalloc 或没开 lazyfree,大 DEL 后内存回收仍卡主线程,I/O 加速就白搭。配置只是半程优化,不能脱离整体使用模式单独生效。