性能测试:通过设置注册表提高 P2P/IIS 并发数
写在前面
- 在执行性能测试(如用 JMeter 直接压接口)的时候,有的时候并发数上不去、本机大面积出现 TCP 状态为 TIME_WAIT,除了放开 TCP 端口数和调整默认 TCP 释放时间外,另外几个注册表项同样重要且需要调整。
- 以下设置项针对的是本机和远端机。
- 设置完成后,重启下电脑使生效。
增加TCP 连接数:TcpNumConnections
[HKLM\System\CurrentControlSet\Services\Tcpip\Parameters]
TcpNumConnections = 16777214 # DWORD 值,默认值 16777214
增加动态端口数量
- 当客户端与服务器连接时,客户端将 socket 连接绑定到本地动态端口号(匿名,短暂)。
- Windows中动态端口的默认范围是 1025 到 5000,因此为每个IP地址提供 3976 个出站并发连接。
[HKLM\System\CurrentControlSet\Services\Tcpip\Parameters]
MaxUserPort = 65534 # DWORD值,设置成 65534 即可。
P.S.:
- vista和 server 2008 保留端口的动态端口号莫默认范围已经改为 49152-65535。
- 在基于 server 2008 的 Microsoft Exchange Server 2007,默认端口范围为 1025-60000
查看、设置 TCP / UDP 命令
# 查看 TCP / UDP 数量命令
netsh int ipv4 show dynamicport tcp
netsh int ipv4 show dynamicport udp
netsh int ipv6 show dynamicport tcp
netsh int ipv6 show dynamicport udp
# 设置
netsh int ipv4 set dynamicport tcp start=10000 num=1000
netsh int ipv4 set dynamicport udp start=10000 num=1000
netsh int ipv6 set dynamicport tcp start=10000 num=1000
netsh int ipv6 set dynamicport udp start=10000 num=1000
# 说明
# 最小设置端口范围位 255
# 最小起始端口号:1025
# 最大结束端口号:65534
调整 TCB 控制块
- TCB:TCP Control Block:TCP 控制块:一个拥有 0.5Kb 分页池 和 0.5Kb 非分页池吃的数据结构【这个是个什么东西?】
- 每个 TCP连接 都会维护一个 TCB。
- TCB 会被预分配并存储在表中,以避免 每次创建/关闭连接 时在 分配/取消分配 TCB 上花费时间。
- TCB 表支持 重用、缓存并改善内存管理(但注册表项配置的值限制了TCP能够支持的连接数(ACTIVE 和 TIME_WAIT 状态的连接),故这里也需要调整下)
更改 TCB 表的大小
[HKLM\System\CurrentControlSet\Services\Tcpip\Parameters]
MaxFreeTcbs = 2000 # DWORD值,默认值依赖于内存,一般设置成 2000 即可
TCB 哈希表
- 为了加快在 TCB表 中的搜索,系统会创建一张 哈希表,用于优化索引。
- 如果该 hash 表小于总的有效连接数,那么会占用 CPU 去搜索,为此需要配置下该 hash 表的大小
# 多核下,该值不应大于最大并发连接数(不应大于TCP表设置的值:MaxFreeTcbs)
[HKLM\System\CurrentControlSet\Services\Tcpip\Parameters]
MaxHashTableSize = 2000 # DWORD值,默认512,可选范围:64-65536,一般跟 MaxFreeTcbs 保持一致即可
NumTcbTablePartitions
- 多核情况下,该键值也需要设置下,一般 "CPU数量*4"
[HKLM\System\CurrentControlSet\Services\Tcpip\Parameters]
NumTcbTablePartitions = 16 # DWORD值,按实际 CPU核心数*4 设置
设置 TcpTimedWaitDelay
- 该键值表示一个 connection 在被释放重用前,可以处于 TIME_WAIT 状态多长时间。
- TIME_WAIT:一个 connection 关闭后会进入 TIME_WAIT 状态,并且在实际释放之前继续占用该端口号 240s。
- TIME_WAIT 表示的是 "本地" 主动关闭连接,表示的是当前主机,而非远端主机。
[HKLM\System\CurrentControlSet\Services\Tcpip\Parameters]
TcpTimedWaitDelay = 30 # DWORD值,默认值 240s,可选范围:30-300
设置 KeepAliveTime
- 如果应用程序没有实现超时检查,如 HttpClient,则超时检查会依赖于 TcpIp 所设置的 KeepAliveTime 项
- TcpIp 超时检查默认情况下每 2 小时会执行一次------发送保持活动的数据包。
[HKLM\System\CurrentControlSet\Services\Tcpip\Parameters]
KeepAliveTime = 1800000 (Default = 7,200,000 milisecs)
其他:
- MaxBufferredReceiveBytes 和 RWIN(这块我未做处理,你可以试试)
- 发送和接受数据的时候,会在 非分页池内存 中进行缓冲,如果传输数据量大的话,会消耗 非分页池内存。
- 每一个 connection 所预分配的 非分页池 缓冲大小由 MaxBufferredReceiveBytes 和 RWIN 进行决定,取两者较小的数值。
- NAT路由器/防火墙有可能会影响并发数,需差看下这些设备是否能抗住这么多的并发量,先排查瓶颈是否在这些设备上。。
参考:
- 关于性能监视器的使用,请参见:https://blog.zhuliang.ltd/2019/08/Performance/test-with-perfmon.html
- https://support.microsoft.com/en-us/help/929851/the-default-dynamic-port-range-for-tcp-ip-has-changed-in-windows-vista
- http://smallvoid.com/article/winnt-tcpip-max-limit.html
- http://smallvoid.com/article/tcpip-rwin-size.html
- http://smallvoid.com/article/winnt-kernel-memory.html
- https://bridge360blog.com/2017/01/02/tuning-a-windows-server-for-high-performance-applications/
性能测试:通过设置注册表提高 P2P/IIS 并发数的更多相关文章
- MS SQL xp_instance_regwrite设置注册表疑惑
以前写过一篇博文"MS SQL 日志记录管理",里面介绍了如何设置SQL Server的错误日志的最大归档数量,如果在SSMS的UI界面设置,可以从"Manageme ...
- WinForm设置注册表自动启动
string path = Application.StartupPath; SetAutoRun(path + @"\AppName.exe", true); /// <s ...
- 金蝶K3,域环境中,无本地用户管理员权限的域用户如何设置注册表权限?
如果该用户是属于Power Users组:只需要给用户添加注册表中的HKEY_LOCAL_MACHINE的SOFTWARE完全控制的权限.(勾选允许父项的继承权限和传播到该对象和所有子对象) 如果该用 ...
- forms6 builder安装之后设置注册表开发环境
- 通过 rundll32 创建设置注册表项权限
[Version]SIGNATURE="$Windows NT$" [DefaultInstall]AddReg=test.reg [test.reg]HKLM,"SOF ...
- windows 设置注册表服务自动启动
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\xxx\Start = ,=自动,,=禁用
- 如何绕过Win8、Win10的systemsetting与注册表校验设置默认浏览器
*本文原创作者:浪子_三少,属Freebuf原创奖励计划,未经许可禁止转载 在win7时我们只需修改注册表就能设置默认浏览器,但是win8.win10下不能直接修改的因为同样的注册表项,win8.wi ...
- Windows Server 2008 IIS 并发请求设置
更新服务器的时候,突然发现部分机器出现了错误,大致描述如下 HTTP Error 503.2 - Service Unavailable 正在超过 serverRuntime@appConcurren ...
- C#综合揭秘——通过修改注册表建立Windows自定义协议
引言 本文主要介绍注册表的概念与其相关根项的功能,以及浏览器如何通过连接调用自定义协议并与客户端进行数据通信.文中讲及如何通过C#程序.手动修改.安装项目等不同方式对注册表进行修改.其中通过安装项目对 ...
随机推荐
- DesignPattern系列__03依赖倒置原则
依赖倒置原则(Dependence Inversion Priiciple,DIP) 介绍 High level modules should not depend upon low level mo ...
- Qt Socket 收发图片——图像拆包、组包、粘包处理
之前给大家分享了一个使用python发图片数据.Qt server接收图片的Demo.之前的Demo用于传输小字节的图片是可以的,但如果是传输大的图片,使用socket无法一次完成发送该怎么办呢?本次 ...
- JDK1.8源码分析03之idea搭建源码阅读环境
序言:上一节说了阅读源码的顺序,有了一个大体的方向,咱们就知道该如何下手.接下来,就要搭建一个方便阅读源码及debug的环境.有助于跟踪源码的调用情况. 目前新开发的项目, 大多数都是基于JDK1.8 ...
- Unity基础之:UnityAPI的学习
版权声明: 本文原创发布于博客园"优梦创客"的博客空间(网址:http://www.cnblogs.com/raymondking123/)以及微信公众号"优梦创客&qu ...
- Linux curl 命令详解
命令概要 该命令设计用于在没有用户交互的情况下工作. curl 是一个工具,用于传输来自服务器或者到服务器的数据.「向服务器传输数据或者获取来自服务器的数据」 可支持的协议有(DICT.FILE.FT ...
- xpath爬虫实例,爬取图片网站百度盘地址和提取码
某套图网站,套图以封面形式展现在页面,需要依次点击套图,点击广告盘链接,最后到达百度网盘展示页面. 这一过程通过爬虫来实现,收集百度网盘地址和提取码,采用xpath爬虫技术 1.首先分析图片列表页,该 ...
- 解决oh-my-zsh中git分支显示乱码问题
oh-my-zsh显示github分支时,如果当前文件夹不是git仓库,它就会显示乱码.倒腾了好几个小时终于弄清楚是oh-my-zsh中函数”git_prompt_info“的锅,然后又花了半个多小时 ...
- C++这么难,为什么还要学习C++呢?如何学?
在大多数开发或者准开发人员的认识中,C/C++ 是一门非常难的编程语言,很多人知道它的强大,但因为认为“难”造成的恐惧让很多人放弃. 这个世界本来就是残酷的,所以你不能怪C++向你展示了世界的本质 大 ...
- Maven多模块项目打包前的一些注意事项(打包失败)
一. 最近在打包Maven项目时遇到了点问题,这个项目是Maven多模块项目,结构如下: projectParent├── xxxx-basic├── xxxx-web1├── xxxx-collec ...
- HelloDjango 第 09 篇:让博客支持 Markdown 语法和代码高亮
作者:HelloGitHub-追梦人物 文中涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库 为了让博客文章具有良好的排版,显示更加丰富的格式,我们使用 Markdown 语法来书 ...