-
(转)并发-Tomcat线程-QPS的思考
2021-02-02 12:28:00... 一般线程数有一个公式:最佳启动线程数 = [任务执行时间 / (任务执行时间 - IO等待时间)] * CPU内核数 比如说任务执行时间是100ms IO等待时间是10ms 8核 则线程数为8...线程多少对最高并发没有直接影响,任务计算时转自:https://segmentfault.com/q/1010000016846975该贴下临风的回答
临风个人主页:https://segmentfault.com/u/linfeng_5ac9bd0a4d6a7
一般线程数有一个公式:
最佳启动线程数 = [任务执行时间 / (任务执行时间 - IO等待时间)] * CPU内核数
比如说任务执行时间是100ms IO等待时间是10ms 8核 则线程数为8个
IO等待时间是50ms 则线程数为16个
线程多少对最高并发没有直接影响,任务计算时间才是影响
最高并发数
的根本原因。
当任务的执行时间减小,那么服务器每秒处理的请求就会增加,也就是说支持的并发变大。比如你在服务端只是简单的
return ok;
,稍微正常一点服务器上的Tomcat都能达到5000甚至10000的并发。只不过在大多数的web应用中,任务执行时间并不会太短,而且还涉及到数据库操作,所以大部分情况下Tomcat的最高并发就只有几百。
对于相同的任务执行时间,在不同的IO模型和线程模型中最高并发也表现的不一样。
在BIO模型中,线程数 = 链接数,并发增加会造成线程数一定程度的增加,CPU就要花费一点时间在线程切换上。
在NIO模型中,并发并不会造成线程的增加,可以维持最佳线程数,从而提高CPU的利用率,在一定程度上提高最高并发。
Tomcat已经实现了NIO模型,在7.x版本中需要配置,8.x版本使用NIO作为默认的模型。补充:
上面的回答的不好,补充一下。
题主应该这么问,tomcat只能支持几百个并发的原因是什么?其实跟线程关系不大,暂且以
1秒内服务器处理的请求数
来衡量并发数,那么最大并发就是1秒内服务器最多能处理的请求数
很显然,平均单个请求处理时间越短,则最大并发越高。平均请求处理时间直接影响了最大并发的高度。
而大部分情况下Tomcat处理请求的平均时间不会太短,有时还涉及数据库操作,所以大部分情况下Tomcat的最高并发就只有几百。
然后线程模型会影响Tomcat处理请求的平均时间,要么是线程太少造成CPU等待而增加了平均处理时间,要么是线程太多而造成CPU要花费一定的周期来进行线程切换而延长了平均处理时间。所以合理的设置线程数能一定程度提高最大并发。
那么怎么提高最大并发呢?
思路当然是减少平均请求处理时间,比如说优化算法,动静分离,缓存,异步等等手段。“某个时间点上同时运行”这是并行的概念,衡量一个网站的性能不能用并行去衡量,没听过描述一个网站性能是这样描述的“网站同一时刻能处理多少请求”,都是说某网站在一段时间最多能处理多少请求。
redis是单线程模型的,但它的最高并发能达到10w+,因为他是纯内存操作,每个请求的处理时间短
web项目除了要访问数据库,还要访问硬盘上的页面,还要调用网络上的服务(所以tomcat需要多线程来充分利用计算资源以弥补数据等待的时间),必然相同的一段时间redis要比tomcat处理的事物数要多得多。
但二者处理的业务场景是不同的,所以tomcat最大并发上不去是因为他的业务场景决定,但是可以通过一些手段来提升性能,比如业务处理的算法,tomcat的线程模型和网络模型优化等等,但这些是不能让tomcat变得像redis一样性能高。
并发量 指的是某一段时间客户的平均请求数,并不是某一时刻的并行请求数,这根服务端没关系的,最大并发量才是衡量服务性能的关键,指的是服务最多能承受并发量的一个范围。
并发量和qps有啥区别?
并发量是客户端的事情,有多少并发量取决于有多少客户端并发访问,qps是服务端的指标,服务端每秒处理请求数。
当并发量较小的时候,服务器有足够的能力来处理请求,这时 qps=并发量
当并发量增多,qps也随之增长,当并发量达到一个临界值,服务端处理能力达到极限,由于服务端需要处理额外的事情,比如线程切换等等,qps略微下降,当兵发量再继续上升,由于请求堆积严重,可能导致服务端崩溃,qps急剧下降
另外服务端还有一个指标,响应时间。并发量是输入,qps和响应时间是输出,他们之间有个曲线图,在李智慧那本“大型网站技术架构:核心原理与案例分析”书上有分析。 -
tomcat集群
2013-01-17 17:31:03据说tomcat最高支持500并发,集群显得很有必要,将大量请求分发到多个tomcat来处理。 tomcat集群涉及两个问题: 1.请求分发,自动将请求分发到不同的tomcat 2.session同步(session复制) 一、请求分发...据说tomcat最高支持500并发,集群显得很有必要,将大量请求分发到多个tomcat来处理。
tomcat集群涉及两个问题:
1.请求分发,自动将请求分发到不同的tomcat
2.session同步(session复制)
一、请求分发
请求分发可以通过apache 或者 nginx来实现。(此例用nginx)
进入nginx/conf目录, 复制nginx.conf 为 nginx.conf.bak 留作备份,编辑nginx。
a.在 http > server > location 下添加 proxy_pass http://127.0.0.1;
b.在 http > 下添加
完整配置文件见文末。upstream 127.0.0.1 { #weigth参数表示权值,权值越高被分配到的几率越大 server 127.0.0.1:8080 weight=1; server 127.0.0.1:8081 weight=2; }
二、session复制
tomcat的session复制可参考tomcat文档 user guide 第18)
我采用的是在tomcat/conf/web.xml 文件 web-app 节点下添加 <distributable/>
tomcat/conf/server.xml 先修改两tomcat 服务端口,然后分别
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat2">
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>三、测试
启动 两tomcat,启动nginx,新建测试页分别放到webapp/ROOT 下,然后访问。
一些代码:
nginx.conf配置
#user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'; #access_log logs/access.log main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; server { listen 90; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { root html; index index.html index.htm test.jsp; proxy_pass http://127.0.0.1; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } upstream 127.0.0.1 { #weigth参数表示权值,权值越高被分配到的几率越大 server 127.0.0.1:8080 weight=1; server 127.0.0.1:8081 weight=2; } }
nginx服务管理:
暴力结束进程: taskkill -F -IM nginx.exeD:\>cd Server D:\Server>cd nginx-1.3.8 #停止服务 D:\Server\nginx-1.3.8>nginx -s stop #测试环境 D:\Server\nginx-1.3.8>nginx -t #启动服务 D:\Server\nginx-1.3.8>nginx -c conf/nginx.conf
还有一点问题,就是不同主机上tomcat session复制的问题,留待下次研究。
-
tomcat 集群配置
2010-04-02 10:51:12tomcat 集群司开发了一个网站,估计最高在线人数是3万,并发人数最多100人。 -
Tomcat 8 性能优化
2019-12-11 11:28:28去发现吞吐量,平均响应时间和错误率等信息的变化,同时根据服务器的cpu和内存等信息,结合接口的业务逻辑,最好是测试使用率最高,并发最大,或者是最重要的接口(比如下单支付接口),设置最优的tomcat和jvm配置参数...本博客的目的不在于给出最佳配置,而是带领开发者,能够从实际情况出发,通过不断的调节tomcat和jvm参数,去发现吞吐量,平均响应时间和错误率等信息的变化,同时根据服务器的cpu和内存等信息,结合接口的业务逻辑,最好是测试使用率最高,并发最大,或者是最重要的接口(比如下单支付接口),设置最优的tomcat和jvm配置参数。
目的
通过Tomcat性能优化可以提高网站的并发能力。Tomcat服务器在JavaEE项目中使用率非常高,所以在生产环境对Tomcat的优化也变得非常重要了。
对于Tomcat的优化,主要是从2个方面入手,一是Tomcat自身的配置,另一个是Tomcat所运行的jvm虚拟机的调优。
服务器资源
服务器所能提供CPU、内存、硬盘的性能对处理能力有决定性影响。硬件我们不说了,这个方面是钱越多越好是吧。一、Tomcat配置优化
Linux环境安装运行Tomcat8
具体的安装步骤可以参考Linux(CentOS7)安装Tomcat与设置Tomcat为开机启动项如果需要登录系统,必须配置tomcat用户,在安装完Tomcat后,进行如下操作
在/conf/tomcat-users.xml文件中的标签里面添加如下内容
<role rolename="manager"/> <role rolename="manager-gui"/> <role rolename="admin"/> <role rolename="admin-gui"/> <user username="tomcat" password="tomcat" roles="admin-gui,admin,manager-gui,manager"/>
如果是tomcat7,配置了tomcat用户就可以登录系统了,但是tomcat8中不行,还需要修改另一个配置文件,否则访问不了,提示403,打开webapps/manager/META-INF/context.xml文件
<?xml version="1.0" encoding="UTF-8"?> <Context antiResourceLocking="false" privileged="true" > <!--<Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />--> <Manager sessionAttributeValueClassNameFilter="java\.lang\.(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreventionFilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap"/> </Context>
打开浏览器进行访问10.172.0.202:8080
点击“Server Status”,输入用户名、密码进行登录,tomcat/tomcat
登录之后可以看到服务器状态等信息,主要包括服务器信息,JVM,ajp和http信息
二、AJP连接
在服务状态页面中可以看到,默认状态下会启用AJP服务,并且占用8009端口。
什么是AJPAJP(Apache JServer Protocol)
AJPv13协议是面向包的。WEB服务器和Servlet容器通过TCP连接来交互;为了节省SOCKET创建的昂贵代价,WEB服务器会尝试维护一个永久TCP连接到servlet容器,并且在多个请求和响应周期过程会重用连接。
我们一般是使用Nginx+Tomcat的架构,所以用不着AJP协议,把AJP连接器禁用。
修改conf下的server.xml文件,将AJP服务禁用掉即可。<!-- 禁用AJP连接 --> <!-- <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> -->
重启tomcat,查看效果。可以看到AJP服务已经不存在了。
三、执行器(线程池)
在tomcat中每一个用户请求都是一个线程,所以可以使用线程池提高性能。修改server.xml文件:
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="500" minSpareThreads="50" prestartminSpareThreads="true" maxQueueSize="100"/> <!-- 参数说明: maxThreads:最大并发数,默认设置 200,一般建议在 500 ~ 1000,根据硬件设施和业务来判断 minSpareThreads:Tomcat 初始化时创建的线程数,默认设置 25 prestartminSpareThreads: 在 Tomcat 初始化的时候就初始化 minSpareThreads 的参数值,如果不等于 true,minSpareThreads 的值就没啥效果了 maxQueueSize,最大的等待队列数,超过则拒绝请求 --> <!--在Connector中设置executor属性指向上面的执行器--> <Connector executor="tomcatThreadPool" port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
保存退出,重启tomcat,查看效果。
在页面中显示最大线程数为-1,这个是正常的,仅仅是显示的问题,实际使用的是指定的值。如果配置了一个Executor,则该属性的任何值将被正确记录,但是它将被显示为-1
四、3种运行模式
tomcat的运行模式有3种:bio
性能非常低下,没有经过任何优化处理和支持nio
nio(new I/O),是Java SE 1.4及后续版本提供的一种新的I/O操作方式(即java.nio包及其子包)。Java nio是一个基于缓冲区、并能提供非阻塞I/O操作的Java API,因此nio也被看成是non-blocking I/O的缩写。它拥有比传统I/O操作(bio)更好的并发运行性能。Tomcat8默认使用nio运行模式。apr
安装起来最困难,但是从操作系统级别来解决异步的IO问题,大幅度的提高性能对于每种协议,Tomcat都提供了对应的I/O方式的实现,而且Tomcat官方还提供了在每种协议下每种I/O实现方案的差异, HTTP协议下的处理方式如下表,详情可查看Tomcat官网说明
设置nio2:<Connector executor="tomcatThreadPool" port="8080" protocol="org.apache.coyote.http11.Http11Nio2Protocol" connectionTimeout="20000" redirectPort="8443" />
可以看到已经设置为nio2了。五、部署测试用的web项目
为了方便测试性能,我们将部署一个java web项目,这个项目本身和本博客没有什么关系,仅仅用于测试。注意:这里在测试时,我们使用一个新的tomcat,进行测试,后面再对其进行优化调整,再测试。
查看服务器信息
说明一下我的测试服务器配置,不同的服务器配置对Tomcat的性能会有所影响。
查看Linux版本
查看Linux版本:cat /etc/centos-release
查看CPU个数
查看逻辑cpu个数:cat /proc/cpuinfo | grep “processor” | wc -l
查看物理cpu个数:cat /proc/cpuinfo | grep “physical id” | sort | uniq | wc -l
查看每个物理cpu的核数cores:cat /proc/cpuinfo | grep “cpu cores”
如果所有物理cpu的cores个数加起来小于逻辑cpu的个数,则该cpu使用了超线程技术。查看每个物理cpu中逻辑cpu的个数:cat /proc/cpuinfo | grep “siblings”
查看内存使用情况
查看内存占用情况:free -m
参数说明
Mem:内存的使用情况总览表。
total:机器总的物理内存 单位为:M
used:用掉的内存。
free:空闲的物理内存。
[root@localhost ~]# cat /etc/centos-release CentOS Linux release 7.2.1511 (Core) [root@localhost ~]# cat /proc/cpuinfo | grep "processor" | wc -l 4 [root@localhost ~]# cat /proc/cpuinfo | grep "physical id" | sort | uniq | wc -l 4 [root@localhost ~]# cat /proc/cpuinfo | grep "cpu cores" cpu cores : 1 cpu cores : 1 cpu cores : 1 cpu cores : 1 [root@localhost ~]# free -m total used free shared buff/cache available Mem: 7825 850 6241 9 733 6714 Swap: 8063 0 8063
六、部署web应用
上传war包到linux服务器,然后进行部署我的web应用的名字叫tomcat-optimization,主要是提供了一个查询用户列表的接口,该接口会去阿里云数据库查询用户列表,没有任务业务逻辑的处理。
# 删除tomcat的/webapps/ROOT目录的所有文件 cd /webapps/ROOT rm -rf *
# 上传war包到tomcat的/webapps/ROOT,然后解压 jar -xvf tomcat-optimization.war rm -rf tomcat-optimization.war
# 进入tomcat的/bin目录重启tomcat cd /bin ./shutdown.sh ./startup.sh
访问接口地址: http://10.172.0.202:8080/user/listUser
[{ "id": 1, "account": "lilei", "password": "123456", "userName": "李雷", "gender": 1, "age": 15, "birthday": "2001-01-01 01:01:38", "createTime": "2016-03-01 19:09:55" }, { "id": 2, "account": "hanmeimei", "password": "123456", "userName": "韩梅梅", "gender": 0, "age": 14, "birthday": "2002-01-01 01:01:38", "createTime": "2016-03-01 19:09:55" }, { "id": 3, "account": "lucy", "password": "123456", "userName": "露西", "gender": 0, "age": 13, "birthday": "2003-01-01 01:01:38", "createTime": "2016-03-01 19:09:55" }]
七、使用Apache JMeter进行性能测试
Apache JMeter是Apache组织开发的基于Java的压力测试工具。 我们借助于此工具进行测试,将测试出tomcat的吞吐量等信息。下载安装
下载地址:http://jmeter.apache.org/download_jmeter.cgi注意:这里需要先安装好jdk8及其以上版本的环境,可以参考JDK安装与环境变量配置
直接将下载好的zip压缩包进行解压即可。
进入bin目录,找到jmeter.bat文件,双机打开即可启动。
JMeter启动页面
JMeter主页面
修改语言
默认的主题是黑色风格的主题并且语言是英语,这样不太方便使用,所以需要修改下语言。设置语言为简体中文。
修改语言完成的界面
创建接口的测试用例
测试接口之前需要调整Windows环境配置,不然会报如下错误JMeter java.net.BindException: Address already in use: connect
出现原因:
TCP/IP连接数不够或TIME_WAIT中存在很多链接,导致吞吐量低。解决方案:
从问题的原因分析,有两种解决方案,一是增加预留给TCP/IP服务的临时端口的数量,二是加快被占用端口的释放速度。解决办法:
1、打开注册表:regedit
2、HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\ Services\TCPIP\Parameters
3、新建 DWORD值,name:TCPTimedWaitDelay,value:30(十进制) –> 设置为30秒,默认是240秒
4、新建 DWORD值,name:MaxUserPort,value:65534(十进制) –> 设置最大连接数65534
5、重启系统第一步:设置测试计划的名称
第二步:添加线程组,使用线程模拟用户的并发
1000个线程,每个线程循环10次,也就是tomcat会接收到10000个请求。
第三步:添加http请求
设置http请求
第四步:添加请求监控
启动与进行接口测试
查看测试报告
在聚合报告中,重点看吞吐量。八、调整Tomcat参数进行优化
通过上面测试可以看出,tomcat在不做任何调整时,吞吐量为697次/秒。这个吞吐量跟接口的业务逻辑关系很大,如果业务逻辑复杂,需要比较长时间计算的,可能吞吐量只有几十次/秒,我这里测试的时候没有添加任务业务逻辑,才会出现吞吐量为697次/秒的情况。这里的吞吐量最好是经过多次测试取平均值,因为单次测试具有一定的随机性禁用AJP连接
修改conf下的server.xml文件,将AJP服务禁用掉即可。<!-- <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> -->
这里经过9次测试,测试结果如下704 730 736 728 730 727 714 708 735 平均是723可以看到,禁用AJP服务后,吞吐量会有所提升。
当然了,测试不一定准确,需要多测试几次才能看出是否有提升。
设置线程池
通过设置线程池,调整线程池相关的参数进行测试tomcat的性能。有关线程池更多更详细的配置参考Tomcat官网提供的配置详解最大线程数为150,初始为4
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="150" minSpareThreads="4" prestartminSpareThreads="true"/> <!--在Connector中设置executor属性指向上面的执行器--> <Connector executor="tomcatThreadPool" port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
经过9次测试,测试结果如下705 725 702 729 733 738 735 728 平均是724
最大线程数为500,初始为50
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="500" minSpareThreads="50" prestartminSpareThreads="true"/> <!--在Connector中设置executor属性指向上面的执行器--> <Connector executor="tomcatThreadPool" port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
测试结果:733 724 718 728 734 721 720 723 平均725
吞吐量为725次/秒,性能有所提升。
最大线程数为1000,初始为200
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="1000" minSpareThreads="200" prestartminSpareThreads="true"/> <!--在Connector中设置executor属性指向上面的执行器--> <Connector executor="tomcatThreadPool" port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
吞吐量为732,性能有所提升。
测试结果 737 729 730 738 735 726 725 740 平均732
最大线程数为5000,初始为1000
是否是线程数最多,速度越快呢? 我们来测试下。<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="5000" minSpareThreads="1000" prestartminSpareThreads="true"/> <!--在Connector中设置executor属性指向上面的执行器--> <Connector executor="tomcatThreadPool" port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
测试结果 727 733 728 725 738 729 737 735 739 平均732
可以看到,虽然最大线程已经设置到5000,但是实际测试效果并不理想,并且平均的响应时间也边长了,所以单纯靠提升线程数量是不能一直得到性能提升的。
设置最大等待队列数
默认情况下,请求发送到tomcat,如果tomcat正忙,那么该请求会一直等待。这样虽然可以保证每个请求都能请求到,但是请求时间就会边长。有些时候,我们也不一定要求请求一定等待,可以设置最大等待队列大小,如果超过就不等待了。这样虽然有些请求是失败的,但是请求时间会虽短。典型的应用:12306。
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="500" minSpareThreads="100" prestartminSpareThreads="true" maxQueueSize="100"/> <!--在Connector中设置executor属性指向上面的执行器--> <Connector executor="tomcatThreadPool" port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
测试结果:
- 平均响应时间:0.438秒,响应时间明显缩短
- 错误率:43.07%,错误率超过40%,也可以理解,最大线程为500,测试的并发为1000
- 吞吐量:1359次/秒,吞吐量明显提升
结论:响应时间、吞吐量这2个指标需要找到平衡才能达到更好的性能。
设置nio2的运行模式
将最大线程设置为500进行测试:<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="500" minSpareThreads="100" prestartminSpareThreads="true"/> <!-- 设置nio2 --> <Connector executor="tomcatThreadPool" port="8080" protocol="org.apache.coyote.http11.Http11Nio2Protocol" connectionTimeout="20000" redirectPort="8443" />
从测试结果可以看到,平均响应时间有缩短,吞吐量有提升,可以得出结论:nio2的性能要高于nio。
参数说明与最佳实践
具体参数参考官网说明(https://tomcat.apache.org/tomcat-8.5-doc/config/executor.html)
此最佳配置仅供参考
执行器参数说明(加粗是重点)<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="800" minSpareThreads="100" maxQueueSize="100" prestartminSpareThreads="true"/>
连接器参数说明
可以看到除了这几个基本配置外并无特殊功能,所以我们需要对 Connector 进行扩展。其中Connector 支持参数属性可以参考Tomcat官方网站,本文就只介绍些常用的。
通用属性(加粗是重点)
标准实现(加粗是重点)
除了上面列出的常见的连接器属性,标准的HTTP连接器(BIO,NIO和APR/native)都支持以下属性。
连接器最佳实践
此最佳配置仅供参考<Connector executor="tomcatThreadPool" port="8080" protocol="org.apache.coyote.http11.Http11Nio2Protocol" connectionTimeout="20000" redirectPort="8443" enableLookups="false" maxPostSize="10485760" URIEncoding="UTF-8" acceptCount="100" acceptorThreadCount="2" disableUploadTimeout="true" maxConnections="10000" SSLEnabled="false"/>
九、调整JVM参数进行优化
接下来,通过设置jvm参数进行优化,为了测试一致性,依然将最大线程数设置为500,启用nio2运行模式设置并行垃圾回收器
在/bin/catalina.sh文件第一行添加如下参数,gc日志输出到/logs/gc.log#年轻代、老年代均使用并行收集器,初始堆内存64M,最大堆内存512M JAVA_OPTS="-XX:+UseParallelGC -XX:+UseParallelOldGC -Xms64m -Xmx512m -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -Xloggc:../logs/gc.log"
测试结果与默认的JVM参数结果接近。查看gc日志文件
将gc.log文件上传到gceasy.io查看gc中是否存在问题。上传文件后需要等待一段时间,需要耐心等待。
问题一:系统所消耗的时间大于用户时间
如果在报告中显示System Time greater than User Time,系统所消耗的时间大于用户时间,这反应出的服务器的性能存在瓶颈,调度CPU等资源所消耗的时间要长一些。问题二:线程暂停时间有点长
可以关键指标中可以看出,吞吐量表现不错,但是gc时,线程的暂停时间稍有点长。
问题三:GC总次数过多
通过GC的统计可以看出:
年轻代的gc有100次,次数有点多,说明年轻代设置的大小不合适,需要调整
FullGC有7次,说明堆内存的大小不合适,需要调整
问题四:年轻代内存不足导致GC
从GC原因的可以看出,年轻代大小设置不合理,导致了多次GC。
调整年轻代大小
调整jvm配置参数JAVA_OPTS="-XX:+UseParallelGC -XX:+UseParallelOldGC -Xms128m -Xmx1024m -XX:NewSize=64m -XX:MaxNewSize=256m -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -Xloggc:../logs/gc.log"
将初始堆大小设置为128m,最大为1024m,初始年轻代大小64m,年轻代最大256m
从测试结果来看,吞吐量以及响应时间均有提升。
查看gc日志
可以看到GC次数要明显减少,说明调整是有效的。
GC次数有所减少
设置G1垃圾回收器
#设置了最大停顿时间100毫秒,初始堆内存128m,最大堆内存1024m JAVA_OPTS="-XX:+UseG1GC -XX:MaxGCPauseMillis=100 -Xms128m -Xmx1024m -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -Xloggc:../logs/gc.log"
测试结果
可以看到,吞吐量有所提升,评价响应时间也有所缩短。
G1集合阶段统计
十、JVM配置最佳实践
此最佳配置仅供参考JAVA_OPTS="-Dfile.encoding=UTF-8-server -Xms1024m -Xmx2048m -XX:NewSize=512m -XX:MaxNewSize=1024m -XX:PermSize=256m -XX:MaxPermSize=256m -XX:MaxTenuringThreshold=10-XX:NewRatio=2 -XX:+DisableExplicitGC"
参数说明:
file.encoding 默认文件编码
-Xmx1024m 设置JVM最大可用内存为1024MB
-Xms1024m 设置JVM最小内存为1024m。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。
-XX:NewSize 设置年轻代大小
-XX:MaxNewSize 设置最大的年轻代大小
-XX:PermSize 设置永久代大小
-XX:MaxPermSize 设置最大永久代大小
-XX:NewRatio=4 设置年轻代(包括Eden和两个Survivor区)与终身代的比值(除去永久代)。设置为4,则年轻代与终身代所占比值为1:4,年轻代占整个堆栈的1/5
-XX:MaxTenuringThreshold=0 设置垃圾最大年龄,默认为:15。如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代。对于年老代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概论。
-XX:+DisableExplicitGC 这个将会忽略手动调用GC的代码使得System.gc()的调用就会变成一个空调用,完全不会触发任何GC。
总结
通过上述的测试,可以总结出,对tomcat性能优化就是需要不断的进行调整参数,然后测试结果,可能会调优也可能会调差,这时就需要借助于gc的可视化工具来看gc的情况。再帮我我们做出决策应该调整哪些参数。再次重申本博客的目的不在于给出最佳配置,而是带领开发者,能够从实际情况出发,通过不断的调节tomcat和jvm参数,去发现吞吐量,平均响应时间和错误率等信息的变化,同时根据服务器的cpu和内存等信息,结合接口的业务逻辑,最好是测试使用率最高,并发最大,或者是最重要的接口(比如下单支付接口),设置最优的tomcat和jvm配置参数。
原文链接:https://blog.csdn.net/thinkwon/article/details/102744033
-
tomcat8启动最日期中午乱码_史上最强Tomcat8性能优化
2020-12-29 14:39:14授人以鱼不如授人以渔本博客的目的不在于给出最佳配置,而是...最好是测试使用率最高,并发最大,或者是最重要的接口(比如下单支付接口),设置最优的tomcat和jvm配置参数。目的通过Tomcat性能优化可以提高网站的并发...授人以鱼不如授人以渔
本博客的目的不在于给出最佳配置,而是带领开发者,能够从实际情况出发,通过不断的调节tomcat和jvm参数,去发现吞吐量,平均响应时间和错误率等信息的变化,同时根据服务器的cpu和内存等信息,结合接口的业务逻辑,最好是测试使用率最高,并发最大,或者是最重要的接口(比如下单支付接口),设置最优的tomcat和jvm配置参数。
目的
通过Tomcat性能优化可以提高网站的并发能力。
Tomcat服务器在JavaEE项目中使用率非常高,所以在生产环境对Tomcat的优化也变得非常重要了。
对于Tomcat的优化,主要是从2个方面入手,一是Tomcat自身的配置,另一个是Tomcat所运行的jvm虚拟机的调优。
服务器资源
服务器所能提供CPU、内存、硬盘的性能对处理能力有决定性影响。硬件我们不说了,这个方面是钱越多越好是吧。
Tomcat配置优化
Linux环境安装运行Tomcat8
具体的安装步骤可以参考Linux(CentOS7)安装Tomcat与设置Tomcat为开机启动项
如果需要登录系统,必须配置tomcat用户,在安装完Tomcat后,进行如下操作
在
/conf/tomcat-users.xml
文件中的标签里面添加如下内容
如果是tomcat7,配置了tomcat用户就可以登录系统了,但是tomcat8中不行,还需要修改另一个配置文件,否则访问不了,提示403,打开
webapps/manager/META-INF/context.xml
文件<?xml version="1.0" encoding="UTF-8"?>
打开浏览器进行访问
10.172.0.202:8080
点击“Server Status”,输入用户名、密码进行登录,tomcat/tomcat
登录之后可以看到服务器状态等信息,主要包括服务器信息,JVM,ajp和http信息
AJP连接
在服务状态页面中可以看到,默认状态下会启用AJP服务,并且占用8009端口。
什么是AJP
AJP(Apache JServer Protocol)
AJPv13协议是面向包的。WEB服务器和Servlet容器通过TCP连接来交互;为了节省SOCKET创建的昂贵代价,WEB服务器会尝试维护一个永久TCP连接到servlet容器,并且在多个请求和响应周期过程会重用连接。我们一般是使用Nginx+Tomcat的架构,所以用不着AJP协议,把AJP连接器禁用。
修改conf下的server.xml文件,将AJP服务禁用掉即可。
重启tomcat,查看效果。可以看到AJP服务已经不存在了。
执行器(线程池)
在tomcat中每一个用户请求都是一个线程,所以可以使用线程池提高性能。
修改server.xml文件:
maxThreads="500" minSpareThreads="50" prestartminSpareThreads="true" maxQueueSize="100"/>connectionTimeout="20000"redirectPort="8443" />
保存退出,重启tomcat,查看效果。
在页面中显示最大线程数为-1,这个是正常的,仅仅是显示的问题,实际使用的是指定的值。如果配置了一个Executor,则该属性的任何值将被正确记录,但是它将被显示为-1
3种运行模式
tomcat的运行模式有3种:
bio
性能非常低下,没有经过任何优化处理和支持nio
nio(new I/O),是Java SE 1.4及后续版本提供的一种新的I/O操作方式(即java.nio包及其子包)。Java nio是一个基于缓冲区、并能提供非阻塞I/O操作的Java API,因此nio也被看成是non-blocking I/O的缩写。它拥有比传统I/O操作(bio)更好的并发运行性能。Tomcat8默认使用nio运行模式。apr
安装起来最困难,但是从操作系统级别来解决异步的IO问题,大幅度的提高性能对于每种协议,Tomcat都提供了对应的I/O方式的实现,而且Tomcat官方还提供了在每种协议下每种I/O实现方案的差异, HTTP协议下的处理方式如下表,详情可查看Tomcat官网说明
推荐使用nio,在tomcat8中有最新的nio2,速度更快,建议使用nio2
设置nio2:
connectionTimeout="20000"redirectPort="8443" />
可以看到已经设置为nio2了。
部署测试用的web项目
为了方便测试性能,我们将部署一个java web项目,这个项目本身和本博客没有什么关系,仅仅用于测试。
注意:这里在测试时,我们使用一个新的tomcat,进行测试,后面再对其进行优化调整,再测试。
查看服务器信息
说明一下我的测试服务器配置,不同的服务器配置对Tomcat的性能会有所影响。
CentOS7服务器环境信息查看命令
查看Linux版本
查看Linux版本:cat /etc/centos-release
查看CPU个数
查看逻辑cpu个数:cat /proc/cpuinfo | grep “processor” | wc -l
查看物理cpu个数:cat /proc/cpuinfo | grep “physical id” | sort | uniq | wc -l
查看每个物理cpu的核数cores:cat /proc/cpuinfo | grep “cpu cores”
如果所有物理cpu的cores个数加起来小于逻辑cpu的个数,则该cpu使用了超线程技术。查看每个物理cpu中逻辑cpu的个数:cat /proc/cpuinfo | grep “siblings”
查看内存使用情况
查看内存占用情况:free -m
参数说明
Mem:内存的使用情况总览表。
total:机器总的物理内存 单位为:M
used:用掉的内存。
free:空闲的物理内存。
[root@localhost ~]# cat /etc/centos-releaseCentOS Linux release 7.2.1511 (Core)[root@localhost ~]# cat /proc/cpuinfo | grep "processor" | wc -l4[root@localhost ~]# cat /proc/cpuinfo | grep "physical id" | sort | uniq | wc -l4[root@localhost ~]# cat /proc/cpuinfo | grep "cpu cores"cpu cores : 1cpu cores : 1cpu cores : 1cpu cores : 1[root@localhost ~]# free -m total used free shared buff/cache availableMem: 7825 850 6241 9 733 6714Swap: 8063 0 8063
部署web应用
上传war包到linux服务器,然后进行部署
我的web应用的名字叫tomcat-optimization,主要是提供了一个查询用户列表的接口,该接口会去阿里云数据库查询用户列表,没有任务业务逻辑的处理。
# 删除tomcat的/webapps/ROOT目录的所有文件cd /webapps/ROOTrm -rf *# 上传war包到tomcat的/webapps/ROOT,然后解压jar -xvf tomcat-optimization.warrm -rf tomcat-optimization.war# 进入tomcat的/bin目录重启tomcatcd /bin./shutdown.sh./startup.sh
访问接口地址:http://10.172.0.202:8080/user/listUser
[{"id": 1,"account": "lilei","password": "123456","userName": "李雷","gender": 1,"age": 15,"birthday": "2001-01-01 01:01:38","createTime": "2016-03-01 19:09:55"}, {"id": 2,"account": "hanmeimei","password": "123456","userName": "韩梅梅","gender": 0,"age": 14,"birthday": "2002-01-01 01:01:38","createTime": "2016-03-01 19:09:55"}, {"id": 3,"account": "lucy","password": "123456","userName": "露西","gender": 0,"age": 13,"birthday": "2003-01-01 01:01:38","createTime": "2016-03-01 19:09:55"}]
使用Apache JMeter进行性能测试
Apache JMeter是Apache组织开发的基于Java的压力测试工具。我们借助于此工具进行测试,将测试出tomcat的吞吐量等信息。
下载安装
下载地址:http://jmeter.apache.org/download_jmeter.cgi
注意:这里需要先安装好jdk8及其以上版本的环境,可以参考JDK安装与环境变量配置
直接将下载好的zip压缩包进行解压即可。
进入bin目录,找到jmeter.bat文件,双机打开即可启动。
JMeter启动页面
JMeter主页面
修改语言
默认的主题是黑色风格的主题并且语言是英语,这样不太方便使用,所以需要修改下语言。
设置语言为简体中文。
修改语言完成的界面
创建接口的测试用例
测试接口之前需要调整Windows环境配置,不然会报如下错误
JMeter java.net.BindException: Address already in use: connect
出现原因:
TCP/IP连接数不够或TIME_WAIT中存在很多链接,导致吞吐量低。解决方案:
从问题的原因分析,有两种解决方案,一是增加预留给TCP/IP服务的临时端口的数量,二是加快被占用端口的释放速度。解决办法:
1、打开注册表:regedit
2、HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\ Services\TCPIP\Parameters
3、新建 DWORD值,name:TCPTimedWaitDelay,value:30(十进制) –> 设置为30秒,默认是240秒
4、新建 DWORD值,name:MaxUserPort,value:65534(十进制) –> 设置最大连接数65534
5、重启系统第一步:设置测试计划的名称
第二步:添加线程组,使用线程模拟用户的并发
1000个线程,每个线程循环10次,也就是tomcat会接收到10000个请求。
第三步:添加http请求
设置http请求
第四步:添加请求监控
启动与进行接口测试
查看测试报告
在聚合报告中,重点看吞吐量。
调整Tomcat参数进行优化
通过上面测试可以看出,tomcat在不做任何调整时,吞吐量为697次/秒。这个吞吐量跟接口的业务逻辑关系很大,如果业务逻辑复杂,需要比较长时间计算的,可能吞吐量只有几十次/秒,我这里测试的时候没有添加任务业务逻辑,才会出现吞吐量为697次/秒的情况。这里的吞吐量最好是经过多次测试取平均值,因为单次测试具有一定的随机性
禁用AJP连接
修改conf下的server.xml文件,将AJP服务禁用掉即可。
这里经过9次测试,测试结果如下704 730 736 728 730 727 714 708 735 平均是723
可以看到,禁用AJP服务后,吞吐量会有所提升。
当然了,测试不一定准确,需要多测试几次才能看出是否有提升。
设置线程池
通过设置线程池,调整线程池相关的参数进行测试tomcat的性能。有关线程池更多更详细的配置参考Tomcat官网提供的配置详解
最大线程数为150,初始为4
maxThreads="150" minSpareThreads="4" prestartminSpareThreads="true"/>connectionTimeout="20000"redirectPort="8443" />
经过9次测试,测试结果如下705 725 702 729 733 738 735 728 平均是724
最大线程数为500,初始为50
maxThreads="500" minSpareThreads="50" prestartminSpareThreads="true"/>connectionTimeout="20000"redirectPort="8443" />
测试结果:733 724 718 728 734 721 720 723 平均725
吞吐量为725次/秒,性能有所提升。
最大线程数为1000,初始为200
maxThreads="1000" minSpareThreads="200" prestartminSpareThreads="true"/>connectionTimeout="20000"redirectPort="8443" />
吞吐量为732,性能有所提升。
测试结果 737 729 730 738 735 726 725 740 平均732
最大线程数为5000,初始为1000
是否是线程数最多,速度越快呢?我们来测试下。
maxThreads="5000" minSpareThreads="1000" prestartminSpareThreads="true"/>connectionTimeout="20000"redirectPort="8443" />
测试结果 727 733 728 725 738 729 737 735 739 平均732
可以看到,虽然最大线程已经设置到5000,但是实际测试效果并不理想,并且平均的响应时间也边长了,所以单纯靠提升线程数量是不能一直得到性能提升的。
设置最大等待队列数
默认情况下,请求发送到tomcat,如果tomcat正忙,那么该请求会一直等待。这样虽然可以保证每个请求都能请求到,但是请求时间就会边长。
有些时候,我们也不一定要求请求一定等待,可以设置最大等待队列大小,如果超过就不等待了。这样虽然有些请求是失败的,但是请求时间会虽短。典型的应用:12306。
maxThreads="500" minSpareThreads="100" prestartminSpareThreads="true" maxQueueSize="100"/>connectionTimeout="20000"redirectPort="8443" />
测试结果:
平均响应时间:0.438秒,响应时间明显缩短
错误率:43.07%,错误率超过40%,也可以理解,最大线程为500,测试的并发为1000
吞吐量:1359次/秒,吞吐量明显提升
结论:响应时间、吞吐量这2个指标需要找到平衡才能达到更好的性能。
设置nio2的运行模式
将最大线程设置为500进行测试:
maxThreads="500" minSpareThreads="100" prestartminSpareThreads="true"/>connectionTimeout="20000"redirectPort="8443" />
从测试结果可以看到,平均响应时间有缩短,吞吐量有提升,可以得出结论:nio2的性能要高于nio。
参数说明与最佳实践
具体参数参考官网说明
执行器参数说明(加粗是重点)
执行器最佳实践
此最佳配置仅供参考
maxThreads="800" minSpareThreads="100" maxQueueSize="100" prestartminSpareThreads="true"/>
连接器参数说明
可以看到除了这几个基本配置外并无特殊功能,所以我们需要对 Connector 进行扩展。
其中Connector 支持参数属性可以参考Tomcat官方网站,本文就只介绍些常用的。
通用属性(加粗是重点)
标准实现(加粗是重点)
除了上面列出的常见的连接器属性,标准的HTTP连接器(BIO,NIO和APR/native)都支持以下属性。
连接器最佳实践
此最佳配置仅供参考
connectionTimeout="20000" redirectPort="8443"enableLookups="false" maxPostSize="10485760" URIEncoding="UTF-8" acceptCount="100" acceptorThreadCount="2" disableUploadTimeout="true" maxConnections="10000" SSLEnabled="false"/>
调整JVM参数进行优化
接下来,通过设置jvm参数进行优化,为了测试一致性,依然将最大线程数设置为500,启用nio2运行模式
设置并行垃圾回收器
在/bin/catalina.sh文件第一行添加如下参数,gc日志输出到
/logs/gc.log
#年轻代、老年代均使用并行收集器,初始堆内存64M,最大堆内存512MJAVA_OPTS="-XX:+UseParallelGC -XX:+UseParallelOldGC -Xms64m -Xmx512m -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -Xloggc:../logs/gc.log"
测试结果与默认的JVM参数结果接近。
查看gc日志文件
将gc.log文件上传到gceasy.io查看gc中是否存在问题。上传文件后需要等待一段时间,需要耐心等待。
问题一:系统所消耗的时间大于用户时间
如果在报告中显示
System Time greater than User Time
,系统所消耗的时间大于用户时间,这反应出的服务器的性能存在瓶颈,调度CPU等资源所消耗的时间要长一些。问题二:线程暂停时间有点长
可以关键指标中可以看出,吞吐量表现不错,但是gc时,线程的暂停时间稍有点长。
问题三:GC总次数过多
通过GC的统计可以看出:
年轻代的gc有100次,次数有点多,说明年轻代设置的大小不合适,需要调整
FullGC有7次,说明堆内存的大小不合适,需要调整
问题四:年轻代内存不足导致GC
从GC原因的可以看出,年轻代大小设置不合理,导致了多次GC。
调整年轻代大小
调整jvm配置参数
JAVA_OPTS="-XX:+UseParallelGC -XX:+UseParallelOldGC -Xms128m -Xmx1024m -XX:NewSize=64m -XX:MaxNewSize=256m -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -Xloggc:../logs/gc.log"
将初始堆大小设置为128m,最大为1024m,初始年轻代大小64m,年轻代最大256m
从测试结果来看,吞吐量以及响应时间均有提升。
查看gc日志
可以看到GC次数要明显减少,说明调整是有效的。
GC次数有所减少
设置G1垃圾回收器
#设置了最大停顿时间100毫秒,初始堆内存128m,最大堆内存1024mJAVA_OPTS="-XX:+UseG1GC -XX:MaxGCPauseMillis=100 -Xms128m -Xmx1024m -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -Xloggc:../logs/gc.log"
测试结果
可以看到,吞吐量有所提升,评价响应时间也有所缩短。
G1集合阶段统计
JVM配置最佳实践
此最佳配置仅供参考
JAVA_OPTS="-Dfile.encoding=UTF-8-server -Xms1024m -Xmx2048m -XX:NewSize=512m -XX:MaxNewSize=1024m -XX:PermSize=256m -XX:MaxPermSize=256m -XX:MaxTenuringThreshold=10-XX:NewRatio=2 -XX:+DisableExplicitGC"
参数说明:
file.encoding 默认文件编码
-Xmx1024m 设置JVM最大可用内存为1024MB
-Xms1024m 设置JVM最小内存为1024m。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。
-XX:NewSize 设置年轻代大小
-XX:MaxNewSize 设置最大的年轻代大小
-XX:PermSize 设置永久代大小
-XX:MaxPermSize 设置最大永久代大小
-XX:NewRatio=4 设置年轻代(包括Eden和两个Survivor区)与终身代的比值(除去永久代)。设置为4,则年轻代与终身代所占比值为1:4,年轻代占整个堆栈的1/5
-XX:MaxTenuringThreshold=0 设置垃圾最大年龄,默认为:15。如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代。对于年老代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概论。
-XX:+DisableExplicitGC 这个将会忽略手动调用GC的代码使得System.gc()的调用就会变成一个空调用,完全不会触发任何GC。
总结
通过上述的测试,可以总结出,对tomcat性能优化就是需要不断的进行调整参数,然后测试结果,可能会调优也可能会调差,这时就需要借助于gc的可视化工具来看gc的情况。再帮我我们做出决策应该调整哪些参数。
再次重申本博客的目的不在于给出最佳配置,而是带领开发者,能够从实际情况出发,通过不断的调节tomcat和jvm参数,去发现吞吐量,平均响应时间和错误率等信息的变化,同时根据服务器的cpu和内存等信息,结合接口的业务逻辑,最好是测试使用率最高,并发最大,或者是最重要的接口(比如下单支付接口),设置最优的tomcat和jvm配置参数。
原文链接:
https://thinkwon.blog.csdn.net/article/details/102744033
-
Tomcat8性能优化
2019-10-28 11:48:00去发现吞吐量,平均响应时间和错误率等信息的变化,同时根据服务器的cpu和内存等信息,结合接口的业务逻辑,最好是测试使用率最高,并发最大,或者是最重要的接口(比如下单支付接口),设置最优的tomcat和jvm配置参数... -
Tomcat7性能调优
2018-11-16 14:21:00并发量高时,线程数较多,浪费资源。Tomcat7默认使用这种方式。 ●NIO:利用Java的非阻塞IO处理,通过线程池处理大量的请求。 Tomcat8默认采用这种方式。 ●APR:从操作系统层面解决io阻塞问题,性能最高。Tomcat7... -
Tomcat8调优核心实战详解
2020-06-12 19:02:49去发现吞吐量,平均响应时间和错误率等信息的变化,同时根据服务器的cpu和内存等信息,结合接口的业务逻辑,最好是测试使用率最高,并发最大,或者是最重要的接口(比如下单支付接口),设置最优的tomcat和jvm配置参数... -
最强Tomcat8性能优化
2020-10-10 09:08:33去发现吞吐量,平均响应时间和错误率等信息的变化,同时根据服务器的cpu和内存等信息,结合接口的业务逻辑,最好是测试使用率最高,并发最大,或者是最重要的接口(比如下单支付接口),设置最优的tomcat和jvm配置参数... -
Centos简单优化Linux性能、调优Tomcat和Tomcat自启服务
2020-01-12 20:36:39Linux性能优化 一、 Linux系统优化-调大TCP最大连接数 linux作为服务器,当...这是因为在Linux平台上,无论编写客户端程序还是服务端程序,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程... -
史上最强Tomcat8性能优化
2020-05-12 11:08:18去发现吞吐量,平均响应时间和错误率等信息的变化,同时根据服务器的cpu和内存等信息,结合接口的业务逻辑,最好是测试使用率最高,并发最大,或者是最重要的接口(比如下单支付接口),设置最优的tomcat和jvm配置参数... -
在线2000的tomcat
2009-09-28 09:57:48在线用户离散1000-2000,数据库并发最高:500,每用户离散5秒-10分钟一次数据库操作,操作主要以Insert和Select为主,离散传输数据:0.5K-10K。WEB容器:tomcat5.5 若服务器不采用分布式,数据库和容器在一台机器... -
Nginx+Tomcat 负载均衡集群
2017-09-17 20:50:00Nginx是一款非常优秀的http服务器软件,他能够支持最高达50000个并发连接数的响应,拥有强大的静态 资源处理能力,运行稳定,并且内存、cpu等系统资源消耗非常低。目前很多大型网站都应用Nginx服... -
Tomcat+Nginx+Lvs部署方案与性能调优
2019-10-05 18:14:47原项目设计没有Nginx和LVS,经过性能测试并发数最高到400,就报响应超时,且系统资源消耗严重。经过和架构师商议决定先加入Nginx解决负载均衡处理,结果并发数有所提升但与期望值还有距离。商议后决定使用LVS处理... -
nginx 与 tomcat 集群 一二事 (0) - 简单介绍
2016-03-27 22:17:00nginx 是一个http服务器,是由俄罗斯人发明的,目前主流的服务器,作为负载均衡服务器,性能非常好,最高支持5万个并发连接数,在淘宝被广泛使用(据说被淘宝的工程师优化到单机200万的并发,非常的厉害) ... -
JAVA高性能高并发解决思路
2019-04-29 15:10:181、代码质量,不要性能低下的sql和代码。有的一条sql搞定的事,有人用了多个循环才能搞定。...tomcat的并发取决于每个请求执行的占用时常,如果一个请求耗时1秒,那按tomcat开启的线程数默认就几十个。江湖谣传to... -
tomcat apache 负载均衡配置
2009-10-14 16:19:20前言:公司开发了一个网站,估计最高在线人数是3万,并发人数最多100人。开发的网站是否能否承受这个压力,如何确保网站的负荷没有问题,经过研究决定如下:(1) 采用负载平衡和集群技术,初步机构采用Apache+... -
Apache和Tomcat的区别
2009-03-14 16:46:00为什么大家都是用apache+php呢 而不是tomcat+php,问了一些人,都是支持比较好,apache并发性较高,就跟.net+iis+mssql php+apace+mysql 一样的道理,不是说换了别的不能用,而是支持不好,性能不能达到最高吧。... -
干货.10分钟带你了解Apache和Tomcat的区别!
2021-02-03 20:33:43一. Apache服务器特点介绍 ...a、主要用于解析静态文本,并发性能高,侧重于HTTP服务;...d、是目前全球用户使用量最高的Web服务器。 二.Tomcat服务器特点介绍 Tomcat是由Java开发且符合JavaEE的Servlet规范 -
apache与tomcat之间的关系
2011-12-30 16:40:08最近很想学php,一开始搭建 环境的时候,查了一些资料,可是 发现了一个困惑的问题,为什么大家都是用apache+php呢 而不是tomcat+php,问了一些人,都是支持比较好,apache并发性较高,就跟.net+iis+mssql php+apace+mysql ... -
apache+tomcat+mysql 负载平衡和集群技术
2019-10-03 00:51:21公司开发了一个网站,估计最高在线人数是3 万,并发人数最多100 人。开发的网站是否能否承受这个压力,如何确保网站的负荷没有问题,经过研究决定如下: (1 )采用负载平衡和集群技术,初步机构采用Apache+Tomcat...