Java性能调优

Java性能调优

公司做拼团活动时候,服务器挂掉了,需要对服务器的性能进行排查,压力测试使用阿里云的PTS和本地的Jmemter配合使用模拟
用户真实登录的情况,以下是我在工作中得到一些经验.

保持调优的环境是良好的
  • redis,mysql是否与服务器在同一网段
检查各个连接池的配置是否合理

配置连接池让资源能够可以重复使用,避免多次创建对象而消耗过多的时间和不必要的操作

  • 服务器端redis连接池数量是否配置
  • 服务器端mysql连接池数量是否配置
  • httpclient(restTemplate)连接池数量是否配置
检查数据库字段是否有索引

不加索引可能导致全表扫描,进而发生read timeout

减少远程调用的次数

减少远程调用,优先存本地JVM

本地JVM -> Redis -> Mysql

配置合理的超时时间

配置合理的超时时间可以快速的让系统响应恢复,避免慢动作而卡死系统

需要配置的超时时间如下:

  • socketTimeout
  • connectTimeout
页面redis缓存

将静态页面,将首页的页面数据可以直接缓存到本地,然后定时刷新页面

优化tomcat参数

server.xml:

1
2
3
4
5
<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="5000" redirectPort="8443"
keepAliveTimeout="5000" maxKeepAliveRequests="300"
minSpareThreads="100" enableLookups="false" maxThreads="1000"
acceptCount="1000" URIEncoding="UTF-8"/>

catalina.sh:

1
2
3
4
5
CATALINA_OPTS="${CATALINA_OPTS} -d64 -Xms4096m -Xmx4096m -Xmn1536m -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=512m -XX:ReservedCodeCacheSize=1024m"
JAVA_OPTS="${JAVA_OPTS} -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:CMSInitiatingOccupancyFraction=70 -XX:SurvivorRatio=8 -XX:+DisableExplicitGC -XX:+ScavengeBeforeFullGC -XX:+CMSScavengeBeforeRemark"
JAVA_OPTS="${JAVA_OPTS} -verbose:gc -Xloggc:/usr/local/tomcat7/logs/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps"
JAVA_OPTS="${JAVA_OPTS} -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/tomcat/logs/heapdump.hprof"
JAVA_OPTS="${JAVA_OPTS} -Dfile.encoding=UTF-8"
性能调优排查策略

保持环境在高负载的情况下,去后台查看线程情况和GC情况

  • ping redis,mysql的环境是否保持在一个网段
    • 2毫秒以上可能就是在不同网段
  • 使用jstat --gc 10 1000查看gc情况以及各个区间的情况
    • 如果有过多的 full gc 可能需要调大 JVM 堆区的大小
  • 使用jstack <pid>命令查看线程情况
    • 看线程中是否有业务代码,如果有业务代码需要查看sql语句执行是否缓慢
    • 远程调用是否花费过多时间

参考文档

Java性能权威指南 奥克斯 (Scott Oaks) 人民邮电出版社

评论

`
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×