1、Tomcat并发优化
打开tomcat安装目录\conf\server.xml文件,配置Connector,定位到这一行:
在server.xml中 有以下配置:
<Connector port="8080" protocol="HTTP/1.1"
maxThreads="1000"
acceptCount="1500"
connectionTimeout="20000"
redirectPort="8443" />
参数说明:
maxThreads 客户请求最大线程数
minSpareThreads Tomcat初始化时创建的 socket 线程数
maxSpareThreads Tomcat连接器的最大空闲 socket 线程数
enableLookups 若设为true, 则支持域名解析,可把 ip 地址解析为主机名
redirectPort 在需要基于安全通道的场合,把客户请求转发到基于SSL 的 redirectPort 端口
acceptAccount 监听端口队列最大数,满了之后客户请求会被拒绝(不能小于maxSpareThreads )
connectionTimeout 连接超时
minProcessors 服务器创建时的最小处理线程数
maxProcessors 服务器同时最大处理线程数
URIEncoding URL统一编码
2、数据库连接池
方法一: 在Tomcat的conf/context.xml中配置
在Tomcat\apache-tomcat-6.0.33\conf目录下的context.xml文件中配置默认值如下:
<?xml version='1.0' encoding='utf-8'?>
<Context>
<WatchedResource>WEB-INF/web.xml</WatchedResource>
</Context>
配置连接池:
<?xml version='1.0' encoding='utf-8'?>
<Context>
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<!--配置oracle数据库的连接池-->
<Resource name="jdbc/oracleds"
author="Container"
type="javax.sql.DataSource"
maxActive="100"
maxIdle="30"
maxWait="10000"
username="scott"
password="tiger"
driverClassName="oracle.jdbc.dirver.OracleDriver"
url="jdbc:oracle:thin:@127.0.0.1:1521:ora9" />
<!--配置mysql数据库的连接池—>
<Resource name="jdbc/mysqlds"
auth="Container"
type="javax.sql.DataSource"
username="root"
password="root"
maxIdle="30"
maxWait="10000"
maxActive="100"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://127.0.0.1:3306/db_blog" />
备注:配置mysql数据库的连接池, 需要做的额外步骤是将mysql的Java驱动类放到tomcat的lib目录下 。
配置好后需要注意的两个步骤
1.将对应数据库的驱动类放到tomcat的lib目录下
2.重新启动tomcat服务器,让配置生效
在web应用程序的web.xml中设置数据源参考,如下:
在节点中加入下面内容
<resource-ref>
<description>mysql数据库连接池</description>
<!-- 参考数据源名字,同Tomcat中配置的Resource节点中name属性值"jdbc/mysqlds"一致 -->
<res-ref-name>jdbc/mysqlds</res-ref-name>
<!-- 资源类型 -->
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>
参数含义:
maxIdle 连接池中最多可空闲maxIdle个连接
minIdle 连接池中最少空闲maxIdle个连接
initialSize 初始化连接数目
maxWait 连接池中连接用完时,新的请求等待时间,毫秒
username 数据库用户名
password 数据库密码
3、HttpClient连接池
由程序自定义,注意:每个路由的最大连接数指到同一个主机(IP)的连接数,当被测内容为同一个IP时,最大连接数和每个路由的最大连接数建议相同
//连接管理器,使用无惨构造
PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager();
//最大连接数
connManager.setMaxTotal(200);
//默认的每个路由的最大连接数
connManager.setDefaultMaxPerRoute(100);
//设置到某个路由的最大连接数,会覆盖defaultMaxPerRoute
connManager.setMaxPerRoute(new HttpRoute(new HttpHost("somehost", 80)), 150);
4、Redis连接池
由程序自定义
public static void main(String[] args) {
//首先如果想使用Jedis连接池,则必须有一个类可以保存所有连接池相关的属性的配置项
JedisPoolConfig poolConfig=new JedisPoolConfig();
poolConfig.setMaxTotal(1000);//设置最大连接数
poolConfig.setMaxIdle(200); //设置空闲的连接数
poolConfig.setMaxWaitMillis(1000); //设置最大的等待时间
…
标题5、数据库连接数
方式一:修改MySQL最大连接数
/etc/my.cnf文件,max_connections=1000
,重启MySQL数据库
方式二:修改Oracle的processes和sessions值
SQL> alter system set processes=300 scope=spfile;
SQL> alter system set sessions=335 scope=spfile;
重启oracle服务器才能生效
ORACLE的连接数(sessions)与其参数文件中的进程数(process)有关,它们的关系如下:
sessions=(1.1*process+5)
6、Redis连接数
redis.conf文件
maxclients 20000
#2.6之后版本,可以修改最大连接数配置,默认10000
7、SpringBoot项目集成配置连接池
使用SpringBoot部署的项目,可在application.yaml配置文件中实现对线程池、数据库连接池、redis连接池、HttpClient连接池等进行集成配置
8、Nginx连接数
nginx/nginx.conf文件
worker_processes 1; #nginx 进程数,建议为CPU核数
worker_rlimit_nofile 65535; #一个nginx 进程打开的最多文件,可与ulimit -n一致,65535
worker_connections 1024; #每个进程允许的最大连接数
keepalive_timeout60; #长连接超时时间。
9、操作系统最大文件打开数
/etc/security/limits.conf
soft nofile 65536 # open files (-n)
hard nofile 65536
soft nproc 65565 hard nproc 65565 # max user processes (-u)
10、TCP端口数量
高并发下可能会出现TCP端口数量不够用的情况,最高为65535,可以通过调整内核参数可以解决这个问题
/etc/sysctl.conf
net.ipv4.tcp_syncookies=1 # 开启SYN Cookies。当出现SYN等待队列溢出时,启用cookie来处理,可防范少量的SYN攻击
net.ipv4.tcp_tw_recycle=1 # 开启TCP连接中TIME-WAIT套接字的快速回收
net.ipv4.tcp_tw_reuse=1 # 开启重用。允许将TIME-WAIT套接字重新用于新的TCP连接
net.ipv4.tcp_timestamps=1 # 减少time_wait
net.ipv4.tcp_tw_timeout=3 # 收缩TIME_WAIT状态socket的
回收时间窗口
然后运行sysctl -p命令使配置生效