低延迟轮询
允许应用对网卡队列启用忙轮询收包:进程在等待数据时自旋检查,而不是睡眠等待中断唤醒,用处理器时间换微秒级的延迟改善。内核参数给出的是允许的轮询时间上限,真正要生效还需要应用在套接字上显式启用对应选项——只改内核参数不会有任何变化。
基本信息
| 适用平台 | Linux 内核参数(net.core 命名空间) |
|---|---|
| 参数名 | net.core.busy_read 与 net.core.busy_poll |
| 默认值 | 0,即关闭 |
| 单位 | 微秒 |
| 生效前提 | 应用在套接字上显式启用对应选项 |
典型使用场景
- 低延迟交易或高频请求链路,追求尾部延迟的稳定。
- 对比开启前后的延迟分布,量化收益是否值得。
- 排查「参数改了却没效果」,确认应用是否启用。
- 评估轮询对同机其它服务的影响,避免收益被整体拖累抵消。
- 在压测环境下验证收益边界,为是否上生产提供依据。
查看与启用
查看与启用
sysctl net.core.busy_poll net.core.busy_read # 查看当前取值
sysctl -w net.core.busy_read=50 # 临时设置允许的轮询时间上限
sysctl -w net.core.busy_poll=50 # 轮询等待数据的时长上限
grep -i busy /proc/net/softnet_stat # 观察与轮询相关的统计是否变化
sar -n DEV 1 5 # 对比开启前后的包速率
mpstat -P ALL 1 5 # 观察处理器占用变化参数与注意
| 参数 | 作用 | 注意点 |
|---|---|---|
| 轮询读延时 | 接受轮询的等待时长上限 | 只是上限,应用需显式启用 |
| 轮询等待时长 | 等待数据的自旋时间 | 越大收益越明显,代价也越高 |
| 处理器占用 | 忙等带来的额外负载 | 在压测中评估同机影响 |
这条链路对延迟的收益通常在微秒量级,只对延迟敏感型业务有意义;普通 Web 服务开启后处理器占用上升而体验改善难以察觉。
轮询线程会把处理器时间空转掉,同机其它服务可用算力下降;上线前必须用同一负载对比整机指标,不要只看被优化服务自己。