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个已建立连接基本属于:

级别。

所以:

宿主机没有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
单包大小

就能判断:


7. 你的当前状态

根据目前所有输出:

项目 状态
TCP动态端口 正常
UDP动态端口 正常
AutoTuning 正常
RSS 已开启
Hyper-V vRSS 已开启
宿主机连接数 极低
万兆网利用率 极低
NAT会话压力 不在宿主机
TCP参数瓶颈 未发现
网络瓶颈 未发现

因此目前可以确定:

Get-NetTCPConnection | Measure-Object
得到的203
只能代表宿主机自身连接数

与虚拟机里的60万NAT会话没有直接关系

如果要评估那 60 万 NAT 会话对宿主机的影响,需要在晚高峰时采集 VM 所在虚拟交换机的 PPS、吞吐量和 CPU 中断数据,而不是看 TCP 连接数。

图片.png

从你提供的 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

从这些数据基本可以准确判断:


Revision #3
Created 3 June 2026 09:47:48 by Admin
Updated 3 June 2026 09:56:52 by Admin