高并发的参数优化(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结束
View Code

 

posted on 2021-12-06 14:07  seamy  阅读(314)  评论(0编辑  收藏  举报