首页/数据/Redis 进阶速查/io-threads:多线程网络 IO
性能与排障129 条

io-threads:多线程网络 IO

Redis 6 起可将网络读写分发到多个 IO 线程(io-threads),主线程仍负责命令执行;高网络负载实例可显著提升吞吐。

Redis 进阶速查数据更新于 2026-10-13

多线程网络收发

Redis 6.0 起可以把网络读写分发到多个 IO 线程,命令执行仍由主线程串行完成。也就是说,它解决的是「网络收发成为瓶颈」的问题,命令本身的耗时不会被并行化;网络负载重、单核收发吃满的实例开了它才可能有收益。

基本信息

配置项io-threads N,默认 1 表示关闭
读取分发io-threads-do-reads yes 后读取也走多线程
版本Redis 6.0 起
线程数建议不超过可用核数,通常小幅上调

典型使用场景

  • 网络收发占用主线程明显,单核被收发吃满
  • 大量连接或大包体放大网络层开销
  • 压测中确认命令层是否已经成为真正瓶颈
  • 多核机器上 CPU 利用率长期不均衡
  • 扩容前尝试先从网络并行里榨出余量

调整与验证

调整与验证
# 查看当前线程配置
redis-cli CONFIG GET io-threads io-threads-do-reads
# 小幅上调 IO 线程,不要超过可用核数
redis-cli CONFIG SET io-threads 4
redis-cli CONFIG SET io-threads-do-reads yes
# 观察吞吐变化,注意对比时压测参数必须一致
redis-benchmark -t set,get -n 200000 -c 100 -P 16 -q
# 看命令级统计,判断瓶颈在命令还是网络
redis-cli INFO commandstats | head -10

参数读法

参数含义注意点
io-threads参与网络读写的线程数默认 1 即关闭多线程 IO
io-threads-do-reads是否启用多线程读取关闭时只有写入被分发
可用核数决定线程数的上限超过可用核数会抬高协调成本
命令执行仍在主线程串行命令慢调这个参数没有帮助
网络开销与连接数和包体大小相关管道化与小包能降低单请求开销
判断是否值得开启:先看命令执行耗时与网络收发耗时的占比;如果命令本身就慢,增加 IO 线程只会让排队现象更明显。
线程数盲目设大,上下文切换与线程间协调开销上升,吞吐可能不升反降;任何改动都要用同一套压测参数对比,不能凭感觉。

易错点

  • 命令本身是瓶颈时调 IO 线程 → 收益接近于零,还引入额外复杂度 → 先用命令统计与慢日志确认瓶颈类型
  • 线程数设成核数上限甚至更多 → 上下文切换成本上升,吞吐下降 → 不超过可用核数并做对比压测
  • 只改参数不压测 → 无法量化收益,改动成了心理安慰 → 调整前后用完全相同的压测参数
  • 以为多线程能让命令并行执行 → 对单键热点类问题产生错误期待 → 命令仍串行,热点要靠数据模型解决

数据来源与参考

  • Redis 官方文档:io-threads 配置
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌