io-threads 是什么
Redis 6.0 引入多线程网络 IO:把 socket 读写与协议解析分摊到多个 IO 线程并行处理,但命令执行仍然是单线程。这样在写负载重、单核网络处理成为瓶颈时能显著提升吞吐。配套参数 io-threads-do-reads 决定是否让读操作也走 IO 线程,默认关闭。它不会把大键操作或慢命令变快——那类问题仍需从数据模型和命令选择上解决。
基本信息
| 版本要求 | Redis 6.0 起支持多线程网络 IO |
|---|---|
| 核心参数 | io-threads,建议 2 到 4 起步,不超过 CPU 核数 |
| 读并行 | io-threads-do-reads yes 让读也走 IO 线程,默认 no |
| 生效范围 | socket 读写与协议解析;命令执行仍为单线程 |
| 观察 | INFO threads(7.0+)查看各 IO 线程的读事件统计 |
典型使用场景
- 写负载重:以 SET、HSET 等写入为主的实例,网络处理阶段成为瓶颈时开多线程 IO
- 大带宽场景:单条数据较大导致网络收发耗时占比高,提高 IO 并行度有收益
- 压测对比:用基线工具在开、关两种配置下对比吞吐,验证是否真的缓解了瓶颈
- 读密集分流:默认读不进 IO 线程,如果读也成瓶颈可评估开启 io-threads-do-reads
- 版本升级评估:从 5.x 升级到 6.x 及以上后重新做容量规划,避免沿用旧参数
配置示例
配置示例
# redis.conf 中的网络 IO 相关配置
io-threads 4 # IO 线程数,建议 2-4 起步,不超过核数
io-threads-do-reads yes # 让读也走 IO 线程(默认 no,按负载决定)
# 改完配置文件按发行版方式重启生效
# 个别版本支持动态设置,以 CONFIG SET 实际返回为准验证与压测
验证与压测
redis-cli CONFIG GET io-threads
redis-cli CONFIG GET io-threads-do-reads
redis-cli INFO threads # 7.0+:各 IO 线程读事件统计
redis-cli INFO cpu # 看 CPU 使用率,确认瓶颈是否在网络层
# 压测对比开关前后的吞吐(务必在测试实例上)
redis-benchmark -q -n 100000 -c 50 -t set,get -h 127.0.0.1参数与预期
| 参数 | 作用 | 调大时的风险 |
|---|---|---|
| io-threads | 并行处理 socket 读写与协议解析 | 超过核数后上下文切换开销反而降低性能 |
| io-threads-do-reads | 读操作也交给 IO 线程 | 低负载下收益有限,徒增线程切换 |
| 核数与配置 | IO 线程数应小于可用 CPU 核数 | 留出核给主线程与后台任务,否则互相抢占 |
判断是否该开:先看 INFO cpu 与网络带宽。命令执行仍是单线程,如果瓶颈在大键操作或慢命令,开更多 IO 线程不会有帮助。
IO 线程数不是越多越好:线程数超过可用核数时,调度与缓存失效带来的开销会抵消并行收益,甚至让尾延迟变差。