首页/系统/Linux 内核与性能调优速查/tcp_migrate_req 请求队列迁移
网络栈调优98 条

tcp_migrate_req 请求队列迁移

开启后, 同 REUSEPORT 组内某监听队列将满时, 内核可把新请求迁移到负载较低的监听者, 缓解单进程队列溢出。

tcp_migrate_req 是什么

开启该参数后,在共享 SO_REUSEPORT 的监听组内,如果某个监听者的请求队列即将溢出,内核可以把新到达的请求迁移给组内负载较低的监听者处理,减少因为单进程队列满而丢弃新连接的情况。它的生效范围严格限定在 REUSEPORT 监听组内,普通监听套接字不受影响。

基本信息

参数名net.ipv4.tcp_migrate_req
查询sysctl net.ipv4.tcp_migrate_req
开启sysctl -w net.ipv4.tcp_migrate_req=1
生效范围仅共享 SO_REUSEPORT 的监听组
版本差异较旧内核没有该参数,以本机 sysctl 输出为准

典型使用场景

  • 多进程服务首包偶发失败,确认是否由监听队列溢出引起
  • 流量分布不均导致的单进程队列告急,用迁移缓解短时溢出
  • 与 REUSEPORT 配合提升接入稳定性
  • 容器宿主上多实例共用端口的场景评估是否适用
  • 验证开启前后的队列溢出计数变化

查询与开启

查询与开启
sysctl net.ipv4.tcp_migrate_req            # 确认参数是否存在及当前取值
sysctl -w net.ipv4.tcp_migrate_req=1       # 临时开启
echo 'net.ipv4.tcp_migrate_req = 1' > /etc/sysctl.d/99-net-tune.conf
ss -lnt 'sport = :8080'                    # 确认同一端口上存在多个监听者

开启前后的观察点

观察对象开启前特征开启后预期
监听队列溢出计数个别监听者持续溢出溢出分散或明显下降
新建连接失败集中在流量高的进程上失败分布更均匀
非 REUSEPORT 套接字不受影响仍不受影响

使用注意

  • 先确认服务确实使用 REUSEPORT,否则开启后没有任何效果
  • 迁移改变的是请求归属,进程内的会话状态设计要能承受
  • 与 eBPF 的 reuseport 选择器同时使用时,要评估两者的交互
  • 改动写入配置文件并记录观测指标与回滚方法
该参数只解决队列即将溢出时的分配问题,不能替代容量规划。如果监听进程本身处理不过来,迁移只是把丢弃从个别进程分散到整组。
迁移发生在请求建立阶段,对已经建立的连接不起作用;排查连接超时问题时要区分是首包阶段还是数据阶段。

易错点

  • 非 REUSEPORT 场景开启该参数,配置存在但没有任何实际效果
  • 未评估与 eBPF reuseport 选择器的交互,分流结果与预期不符
  • 把迁移当作处理能力不足的解药,掩盖了真正的容量瓶颈
  • 开启后不观察队列溢出计数,无法判断是否真的改善

数据来源与参考

  • Linux Documentation/networking/ip-sysctl.txt
  • 内核提交记录 tcp: migratable request sockets
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌