上一篇看到输出缓冲可以无限涨。client-output-buffer-limit 就是给它加的保险:硬限制一超立刻断开,软限制超过并持续一段时间也断开。这篇把两种限制各触发一次,量断开发生的确切位置与时间。
normal 10485760 5242880 3 slave 268435456 67108864 60 pubsub 33554432 8388608 60
client-output-buffer-limit 类别 硬限制 软限制 软限制秒数。normal 是普通客户端(默认 0 0 0,不限制),replica 是从库(默认 256mb 64mb 60),pubsub 是订阅者(默认 32mb 8mb 60)。
发送到第 10 个 GET 时被服务器断开(client_output_buffer_limit_disconnections 0 → 1) 日志: Client id=6 addr=127.0.0.1:56877 laddr=127.0.0.1:8220 fd=10 name= age=0 idle=0 flags=N db=0 sub=0 psub=0 ssub=0 multi=-1 watch=0 qbuf=23 qbuf-free=20451 argv-mem=7 multi-mem=0 rbs=16384 rbp=16384 obl=
一个不读取的客户端连续发 GET,每个回复 1 MB。发到第 10 个(累计约 10 MB)时被服务器断开,INFO stats 的 client_output_buffer_limit_disconnections 从 0 变 1,日志里记录了被关闭的客户端详情(scheduled to be closed ASAP for overcoming of output buffer limits)。
发 7 个 GET(约 7 MB,在 5 MB 与 10 MB 之间):约 3.1 秒后被断开(disconnections 1 → 2)
缓冲在 5 MB(软限)到 10 MB(硬限)之间:发 7 个 GET 不会立刻断开,持续约 3.1 秒(配置的 3 秒)后被断开。用来容忍「短暂的突发」而不误杀。
每 0.2 秒读一点之后的 omem(字节): [2097152, 2097152, 2097152, 2097152, 2097152, 2097152]
发 3 个 GET、每 0.2 秒只读一点:服务器上 omem 一直是 2097152 字节(约 2 MB,低于软限),没有被断开。慢客户端只要不超限就不受影响。(这一节数据不多,只说明「没超限不会断」。)