性能调优思路

JVM调优:

面试官:如何进行JVM 调优(附真实案例)(有实战举例)

Tomcat调优:

Tomcat性能优化_tomcat 优化-CSDN博客(有实战举例)

Tomcat性能优化-腾讯云开发者社区-腾讯云(具体参数解释及方案)

Tomcat作为常用的JavaWeb服务器,其性能调优主要从以下几个方面进行:

  1. 选用高效的JDK版本:不同的JDK版本对Tomcat的性能有较大影响,Java8及以上版本会有较好的表现。
  2. 调整堆内存大小:默认的堆内存大小较小,易出现OOM,可以适当调大堆内存,-Xmx和-Xms指定最大与初始堆内存大小。
  3. 使用本地线程池:默认使用全局线程池,改为使用本地线程池可以减小线程调度延迟,提高性能。在server.xml中配置<Executor name="tomcatThreadPool" ... />。
  4. 调整连接器acceptCount:默认值为100,可适当调大,控制Tomcat接受连接请求的速度,避免过多超时请求。在server.xml中配置<Connector acceptCount="500" ... />。
  5. 启用压缩:开启gzip压缩可以减小响应体大小,加快网页加载。在server.xml中配置<Connector compression="on" ... />。
  6. 缓存静态内容:通过将一些网页静态内容(图片、JS、CSS)缓存在内存中来增快访问速度。
  7. 使用AJP代替HTTP:AJP协议用于和Web服务器交互,其性能优于HTTP协议。可在server.xml中配置<Connector port="8009" protocol="AJP/1.3" ... />。
  8. 优化会话超时:过长会话超时会占用过多内存,可适当减小timeout参数来释放内存。在server.xml中配置<Session timeout="1800" ... />。
  9. 禁用DNS查找:如果知道服务器名称与ip对应关系,可通过hosts文件指定或在server.xml中配置<Connector URIEncoding="UTF-8" ... />明确指定IP来避免DNS查询。
  10. 调整线程数:最大线程数过大会导致创建/销毁线程开销变高,但过小无法充分利用多核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”是多少吗?

大致意思如下:

  1. 在接口中书写请求次数,在日志中统计请求次数即可logger.info
  2. 在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-数据库连接等

大促流量激增,通过什么手段提升系统的高并发、高可用性?_slb的qps是否够用_滴石编程的博客-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值