在windows环境下搭建jmeter的压测实验环境,需要对操作系统默认的一些个参数进行设置,以提高并发能力。特别是作为压力机的时候。
Socket 编程时,单机最多可以建立多少个 TCP 连接,受到操作系统的影响。
Windows 下单机的TCP连接数受多个参数影响:
2. Windows Jmeter端口不够用
- 报错: jmeter Address already in use: connect
- 原因: windows 环境下的端口环回收需要消耗2~4分钟。由此猜测可能是由于 windows下压测端口数有限,端口资源被占满,没有及时循环回收,导致报错
- 解决办法
- 扩大端口数量
- 提高端口使用率
- 优化
- 修政注册表。HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Sevices\Tcpip\Parameters 右键新建参数(DWORD),并设置值
- 扩大端口数量
- MaxUserPort 十进制 65534
- 提高端口使用率
- TcpTimedWaitDelay 十进制 30
- KeepAliveTime 006ddd00
- KeepAlivelnterval 000003e8
- MaxDataRetries 5
1. 最大TCP连接数
[HKEY_LOCAL_MACHINE \System \CurrentControlSet \Services \Tcpip \Parameters] TcpNumConnections = 0x00fffffe (Default = 16,777,214)
以上注册表信息配置单机的最大允许的TCP连接数,默认为 16M。这个数值看似很大,这个并不是限制最大连接数的唯一条件,还有其他条件会限制到TCP 连接的最大连接数。
windows7 机器最大连接数修改:
- Win+R运行regedit;
- 找到HKEY_LOCAL_MACHINESYSTEM\CurrentControlSet\Services\Tcpip\Parameters;
- 在右侧面板中找到EnableConnectionRateLimiting将值设置为0(无限制)
2. 最大动态端口数
TCP客户端和服务器连接时,客户端必须分配一个动态端口,默认情况下这个动态端口的分配范围为 1024-5000 ,也就是说默认情况下,客户端最多可以同时发起3977 个Socket 连接。我们可以修改如下注册表来调整这个动态端口的范围
[HKEY_LOCAL_MACHINE \System \CurrentControlSet \Services \Tcpip \Parameters] MaxUserPort = 5000 (Default = 5000, Max = 65534)
3. 最大TCB 数量
系统为每个TCP 连接分配一个TCP 控制块(TCP control block or TCB),这个控制块用于缓存TCP连接的一些参数,每个TCB需要分配 0.5 KB的pagepool 和 0.5KB 的Non-pagepool,也就说,每个TCP连接会占用 1KB 的系统内存。
系统的最大TCB数量由如下注册表设置决定
[HKEY_LOCAL_MACHINE \System \CurrentControlSet \Services \Tcpip \Parameters] MaxFreeTcbs = 2000 (Default = RAM dependent, but usual Pro = 1000, Srv=2000)
非Server版本,MaxFreeTcbs 的默认值为1000 (64M 以上物理内存)
Server 版本,这个的默认值为 2000。
也就是说,默认情况下,Server 版本最多同时可以建立并保持2000个TCP 连接。
4. 最大TCB Hash table 数量
TCB 是通过Hash table 来管理的,下面注册表设置决定了这个Hash table 的大小
HKEY_LOCAL_MACHINE \System \CurrentControlSet \services \Tcpip \Parameters] MaxHashTableSize = 512 (Default = 512, Range = 64-65536)
这个值指明分配 pagepool 内存的数量,也就是说,如果 MaxFreeTcbs = 1000 , 则 pagepool 的内存数量为 500KB
那么 MaxHashTableSize 应大于 500 才行。这个数量越大,则Hash table 的冗余度就越高,每次分配和查找 TCP 连接用时就越少。这个值必须是2的幂,且最大为 65536.
5. nginx 最大连接数设置:
1. 打开nginx配置文件 nginx.conf
设置worker_connections为64000和keepalive_timeout为60s,如下图所示
6. jmeter设置
6.1 JVM等调优
根据自己机器的配置设置如下参数,下面参数的参数值仅做参考。
配置文件在 jmeter.home/bin的jmeter及jmeter.sh文件。
设置JVM大小: bin/jmeter文件,heap大小不要超过系统内存的2/3.
- jmeler是基于iava请求的,所以该进程需要制定特定的JVM设置
- jmeter自身进行gc也会对结果产生影响,经常遇到负载机会出现卡死的情况,报错内存溢出
因此需要针对JVM进行调优。
- vi jmeter
- 注释掉
- HEAP="-Xms2g -Xmx2g -XX:MaxMetaspaceSize=512m"
- java $ARGS $JVM_ARGS $JMETER_OPTS -jar "$PRGDIR/ApacheJMeter.jar" "$@"
- 修改jmeter 运行的jvm内存, 在最后一行添加
- java $JVM_ARGS -Xms2G -Xmx8G -XX:MaxPermSize=512m -Dapple.laf.useScreenMenuBar=true -jar `dirname $0`/ApacheJMeter.jar "$@"
- vi jmeter.sh
- 设置 JVM_ARGS="-Xms2g -Xmx2g -XX:MaxMetaspaceSize=512m"
打开jmeter.properties,查找 httpclient4.idletimeout ,将其值设置为10-60s
httpclient4.idletimeout=10000 (这里指的毫秒)
7. 界面永久修改为中文
修改jmeter.bat文件(修改后重启)
使用编辑器打开JMeter启动文件 jmeter.bat
将
set JMETER_LANGUAGE=-Duser.language="en" -Duser.region="EN"
修改成
set JMETER_LANGUAGE=-Duser.language="zh" -Duser.region="CN"
保存代码