tcpip来源事件ID 4227/4231/4266 调大动态端口范围

2024-07-18 10:05:27 浏览数 (1)

典型场景:访问数据库异常,报错

An operation on a socket could not be performed because the system lacked sufficient buffer space or because a queue was full

由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作

端口耗尽、端口释放频率赶不上端口请求频率的情况下才会报这个,重启机器能解决问题,不重启执行扩大动态端口范围的命令也能解决

当系统出现这些典型报错和 4227/4231/4266等事件ID时 ,此时用户态的netstat过滤已经没有参考价值

参考https://cloud.tencent.com/developer/article/1850776

执行这2句命令看动态端口范围

netsh int ipv4 show dynamicport tcp

netsh int ipv4 show dynamicport udp

默认的范围并不大,下图2个值分别是起点端口和端口数,端口范围是【49152,65535】

以管理员身份在powershell执行Get-EventLog -LogName System -Source Tcpip -ErrorAction SilentlyContinue |Where-Object {$_.EventID -eq "4227" -or $_.EventID -eq "4231" -or $_.EventID -eq "4266"} |FT TimeGenerated,EventID,EntryType,Source,Message

过滤到了就肯定有问题,需要优化,看具体情况,过滤到tcp就优化tcp,过滤到udp就优化udp

参考https://blog.csdn.net/u010133338/article/details/80961256

下图过滤到了TCP,执行:

netsh int ipv4 set dynamicport tcp start=5001 num=60535

下图过滤到了udp,那就优化udp,跟优化tcp的命令就协议的差别,例如

netsh int ipv4 set dynamicport udp start=5001 num=60535

如果过滤到相关tcpip来源的日志,过滤到了就调大动态端口范围即可,不用管netstat看到的多少。

这是我曾经咨询微软时的一个答复

netstat -ano看到端口不多的疑问,是因为netstat看到的是user-mode的端口,可能在kernel-mode中AFD的端口已经耗尽,TCP/IP已经无法申请了。因此netstat并不准确。如果复现故障,可以按如下方法收集信息,方便定位root cause。

下载微软handle.exe工具到故障服务器。下载页面:https://docs.microsoft.com/en-gb/sysinternals/downloads/handle

新建c:handle文件夹,解压到该文件夹

在发生故障时,按如下方式收集信息

用管理员运行cmd

wevtutil epl System c:system.evtx

wevtutil epl Application c:app.evtx

netstat -anbo > c:netstat.txt

powershell.exe Get-process >c:process.txt

cd c:handle

handle64.exe -a afd >c:handle.txt

调大动态端口范围,不用重启机器;改TcpTimedWaitDelay,需要重启机器。

以优化tcp为例

netsh int ipv4 show dynamicport tcp 可以先用这句命令查下当前的动态端口范围,显示的2个数,分别是起点、总数,终点即是起点 总数-1,例如下图,动态端口范围即是[5001,65535]

netsh int ipv4 set dynamicport tcp start=5001 num=60535

reg add "HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesTcpipParameters" /v "TcpTimedWaitDelay" /t REG_DWORD /d 30 /f

这2句调整的是下面2个注册表

HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesTcpipParameters

"MaxUserPort"=dword:0000f077

"TcpTimedWaitDelay"=dword:0000001e

改TcpTimedWaitDelay需要重启机器

注意:在win10和server2019的系统里,当执行调整tcp动态端口范围的命令时,不会自动生成MaxUserPort,无需人为干预,操作系统已经隐藏MaxUserPort;在<win10和<server2019的系统里,执行调整tcp动态端口范围的命令时,会自动生成MaxUserPort。

MaxUserPort并不是最大用户端口号,而是最大用户端口数,其算法是tcp动态端口范围包含的端口数 1024。

比如执行netsh int ipv4 set dynamicport tcp start=10000 num=55535 ,tcp动态端口范围是10000~65534,共55535个端口,MaxUserPort是55535 1024=56559

如果执行netsh int ipv4 set dynamicport tcp start=49152 num=16384复原最初的动态范围会自动生成MaxUserPort=17408,tcp动态端口范围是49152 ~65535,共16384个端口,MaxUserPort是16384 1024=17408

我一般采用dynamicport tcp 5001~65535,即执行netsh int ipv4 set dynamicport tcp start=5001 num=60535

外加

<2012R2和Win8.1的系统,执行:

reg add "HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesTcpipParameters" /v "TcpTimedWaitDelay" /t REG_DWORD /d 30 /f

≥2012R2和Win8.1的系统,执行:

reg add "HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesTcpipParameters" /v "TcpTimedWaitDelay" /t REG_DWORD /d 2 /f

Key:

HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesTcpipParameters

Value:

TcpTimedWaitDelay

Data Type:

REG_DWORD

Range:

Windows Server 2012 and earlier: 30-300 (decimal)Windows 8 and earlier: 30-300 (decimal)Windows Server 2012 R2 and later: 2-300 (decimal)Windows 8.1 and later: 2-300 (decimal)

Default value:

0x78 (120 decimal)

Recommended value:

30

Value exists by default?

No, needs to be added.

0 人点赞