首页/系统/Linux 内核与性能调优速查/net.core.busy_read / busy_poll 低延迟轮询
sysctl 内核参数72 条

net.core.busy_read / busy_poll 低延迟轮询

允许应用通过 SO_BUSY_POLL 在网卡队列上自旋轮询收包(默认关闭);以 CPU 换微秒级延迟收益。

低延迟轮询

允许应用对网卡队列启用忙轮询收包:进程在等待数据时自旋检查,而不是睡眠等待中断唤醒,用处理器时间换微秒级的延迟改善。内核参数给出的是允许的轮询时间上限,真正要生效还需要应用在套接字上显式启用对应选项——只改内核参数不会有任何变化。

基本信息

适用平台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 服务开启后处理器占用上升而体验改善难以察觉。
轮询线程会把处理器时间空转掉,同机其它服务可用算力下降;上线前必须用同一负载对比整机指标,不要只看被优化服务自己。

易错点

  • 只改内核参数而不修改应用:轮询根本不会发生,误以为没有收益。
  • 轮询线程忙等挤压同机其它服务的处理器时间,整体表现反而变差。
  • 在普通业务上开启,处理器占用上升但延迟改善无法测量。
  • 把轮询时长设得过大,几个线程就能吃满处理器。
  • 只看单服务指标做验证,忽略整机层面的代价。

数据来源与参考

  • Linux 内核 Documentation/networking/scaling.rst
  • Linux 内核 Documentation/admin-guide/sysctl/net.rst
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌