公司做拼团活动时候,服务器挂掉了,需要对服务器的性能进行排查,压力测试使用阿里云的PTS和本地的Jmemter配合使用模拟
用户真实登录的情况,以下是我在工作中得到一些经验.
保持调优的环境是良好的
- redis,mysql是否与服务器在同一网段
检查各个连接池的配置是否合理
配置连接池让资源能够可以重复使用,避免多次创建对象而消耗过多的时间和不必要的操作
- 服务器端redis连接池数量是否配置
- 服务器端mysql连接池数量是否配置
- httpclient(restTemplate)连接池数量是否配置
检查数据库字段是否有索引
不加索引可能导致全表扫描,进而发生read timeout
减少远程调用的次数
减少远程调用,优先存本地JVM
本地JVM -> Redis -> Mysql
配置合理的超时时间
配置合理的超时时间可以快速的让系统响应恢复,避免慢动作而卡死系统
需要配置的超时时间如下:
- socketTimeout
- connectTimeout
页面redis缓存
将静态页面,将首页的页面数据可以直接缓存到本地,然后定时刷新页面
优化tomcat参数
server.xml:
1 | <Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" |
catalina.sh:
1 | CATALINA_OPTS="${CATALINA_OPTS} -d64 -Xms4096m -Xmx4096m -Xmn1536m -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=512m -XX:ReservedCodeCacheSize=1024m" |
性能调优排查策略
保持环境在高负载的情况下,去后台查看线程情况和GC情况
- ping redis,mysql的环境是否保持在一个网段
- 2毫秒以上可能就是在不同网段
- 使用
jstat --gc 10 1000
查看gc情况以及各个区间的情况
- 如果有过多的 full gc 可能需要调大 JVM 堆区的大小
- 使用
jstack <pid>
命令查看线程情况
- 看线程中是否有业务代码,如果有业务代码需要查看sql语句执行是否缓慢
- 远程调用是否花费过多时间