redis-benchmark自身就是瓶颈,因其单进程单线程架构在高并发或pipeline场景下易cpu跑满、调度延迟、tcp缓冲区打满或端口耗尽,导致qps/latency剧烈波动且统计失真;需用top、ss、tcpdump、/proc/net/snmp等工具交叉验证客户端与网络状态。

redis-benchmark 结果波动大,先确认它是不是瓶颈本身
直接用 redis-benchmark 压测时 QPS/latency 波动剧烈(比如标准差 > 均值 30%),大概率不是 Redis 服务端问题,而是 redis-benchmark 自身单进程、单线程模型在高并发(-c 100+)或 pipeline(-P)下扛不住:CPU 跑满、调度延迟、TCP 发送缓冲区打满、甚至本地端口耗尽。它的统计结果此时已失真,不能作为服务端性能依据。
- 用
top -p $(pgrep redis-benchmark)看其 CPU 是否持续 >90% - 用
ss -i | grep :6379查看连接的retrans(重传)和rto(超时)是否异常升高 - 换多进程压测工具验证,比如
go-redis-bench或起多个redis-benchmark实例(-c 20× 5),对比总 QPS 和单实例抖动幅度
抓包比日志更可信:用 tcpdump 定位真实网络耗时
应用日志里记录的 “Redis get 耗时 126ms”,Wireshark 解析对应 TCP 流可能只显示 2ms 往返——说明延迟根本不在网络链路上,而在客户端本机。这是最直接的排除法。
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
- 在客户端机器执行:
tcpdump -i any port 6379 -w redis.pcap(注意别用-s 0否则截断 RESP 协议) - 同时记录业务日志中出问题的 key 和时间戳,用
tshark -r redis.pcap -Y "redis.command == \"GET\" && redis.value contains \"rec_useraction_bg_2_user_319607672835\""过滤 - 重点看
tcp.time_delta(客户端发请求到收响应的时间),若远小于日志耗时,问题一定在客户端:GC STW、协程调度延迟、SDK 连接池阻塞、或本地 CPU 调度不均
检查 Redis 服务端侧的网络敏感参数
即使客户端干净,服务端配置不当也会放大网络抖动影响,尤其主从复制或跨网段访问时。
-
repl-timeout默认 60 秒太敏感,跨可用区或高延迟网络建议调大到120或180 -
tcp-keepalive默认 300 秒,但 Redis 复制心跳是应用层协议,需配合repl-ping-replica-period(默认 10 秒)使用;若网络丢包率 >1%,建议把repl-ping-replica-period降到5 - 禁用 Nagle 算法对小包(如单个 GET)有帮助:
echo 'net.ipv4.tcp_nodelay = 1' >> /etc/sysctl.conf && sysctl -p
用 /proc/net/snmp 和 ss -i 看底层 TCP 健康度
/proc/net/snmp 里的 Tcp: 行能暴露真实网络问题,比 ping 更准;ss -i 则反映每个连接的实时 TCP 状态。
- 查丢包:
awk '/Tcp:/ {print "InSegs:" $2 " OutSegs:" $3 " RetransSegs:" $5}' /proc/net/snmp—— 若RetransSegs持续增长,说明链路不稳定 - 查连接质量:
ss -ti 'dst <redis-ip>:6379'</redis-ip>看rtt(往返时延)、rttvar(抖动)、retrans(重传次数) - 对比直连(同机房)vs 跨网段压测结果:若后者抖动显著增大,且
ss -i显示rttvar> 50ms,基本可锁定网络层
tcpdump + perf record -g -p $(pidof your-app) 双轨比对,否则容易在错误方向上优化半天。










