先查网卡是否单队列硬扛:云服务器默认单队列会导致所有中断集中于cpu0,即使其他核空闲也无法并行收包;需用ethtool -l eth0确认队列数,再ethtool -l eth0 combined n启用多队列,并确保irqbalance运行或配置rps兜底。

Redis吞吐卡在1500 QPS,先看网卡是否单队列硬扛
很多团队压测 Redis 时发现 redis-benchmark -q -n 100000 -c 50 跑不出预期 QPS,redis-cli --latency 却显示延迟稳定在 0.2–0.4ms——这基本排除 Redis 自身瓶颈,问题大概率出在网络收包环节。云服务器默认常为单队列网卡(ethtool -l eth0 显示 Current: Combined:1),所有中断都压到 CPU 0,哪怕其他核空闲,网卡也无法并行处理数据包。
实操建议:
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
- 运行
ethtool -l eth0确认网卡支持的最大队列数(如Pre-set maximums: Combined: 4) - 执行
ethtool -L eth0 combined 4启用 4 个队列(需驱动和内核支持,CentOS 7.2+/Ubuntu 16.04+ 通常可用) - 检查
cat /proc/interrupts | grep eth0,确认中断是否已分散到多个 CPU(如IRQ 45分布在 CPU0–CPU3) - 若仍集中于单核,需确保
irqbalance服务已启用:systemctl is-active irqbalance
单队列网卡或 irqbalance 失效时,RPS 是兜底方案
RPS(Receive Packet Steering)是在软件层模拟多队列的机制,不依赖网卡硬件多队列支持,对老机型或部分云厂商虚拟网卡特别有用。它通过四元组(SIP, SPORT, DIP, DPORT)哈希分发软中断到不同 CPU,缓解 CPU 0 过载问题。但注意:RPS 只处理接收路径(RX),不加速发送(TX);且若未配 RFS(Receive Flow Steering),连接新建/重传等流状态可能无法被缓存加速。
实操建议:
- 设置全局流表大小:
sysctl -w net.core.rps_sock_flow_entries=32768 - 对每个 RX 队列启用 RPS(假设 4 核):
echo f > /sys/class/net/eth0/queues/rx-0/rps_cpus(f表示 CPU0–3 全部参与) - 调高每队列流计数上限:
echo 32768 > /sys/class/net/eth0/queues/rx-0/rps_flow_cnt - 批量操作脚本中,
rps_cpus值应为十六进制掩码(如 8 核用ff),别直接写十进制数字
开启多队列后 QPS 仍上不去?检查 PPS 是否打满
千兆网卡理论 PPS 上限约 148,800 包/秒(按最小以太网帧 64 字节 + 帧间隙计算)。Redis 小 key 场景(如 SET k v)单请求仅 60–100 字节,极易触发 PPS 瓶颈——此时 top 看不到 CPU 满载,netstat -s 却可能看到大量 packet receive errors 或 dropped。吞吐卡在 200–300 Mbps 是典型信号。
实操建议:
- 用
perf stat -e net:netif_receive_skb -I 1000实时监控每秒进包数,对比理论 PPS(1G≈148K,10G≈1.48M) - 禁用 Nagle 算法不是万能解:确认
/proc/sys/net/ipv4/tcp_nodelay为1(默认值),避免小包攒批加重延迟 - 真正治本是减少网络往返:客户端必须用
pipeline或MSET/MGET批量操作,把 100 次 SET 合成 1 次 TCP 往返 - 云环境务必验证路径:用
iperf3 -c $redis_ip -P 4测裸 TCP 吞吐,若远低于实例标称带宽,说明 VPC 内部、安全组或 ENI 有隐式限速
云厂商虚拟网卡的特殊限制必须手动绕过
阿里云、腾讯云等平台的弹性网卡(ENI)默认不自动启用多队列,即使你执行了 ethtool -L eth0 combined 4,底层 hypervisor 可能未透传队列能力。更隐蔽的是:跨子网、跨安全组、走 NAT 网关或 VPC 流控策略,都会让流量经过额外虚拟交换节点,每个节点都有独立 PPS/带宽限额。
实操建议:
- 压测前确认客户端与 Redis 实例在**同一 VPC、同一子网、同一安全组**,关闭“公网访问”开关
- 阿里云用户检查 ECS 带宽类型:
按固定带宽才保障稳定上限;按使用流量可能受突发带宽限制 - 腾讯云需查看控制台「VPC 流控策略」是否开启,或联系工单确认 ENI 队列数是否已分配
- 终极验证法:将压测客户端部署在 Redis 所在宿主机(Docker 使用
--network host),若 QPS 翻倍,100% 是网络路径问题
rps_cpus 写成十进制)、PPS 监控没抓准时间窗口、云厂商的 ENI 队列开关藏在控制台二级菜单里——这些细节不抠清楚,调优就只是改了几个数字而已。










