JVM调优:
面试官:如何进行JVM 调优(附真实案例)(有实战举例)
Tomcat调优:
Tomcat性能优化_tomcat 优化-CSDN博客(有实战举例)
Tomcat性能优化-腾讯云开发者社区-腾讯云(具体参数解释及方案)
Tomcat作为常用的JavaWeb服务器,其性能调优主要从以下几个方面进行:
- 选用高效的JDK版本:不同的JDK版本对Tomcat的性能有较大影响,Java8及以上版本会有较好的表现。
- 调整堆内存大小:默认的堆内存大小较小,易出现OOM,可以适当调大堆内存,-Xmx和-Xms指定最大与初始堆内存大小。
- 使用本地线程池:默认使用全局线程池,改为使用本地线程池可以减小线程调度延迟,提高性能。在server.xml中配置<Executor name="tomcatThreadPool" ... />。
- 调整连接器acceptCount:默认值为100,可适当调大,控制Tomcat接受连接请求的速度,避免过多超时请求。在server.xml中配置<Connector acceptCount="500" ... />。
- 启用压缩:开启gzip压缩可以减小响应体大小,加快网页加载。在server.xml中配置<Connector compression="on" ... />。
- 缓存静态内容:通过将一些网页静态内容(图片、JS、CSS)缓存在内存中来增快访问速度。
- 使用AJP代替HTTP:AJP协议用于和Web服务器交互,其性能优于HTTP协议。可在server.xml中配置<Connector port="8009" protocol="AJP/1.3" ... />。
- 优化会话超时:过长会话超时会占用过多内存,可适当减小timeout参数来释放内存。在server.xml中配置<Session timeout="1800" ... />。
- 禁用DNS查找:如果知道服务器名称与ip对应关系,可通过hosts文件指定或在server.xml中配置<Connector URIEncoding="UTF-8" ... />明确指定IP来避免DNS查询。
- 调整线程数:最大线程数过大会导致创建/销毁线程开销变高,但过小无法充分利用多核CPU。可根据CPU核数与负载情况调整maxThreads参数。 除此之外,还可以使用APR框架替代默认Servlet容器提高性能、开启访问日志定义日志切割条件等。总的来说,Tomcat性能调优需要全面考量,从JDK版本选择、TOMCAT各参数调整到额外组件(APR)使用等多个角度进行优化,并根据实际环境情况定制最佳配置。
解释:Tomcat和JVM的关系
1:Tomcat 是 Java 程序,运行在 JVM 之上,差不多和你的 QQ 运行在你的 Windows 之上一样,启动的时候做了好多好多的工作为了让你的应用能够通过 HTTP 接收和返回消息。
2:Tomcat是一个Java写的http server,启动时就和所有http server差不多,监听断口,等待连接。
3:Tomcat和JVM的关系,不用想的太复杂,其本质上和你写一个HelloWorld跑在JVM上是一样的。而你感觉到复杂的地方是Tomcat这个Java写的程序,其实现了Servlet和JSP的规范,是一种容器,支持实现了Servlet规范的应用运行。但是这些只是应用的内部逻辑,和程序本质与JVM的关系并没有变。
而要了解Tomcat在启动的时候都做了什么事情,首先从启动脚本入手,你观察到从Bootstrap类开始启动,而具体细节其实有很多,包含classLoader的创建,配置文件的解析,安全策略的配置使用,Logging的初始化,对于Host的解析,Context的解析等等。
优化系统吞吐量:
指导原则是:增加并发数 和 减少平均响应时间!
系统吞吐量几个重要参数:QPS(TPS)、并发数、响应时间。
QPS(TPS):每秒钟request/事务 数量
并发数: 系统同时处理的request/事务数
响应时间: 一般取平均响应时间
(很多人经常会把并发数和TPS理解混淆)
理解了上面三个要素的意义之后,就能推算出它们之间的关系:
QPS(TPS)= 并发数/平均响应时间
并发数 = QPS*平均响应时间
系统吞吐量、QPS、并发数、响应时间,以及提高吞吐量的思路_系统qps提升-CSDN博客
1. 测试QPS的方法
关于测试QPS的方法有很多,主要参考了如下文章:
面试官之问:知道你的接口“QPS”是多少吗?
大致意思如下:
- 在接口中书写请求次数,在日志中统计请求次数即可
logger.info
- 在tomcat服务器中的access log指定属性,默认访问的url会有统计其数量
(在日志中这么查询)cat xx.log |grep 'GET /mvc2'|cut -d ' ' -f4|uniq -c|sort -n -r
cut过滤空格,取第4列,uniq -c 在每列旁边显示该行重复出现的次数,sort排序
如果用了各个容器服务器,通过top命令查看其哪个用的多
再进到该容器或者服务器中,使用jstat查看gc状态
iftop
可以用来监控网卡的实时流量(可以指定网段)、反向解析IP、显示端口信息等( iftop是类似于top的实时流量监控工具)
2. 提高QPS的方法
在集群化的架构下,可以采用池化(内存池,连接池,线程池),分布式缓存,分布式消息队列,流控技术(服务降级,应用拆分,限流)和数据库高并发(分库分表,读写分离等)提高并发能力
-
增加并发数
后端开发的尽量无服务状态,可以更好的横向扩展
数据库的连接请求量、tomcat并发的线程数、数据库连接数、redis连接数、服务器的连接数、以及与服务器匹配的线程数,满足更多的需求内存池
:通过malloc的分配(大小合适的内存适应相应的内存)线程/线程池
:充分利用资源,减少开销连接池
:数据库预先创建好连接给线程等(提高速度) -
减少平均响应时间
Mq
:流量削峰,适当的给流量减压,还可以使用mq进行降低接口的延迟redis缓存
:进行写少读多的缓存压力算法
:优化程序(通过调用一些算法),可看我这篇文章:java中常见的限流算法详细解析网络层面
:减少网络开销,适当长连接或者短连接数据库层面
:尽量命中索引(单库中尽量MVCC在不加锁的情况下,实现并发读写,同时通过事务隔离级别控制并发效率。)(集群中分库分表,读写分离等)流控
:通过服务降级服务优化等
优质博客:全流程提升高并发从SLB-nginx-网络-阿里云ECS云服务器-tomcat-jvm-缓存-mq-数据库连接等