常见的性能问题:
1、CPU高
a)线程忙
1) 使用top命令,先找到占用CPU高的进程PID,确认是否是java进程导致的占用CPU高
2) top -H -p <PID> 查看哪个占用CPU高的线程Thread-ID,先把它记下来,留待第4步使用
3) jstack <PID> /home/aaa.log 将堆栈信息存储到文件中,下载文件
4) 将步骤2的线程ID,转成十六进制,在aaa.log中搜索,便可以看到该线程的调用栈,便可知道该线程在执行什么代码
b)频繁GC
如果经过a)排查结果发现是频繁GC,说明有线程在大量创建对象,存在内存溢出风险,可按“内存溢出”的思路继续排查
2、内存溢出 | 内存占用大
现象:
1)Tomcat重启十几分钟后,界面逐步变卡,请求响应慢
2)CPU占用高,GC频率高
排查思路:
1)通过命令jmap -histo:live <PID> | head -1000, 查看创建的对象个数排名前1000
2)查看哪些是自己写的Bean之类,推测该Bean的使用场景
排查结果:
某个服务挂了很长时间,数据库里堆积了大量未推送的消息。Tomcat启动时会一次推送全部数据,数据量太大,创建的对象多
3、上下行流量大
现象:客户对服务器做流量监控,以防止偷数据的事情发生。使用zabix发现有一台服务器流量异常大
排查思路:通过tcpdump抓包,将数据转成csv文件,通过Excel对数据做透视图,统计哪两个IP通信异常
排查结果:有一台备用机,做数据备份,属于正常流量
4、磁盘IO高
现象:界面响应慢,静态资源耗时长,Ajax请求耗时短。CPU占用正常,内存占用正常,网络正常
排查思路:因只有静态资源加载慢,怀疑是磁盘IO的问题
1)使用iostat查看系统的磁盘占用情况,确定存在IO大的问题
2)iotop命令或pidstat -d 1,查看IO排名,看是否有进程在一直读写操作。发现有多个磁盘写操作的记录,logging操作是日志相关的线程
3)查看日志级别,发现是DEBUG级别的日志
解决思路:
1)设置日志缓存,达到缓存时,才输出到文件中 log4j.appender.A3.BufferSize=8192
2)改为异步输出 <appender name="ASYNCOUT" class="org.apache.log4j.AsyncAppender">
3)日志级别改成ERROR级别,减少日志的打印量
4)log4j.additivity.monitorLogger=false 控制监控logger的日志不会输出到rootlogger,否则会产生许多重复的数据
5、JDBC耗时