写在前面

  • 在执行性能测试(如用 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路由器/防火墙有可能会影响并发数,需差看下这些设备是否能抗住这么多的并发量,先排查瓶颈是否在这些设备上。。

参考:

性能测试:通过设置注册表提高 P2P/IIS 并发数的更多相关文章

  1. MS SQL xp_instance_regwrite设置注册表疑惑

      以前写过一篇博文"MS SQL 日志记录管理",里面介绍了如何设置SQL Server的错误日志的最大归档数量,如果在SSMS的UI界面设置,可以从"Manageme ...

  2. WinForm设置注册表自动启动

    string path = Application.StartupPath; SetAutoRun(path + @"\AppName.exe", true); /// <s ...

  3. 金蝶K3,域环境中,无本地用户管理员权限的域用户如何设置注册表权限?

    如果该用户是属于Power Users组:只需要给用户添加注册表中的HKEY_LOCAL_MACHINE的SOFTWARE完全控制的权限.(勾选允许父项的继承权限和传播到该对象和所有子对象) 如果该用 ...

  4. forms6 builder安装之后设置注册表开发环境

  5. 通过 rundll32 创建设置注册表项权限

    [Version]SIGNATURE="$Windows NT$" [DefaultInstall]AddReg=test.reg [test.reg]HKLM,"SOF ...

  6. windows 设置注册表服务自动启动

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\xxx\Start = ,=自动,,=禁用

  7. 如何绕过Win8、Win10的systemsetting与注册表校验设置默认浏览器

    *本文原创作者:浪子_三少,属Freebuf原创奖励计划,未经许可禁止转载 在win7时我们只需修改注册表就能设置默认浏览器,但是win8.win10下不能直接修改的因为同样的注册表项,win8.wi ...

  8. Windows Server 2008 IIS 并发请求设置

    更新服务器的时候,突然发现部分机器出现了错误,大致描述如下 HTTP Error 503.2 - Service Unavailable 正在超过 serverRuntime@appConcurren ...

  9. C#综合揭秘——通过修改注册表建立Windows自定义协议

    引言 本文主要介绍注册表的概念与其相关根项的功能,以及浏览器如何通过连接调用自定义协议并与客户端进行数据通信.文中讲及如何通过C#程序.手动修改.安装项目等不同方式对注册表进行修改.其中通过安装项目对 ...

随机推荐

  1. 自定义SWT控件六之自定义Tab

    6.自定义tab 本章节提供的自定义tab 分为两类 tab上带删除按钮和添加按钮,可删除tab和添加tab tab不可删除和添加 6.1 不可删除tab package com.view.contr ...

  2. Python基础总结之认识lambda函数、map函数、filter() 函数。第十二天开始(新手可相互督促)

    今天周日,白天在学习,晚上更新一些笔记,希望对大家能更好的理解.学习python~ lambda函数,也就是大家说的匿名函数.它没有具体的名称,也可以叫做一句话函数,我觉得也不过分,大家看下代码,来体 ...

  3. 数据结构-二叉搜索树和二叉树排序算法(python实现)

    今天我们要介绍的是一种特殊的二叉树--二叉搜索树,同时我们也会讲到一种排序算法--二叉树排序算法.这两者之间有什么联系呢,我们一起来看一下吧. 开始之前呢,我们先来介绍一下如何创建一颗二叉搜索树. 假 ...

  4. python多线程与多进程及其区别

    个人一直觉得对学习任何知识而言,概念是相当重要的.掌握了概念和原理,细节可以留给实践去推敲.掌握的关键在于理解,通过具体的实例和实际操作来感性的体会概念和原理可以起到很好的效果.本文通过一些具体的例子 ...

  5. 不用 Spring Security 可否?试试这个小而美的安全框架

    写在前面 在一款应用的整个生命周期,我们都会谈及该应用的数据安全问题.用户的合法性与数据的可见性是数据安全中非常重要的一部分.但是,一方面,不同的应用对于数据的合法性和可见性要求的维度与粒度都有所区别 ...

  6. caddy & grpc(3) 为 caddy 添加一个 反向代理插件

    caddy-grpc 为 caddy 添加一个 反向代理插件 项目地址:https://github.com/yhyddr/caddy-grpc 前言 上一次我们学习了如何在 Caddy 中扩展自己想 ...

  7. 解读 PHP 的 P++提案

    解读 PHP 的 P++提案 周末看到一篇文章说 PHP 创始人提议将 PHP 拉出新分支,创建 P++ 语言.随后阅读了一下 Zeev Suraski 发起的这个邮件列表,大致了解了一下,这里做个解 ...

  8. java优雅注释原则和代码格式列举

    一.java的三种注释类型 单行注释:// ...... 块注释:/* ...... */ 文档注释:/** ...... */ 二.指导原则 注释不能美化糟糕的代码,碰到糟糕的代码就重新写吧. 用代 ...

  9. spark sql/hive小文件问题

    针对hive on mapreduce 1:我们可以通过一些配置项来使Hive在执行结束后对结果文件进行合并: 参数详细内容可参考官网:https://cwiki.apache.org/conflue ...

  10. 解决Selenium弹出新页面无法定位元素问题(Unable to locate element)

    Python 2.7 IDE Pycharm 5.0.3 环境细节详见Python+Selenium+PIL+Tesseract真正自动识别验证码进行一键登录 对于同一页面无法定位元素问题请见姊妹篇解 ...