normal 输出缓冲是什么
普通客户端(既没订阅、也不是复制连接)的输出缓冲由 client-output-buffer-limit normal 控制,默认是 0 0 0,也就是不做任何限制。返回体积很大的命令会让服务端先把结果攒进这个缓冲再逐步发给客户端,客户端读得慢,缓冲就一直涨,吃的是 Redis 自己的内存。
基本信息
| 配置项 | client-output-buffer-limit normal |
|---|---|
| 值格式 | 硬限制 软限制 秒数 |
| 默认值 | 0 0 0(两项限制都为 0 表示不限制) |
| 单位 | 字节 |
| 生效方式 | CONFIG SET 动态生效 |
| 配套手段 | maxmemory-clients 限制客户端整体内存占用 |
典型使用场景
- 大结果集接口排查:某类查询把实例内存顶上去时,先确认是不是输出缓冲堆积
- 给慢客户端设闸:客户端消费能力不可控时,用软限制自动断开积压连接
- 容量规划:按单次查询最大返回体积反推合理的缓冲上限
- 故障复盘:连接被服务端断开且有缓冲相关日志时,核对是否触发限制
- 整体兜底:即使 normal 不设限,也用 maxmemory-clients 控制客户端内存占比
查看与设置
查看与设置
redis-cli CONFIG GET client-output-buffer-limit # 一次看到 normal/replica/pubsub 三类限制
redis-cli CLIENT LIST # 逐连接看 omem 与 tot-mem
redis-cli INFO clients | grep -E 'client_recent_max_output_buffer' # 近期最大输出缓冲峰值
redis-cli CONFIG SET client-output-buffer-limit normal 268435456 67108864 60 # 硬 256MB、软 64MB、持续 60 秒
redis-cli INFO stats | grep -E 'evicted_clients' # 有客户端被驱逐时的计数关键字段读法
| 字段 | 含义 | 怎么用 |
|---|---|---|
| omem | 该连接当前的输出缓冲占用 | 持续增长说明对端消费跟不上 |
| qbuf | 该连接的输入缓冲占用 | 批量提交或大命令时会升高 |
| tot-mem | 该连接的总内存占用 | 用于定位吃内存的连接 |
| client_recent_max_output_buffer | 近期单连接输出缓冲峰值 | 设置上限时的实测依据 |
软限制的语义是:缓冲超过软限制、并且持续超过指定秒数才断开;硬限制一旦超过立即断开。两者可以只设其一,也可以同时设。
上限设得太小会把正常的大结果查询连接掐断,先用近期输出缓冲峰值做依据,再留出余量设置,并对驱逐计数加告警。