什么是多路径哈希策略
多条等价下一跳(ECMP)时,内核要按流量特征选择出口,net.ipv4.fib_multipath_hash_policy 决定用哪些字段做哈希:取 0 时按三层字段(源/目的地址等)哈希,同一条流的报文始终走同一路径,避免乱序;取 1 时把四层字段(端口、协议)也纳入计算,短连接多、端口分布广的场景下负载更均衡。选择哪一种取决于流量形态与对乱序的容忍度。
基本信息
| 参数路径 | net.ipv4.fib_multipath_hash_policy |
|---|---|
| 取值 0 | 按三层字段哈希(源/目的地址) |
| 取值 1 | 按四层字段哈希(含端口与协议) |
| 取值 2 | 按内层字段哈希(隧道场景,视内核版本支持) |
| 观测 | ip route show、/proc/net/ipv4 相关统计、各路径流量分布 |
| 影响面 | 路由选择结果,间接影响负载分布与乱序 |
典型使用场景
- 多运营商出口:把单一业务大流分散到不同链路上
- 负载分布不均:确认哈希策略是否把流量集中到少数成员
- 短连接服务:四层哈希在大量端口变化的场景下更均衡
- 大文件传输:三层哈希保证同一流不被拆散,减少乱序重排
- 与上游设备哈希策略对照,避免叠加放大偏斜
查看与核对
查看与核对
sysctl net.ipv4.fib_multipath_hash_policy
ip route show | grep -i -E 'nexthop|multipath' | head
ip link show # 确认各出口链路状态
cat /proc/net/ipv4/rt_cache 2>/dev/null | head # 部分内核有此缓存视图
tc -s qdisc show dev eth0 | head # 观测出口队列与丢包
# 变更示例(先记录原值并评估影响):sysctl -w net.ipv4.fib_multipath_hash_policy=1两种策略对比
| 策略 | 哈希字段 | 适用与代价 |
|---|---|---|
| 0(三层) | 源/目的地址等 | 单流稳定、不乱序;短连接多时分布偏斜 |
| 1(四层) | 含端口与协议 | 分布更均匀;同一服务不同连接可能走不同路径 |
| 2(内层) | 隧道内层字段 | 视版本支持,隧道场景使用 |
| 不改(默认) | 按发行版默认 | 跨版本迁移时要重新核对 |
哈希策略只影响本机出方向的选择,端到端是否均衡还取决于上游设备与运营商侧的哈希算法,评估要放到同一条链路的两端一起看。
改动后现有 ECMP 组内的流分布会重新计算,切换瞬间可能造成已有连接的路径变化;变更应放在可控窗口并观察乱序与重传指标。