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 选择器同时使用时,要评估两者的交互
- 改动写入配置文件并记录观测指标与回滚方法
该参数只解决队列即将溢出时的分配问题,不能替代容量规划。如果监听进程本身处理不过来,迁移只是把丢弃从个别进程分散到整组。
迁移发生在请求建立阶段,对已经建立的连接不起作用;排查连接超时问题时要区分是首包阶段还是数据阶段。