高并发的参数优化(Tomcat、数据库、linux服务器)
前言:性能测试开始前,需先检查应用中间件和系统的参数设置,并对相关参数进行适当调整,如:Tomcat的JAVA虚拟机、线程池、数据源连接池,以确保测试执行的有效性。
一、Tomcat参数优化
1、内存
修改文件bin/catalina.sh
JAVA_OPTS="-Xms1024m -Xmx4096m -Xss1024K -XX:MaxNewSize=512m -XX:MaxPermSize=2048m"
参数说明:
-Xms:初始内存大小
-Xmx:最大内存
-Xss:每个线程所消耗的内存大小,默认值为512K
-XX:PermSize:设定内存的永久保存区初始大小,默认为64M(永久是指方法区、永久代,还有年轻代、老年代)
-XX:MaxPermSize:设定内存永久保存区最大大小,默认为64M
最好把初始内存大小(Xms)和最大内存(Xmx)设置成一样。
建议“堆”的大小设置成物理内存的80%。
验证配置是否生效:
1) 查看Tomcat进程号
ps -ef | grep noah
![](https://img2020.cnblogs.com/blog/926709/202112/926709-20211206140620681-674805273.png)
2) 查看配置是否生效
jmap -heap 20747
![](https://img2020.cnblogs.com/blog/926709/202112/926709-20211206140626100-13981680.png)
Tomcat 内存溢出以及调整
1. java.lang.OutOfMemoryError: Java heap space ----JVM Heap(堆)溢出
a) 释义:
1.JVM在启动的时刻会自动设置JVM heap的值,其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)不可能超过物理内存;
2.可以利用JVM提供的 -Xmn -Xms -Xmx等选项进行设置;
3.heap的大小是年轻代(Young Generation)和年老代(Tenured Generaion)之和;
4.在JVM中如果98%的时间用于GC,且可用的heap size不足2%的时刻将抛出此异常信息;
b) 解决:
1.手动设置MaxPermSize的大小
2.JAVA_OPTS="-server -Xms256m -Xmx512m -XX:PermSize=64M -XX:MaxPermSize=128m"
2. java.lang.OutOfMemoryError: PermGen space ---- PermGen space溢出
a) 释义:
1.PermGen Space全程是Permanent Generation space,是指内存的永久保存区域;
2.这里内存溢出的原因是因为这块内存主要是被JVM存放class和meta信息的,class在被load的时刻被放入PermGen Space区域;
3.PermGen Space区域与存放instance的heap区域不同,GC不会在主程序运行期间对PermGen Space进行清理;
4.基于以上原因,如果你的APP会载入很多class的话,就很可能出现PermGen Space溢出;
b) 解决:
1.手动设置MaxPermSize大小
3.java.lang.StackOverflowError ---- 栈溢出
a) 释义:
1.JVM采用的是栈式虚拟机,函数的调用过程都体现在堆栈和退栈上;
2.调用构造函数的"层"太多了,以至于把栈区溢出了;
b) 解决:
1.修改程序
4.java.lang.OutOfMemoryError: GC overhead limit exceeded
a) 这里的意思是指JVM溢出
b) 增加参数,-XX:-UseGCOverheadLimit,关闭这个特性,同时增加heap大小,-Xmx1024m
2、线程池
修改文件conf/server.xml
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="2000" minSpareThreads="500"/>
<Connector executor="tomcatThreadPool"
port="8081" protocol="HTTP/1.1"
acceptCount="7000"
connectionTimeout="20000"
redirectPort="8443" />
参数说明:
maxThreads=“600" 表示最多同时处理600个连接最大线程数
minSpareThreads=“100" 表示即使没有人使用也开这么多空线程等待,初始化时创建的线程数
maxSpareThreads=“500" 表示如果最多可以空500个线程,例如某时刻有505人访问,之后没有人访问了,则tomcat不会保留505个空线程,而是关闭505个空的。 一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程。
acceptCount="700" 指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理
参考链接:https://blog.csdn.net/xiaoxudong666/article/details/79688941
3、连接池
系统数据库连接池配置,找到最优配置
二、数据库最大连接数
需确认数据库最大连接数
三、linux内核参数优化(服务器和压测机)
查看参数值命令:cat /proc/sys/net/ipv4/参数名或cat /proc/sys/net/core/参数名,示例:cat /proc/sys/net/ipv4/tcp_syncookie或cat /proc/sys/net/core/rmem_max
查看系统级的最大限制命令:cat /proc/sys/fs/file-max
1、修改文件vim /etc/sysctl.conf,执行生效命令:sysctl -p
#表示开启重用。允许将TIME-WAITsockets重新用于新的TCP连接,默认为0,表示关闭;
net.ipv4.tcp_tw_reuse = 1
#修改系統默认的TIMEOUT时间,默认为60
net.ipv4.tcp_fin_timeout = 30
#tcp_tw_recycle默认是0
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_timestamps=1(系统默认值无需修改)
#减少超时前的探测次数,默认为9
net.ipv4.tcp_keepalive_probes = 5
#确定两次isAlive时间间隔探测之间的等待时间,默认为75
net.ipv4.tcp_keepalive_intvl = 15
#调整系统同时发起连接的tcp连接数,netdev_max_backlog默认为1000,somaxconn默认为128
net.core.netdev_max_backlog = 3000
net.core.somaxconn = 3000
#减少TCPKeepAlive连接侦测的时间,使系统可以处理更多的连接。默认为7200
net.ipv4.tcp_keepalive_time = 1800
#增加TCPSYN队列长度,使系统可以处理更多的并发连接。默认为2048
net.ipv4.tcp_max_syn_backlog = 8192
#优化TCP接收/发送缓冲区,默认为4096 16384 4194304
net.ipv4.tcp_rmem = 8192 419430 48388608
net.ipv4.tcp_wmem = 8192 419430 48388608
#优化系统套接字缓冲区,默认值4194304
net.core.rmem_max = 8388608
net.core.wmem_max = 8388608
#表示用于向外连接的端口范围。默认值32768 61000
net.ipv4.ip_local_port_range = 1024 65000
#表示系统同时保持TIME_WAIT的最大数量,如果超过这个数字,TIME_WAIT将立刻被清除并打印警告信息。默认为180000
net.ipv4.tcp_max_tw_buckets = 6000
#在最后加入。默认值30720
fs.file-max = 6553560
2、修改文件vim /etc/security/limits.conf(解决Too many open files)
vim /etc/security/limits.conf
#在最后加入soft默认1024,hard默认65536
root soft nofile 819200
root hard nofile 819200
Xshell重新登录执行命令ulimit -a 查看open files的值是否819200
可直接复制以下beanshell脚本至sh文件中,如命令xntest.sh,然后上传对应服务器,授权文件权限777,然后执行
chmod 777 xntest.sh
./xntest.sh
#!/bin/bash #author:JiangMeiying #说明:高并发linux内核修改 echo sysctl开始 cat >> /etc/sysctl.conf << EFF #################################### #表示开启重用。允许将TIME-WAITsockets重新用于新的TCP连接,默认为0,表示关闭; net.ipv4.tcp_tw_reuse = 1 #修改系統默认的TIMEOUT时间,默认为60 net.ipv4.tcp_fin_timeout = 30 #tcp_tw_recycle默认是0 net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_timestamps=1 #减少超时前的探测次数,默认为9 net.ipv4.tcp_keepalive_probes = 5 #确定两次isAlive时间间隔探测之间的等待时间,默认为75 net.ipv4.tcp_keepalive_intvl = 15 #调整系统同时发起连接的tcp连接数,netdev_max_backlog默认为1000,somaxconn默认为128 net.core.netdev_max_backlog = 3000 net.core.somaxconn = 3000 #减少TCPKeepAlive连接侦测的时间,使系统可以处理更多的连接。默认为7200 net.ipv4.tcp_keepalive_time = 1800 #增加TCPSYN队列长度,使系统可以处理更多的并发连接。默认为2048 net.ipv4.tcp_max_syn_backlog = 8192 #减少处于FIN-WAIT-2连接状态的时间,使系统可以处理更多的连接。默认为60 net.ipv4.tcp_fin_timeout = 30 #优化TCP接收/发送缓冲区,默认为4096 16384 4194304 net.ipv4.tcp_rmem = 8192 419430 48388608 net.ipv4.tcp_wmem = 8192 419430 48388608 #优化系统套接字缓冲区,默认值4194304 net.core.rmem_max = 8388608 net.core.wmem_max = 8388608 #表示用于向外连接的端口范围。默认值32768 61000 net.ipv4.ip_local_port_range = 22768 65535 net.ipv4.ip_local_port_range = 1024 65000 #表示系统同时保持TIME_WAIT的最大数量,如果超过这个数字,TIME_WAIT将立刻被清除并打印警告信息。默认为180000 net.ipv4.tcp_max_tw_buckets = 6000 #在最后加入。默认值30720 fs.file-max = 6553560 #################################### EFF #修改后执行生效命令 sysctl -p echo sysctl结束 echo limits开始 cat >> /etc/security/limits.conf << EFF root soft nofile 819200 root hard nofile 819200 EFF echo limits结束