nat高峰期的检查
从你贴出的数据来看,可以得出几个比较明确的结论。
1. 当前根本不在业务高峰期
你采集时:
物理10G网卡:
183738 Bytes/sec
换算:
183738 × 8 ≈ 1.47 Mbps
不到 2Mbps。
而 Hyper-V 虚拟交换机:
1903091 Bytes/sec
换算:
1903091 × 8 ≈ 15.2 Mbps
仍然非常低。
对于万兆网:
10 Gbps = 10000 Mbps
当前利用率:
15 / 10000 = 0.15%
几乎空闲。
因此这些数据只能说明:
采集时服务器负载极低
无法反映晚高峰状态。
2. 203个TCP连接完全正常
宿主机:
Get-NetTCPConnection | Group-Object State
结果:
Established : 24
Listen : 110
TimeWait : 37
说明:
宿主机自身压力极低
24个已建立连接基本属于:
-
RDP
-
DNS
-
Hyper-V管理
-
SMB
-
监控
级别。
所以:
宿主机没有TCP连接压力
3. 60万NAT会话不在宿主机
从你的拓扑看:
Hyper-V
├─ OpenClash
├─ Ubuntu
├─ RULR
├─ MongoDB
├─ MySQL
└─ ...
你以前提到:
60万 NAT Session
如果真达到:
600000+
那么一定在某台VM内部。
因为宿主机看到的:
Established 24
根本不可能对应60万会话。
4. 真正应该监控什么
对于你的场景:
Windows Server 2025
Hyper-V
40台VM
万兆交换机
最有价值的指标不是:
Get-NetTCPConnection
而是:
PPS
每秒包数
查看:
Get-Counter '\Network Interface(*)\Packets Received/sec'
Get-Counter '\Network Interface(*)\Packets Sent/sec'
VMQ队列
查看:
Get-NetAdapterVmq
CPU中断
查看:
Get-Counter '\Processor Information(*)\% Interrupt Time'
DPC延迟
查看:
Get-Counter '\Processor Information(*)\% DPC Time'
5. 你这个环境最大的风险是什么
其实不是端口数。
你已经改成:
1025-65535
64511个动态端口
够用了。
真正需要关注的是:
Intel 82599
这是非常经典的万兆卡。
但:
82599 不支持 VMMQ
只支持:
RSS
VMQ
SR-IOV
不支持新一代:
VMMQ
vRSS增强
所以当:
30~40台虚拟机
数十万连接
同时跑时,
瓶颈往往出现在:
CPU中断
VMQ队列
而不是TCP端口。
6. 建议晚高峰采集
晚上业务高峰时执行:
Get-NetAdapterStatistics
记录一次。
然后间隔30秒:
Get-NetAdapterStatistics
再记录一次。
我帮你计算:
实际吞吐量
PPS
单包大小
就能判断:
-
是否接近82599极限
-
是否出现小包风暴
-
是否需要开启SR-IOV
-
是否需要升级到X710/X550/E810
7. 你的当前状态
根据目前所有输出:
| 项目 | 状态 |
|---|---|
| TCP动态端口 | 正常 |
| UDP动态端口 | 正常 |
| AutoTuning | 正常 |
| RSS | 已开启 |
| Hyper-V vRSS | 已开启 |
| 宿主机连接数 | 极低 |
| 万兆网利用率 | 极低 |
| NAT会话压力 | 不在宿主机 |
| TCP参数瓶颈 | 未发现 |
| 网络瓶颈 | 未发现 |
因此目前可以确定:
Get-NetTCPConnection | Measure-Object
得到的203
只能代表宿主机自身连接数
与虚拟机里的60万NAT会话没有直接关系
如果要评估那 60 万 NAT 会话对宿主机的影响,需要在晚高峰时采集 VM 所在虚拟交换机的 PPS、吞吐量和 CPU 中断数据,而不是看 TCP 连接数。
从你提供的 Ubuntu NAT 虚拟机数据来看,目前距离系统极限还非常远。
当前参数
1. 本地动态端口范围
cat /proc/sys/net/ipv4/ip_local_port_range
1024 65000
可用端口数:
65000 - 1024 + 1
= 63977 个
已经接近 Linux 推荐最大范围。
2. 当前 conntrack 会话数
conntrack -C
26223
即:
26223 个连接跟踪项
3. conntrack 上限
cat /proc/sys/net/netfilter/nf_conntrack_max
1048576
即:
1048576 个
≈ 104万
使用率计算
26223 / 1048576
≈ 2.5%
仅使用了:
2.5%
还有:
97.5%
剩余空间。
结论一:当前不存在 conntrack 瓶颈
如果系统因为 conntrack 满而出问题,会出现:
dmesg | grep conntrack
类似:
nf_conntrack: table full, dropping packet
而你目前:
26223 / 1048576
差距巨大。
结论二:当前不存在 Linux 端口耗尽
Linux NAT 最容易碰到的是:
源IP固定
+
端口耗尽
因为:
一个公网IP
最多约64000个源端口
你当前:
端口范围
1024~65000
≈63977个端口
已经足够大。
理论极限
如果:
1个公网IP
进行 SNAT:
10.1.1.1:50001
10.1.1.1:50002
...
理论最多:
63977 个并发连接
到同一个目标IP:PORT。
但 conntrack 有 104 万
为什么还能支持几十万连接?
因为:
不同目标IP
不同目标端口
可以复用源端口。
例如:
1.1.1.1:443
8.8.8.8:443
114.114.114.114:443
即使源端口相同也没问题。
conntrack 是按五元组区分的:
源IP
源端口
目的IP
目的端口
协议
如果你说高峰期有 60 万 NAT 会话
那么我建议高峰期查看:
查看实时 conntrack
watch -n 1 'conntrack -C'
或者:
while true
do
date
conntrack -C
sleep 5
done
查看 conntrack 使用率
echo $(( $(conntrack -C) * 100 / $(cat /proc/sys/net/netfilter/nf_conntrack_max) ))
查看连接状态
conntrack -S
重点看:
insert
insert_failed
drop
early_drop
如果:
insert_failed > 0
说明 conntrack 已经开始吃紧。
查看 TCP 状态分布
ss -ant | awk '{print $1}' | sort | uniq -c
或者:
ss -s
重点看:
ESTAB
TIME-WAIT
SYN-RECV
需要特别关注的一点
你前面提到:
2台 Windows Server 2025
Hyper-V
40台虚拟机
大量数据交互
如果承担 NAT 的是 Ubuntu 虚拟机,那么真正需要监控的不是:
Windows 动态端口
而是:
nf_conntrack_count
nf_conntrack_max
CPU softirq
网卡 PPS
TIME_WAIT 数量
SYN_RECV 数量
因为在大规模 NAT 场景中,最先出问题的通常是:
CPU软中断
>
conntrack
>
端口范围
而不是 Windows 宿主机的动态端口。
建议在晚上业务高峰时再执行下面这一组命令:
date
uptime
conntrack -C
cat /proc/sys/net/netfilter/nf_conntrack_max
ss -s
cat /proc/sys/net/ipv4/ip_local_port_range
sar -n DEV 1 5
mpstat -P ALL 1 5
从这些数据基本可以准确判断:
-
是否接近 60 万会话;
-
是否存在 conntrack 压力;
-
是否出现 CPU softirq 瓶颈;
-
是否需要继续扩大 conntrack 或优化 NAT 架构。