- 14.88 KB
- 2021-10-20 发布
- 1、本文档由用户上传,淘文库整理发布,可阅读全部内容。
- 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,请立即联系网站客服。
- 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细阅读内容确认后进行付费下载。
- 网站客服QQ:403074932
第一个问题:sys cpu比较高,一般是什么原因,如何监控、分析与定位
提示:这个问题的关键是,cpu资源是有谁消耗的,学过操作系统原理的同事都知道,进程是申请cpu资源的最小单位,而线程是最小的执行单位所以重点需要关注线程在做什么
首先系统级别的监控:
1、linux的监控可以查看系统的cpu是否过高,如top命令、nmon、vmstat或者jvasualvm工具都可以;
2、通过pidstst -sw可以查看上下文切换是否频繁这是系统级别的监控
java的应用程序,重点监控java虚拟机,因为java的应用程序是运行在java虚拟机上面的,java虚拟机有很多监控工具,可以使用jdk自带的,如jstat,jps,jmap等等,还有其他的如jprofile、jvasualvm等,我一般用jvasualvm来监控,这个工具可以监控java应用程序的cpu、内存、线程、gc等重要信息
一般原因及问题分析:
1、应用程序中有复杂的算法,如递归调用;
分析与定位:通过jvasualvm中的cpu采样与快照可以快速获取最消耗cpu的方法;
2、系统存在频繁的上下文切换,如锁争用,IO线程切换等;
分析与定位:首先确定是否存在频繁的上下文切换,可以通过pidstat -cw来确认;
锁争用可以通过打印jvm的线程堆栈,查看是否有多个其它线程等待同一个锁,这个重点查看jvm的用户线程,
IO线程切换,通过vmsta查看是否内存不足,是否启用了虚拟内存来确定,一般在应用程序做在主机,这种比较少见,一般出现在数据库服务器,可以通过查看最消耗io的sql语句来分析。
3、死锁
分析与定位:死锁,一般通过通过打印线程堆栈来确认,在线程堆栈中如果存在死锁,就出现a拥有b锁,同时申请c资源,以及d拥有c锁,同时申请b资源的现象。
4、频繁的fullGC;
分析与定位:这个可以通过jvasualvm中堆内存监控得到。
5、其他
分析与定位,其它问题,需要具体问题具体分析了。
第二个问题:jvm中内存泄露,如何监控,如何分析与定位
如何监控:这个上面已经描述过一部分了,jvasualvm可以做基本的内存监控,也可以通过jstat -gc来查看系统的系统情况,在jvasualvm中,如果发现每次内存回收后,堆内存的活跃数有增无减,且持续一段时间后,系统即使fullgc,也无法回收内存的时候,就会出现内存泄露了
如何分析与定位:这里有一个原理,你必须知道什么堆内存是不能回收的,专业的说法是,持续拥有gc root的对象是不能被回收的。通俗的说法是,没有其他的类引用这个对象,那么它就可以被回收了。明白这个原理之后,就好办了,我是通过jmap+ma来进行分析的,jmap可以拿到系统的堆内存的dump文件(有很多种工具可以拿到这个工具),ma可以分析出堆内存中,那些对象有内存泄露的嫌疑,且是拥有gc root的,同时它能分析出,是那些类引用了这些对象,这样就可以定位到具体的类,可以给开发最直接的指导与建议了。
第三个问题:线程堆栈看过没,如何确认锁竞争与死锁
死锁,一般通过通过打印线程堆栈来确认,在线程堆栈中如果存在死锁,就出现a拥有b锁,同时申请c资源,以及d拥有c锁,同时申请b资源的现象。
锁争用可以通过打印jvm的线程堆栈,查看是否有多个其它线程等待同一个锁,这个重点查看jvm的用户线程,
第四个问题:jvm堆内存结构,请简单描述一下
这个比较简单,jvm堆内存重要分为,年轻代和年老代,年轻代又分为e区、s0、s1三个区,这是java内存分析与java性能调优的基础,弄明白了jvm的内存结构,以及内存回收的过程,还有垃圾回收器有哪三种机制,就可以开始最基础的jvm内存调优了,这里简单描述一下jvm调优主要包括吞吐量调优,延迟调优,还有内存占用设置,跟细节的东西,这里就不描述了,大家可以在这个基础上去深入学习,都不难
第五个问题:需求分析中,如何确定并发数与吞吐量这两个指标
这个需要分两种情况:
第一种情况:如果是已经上线的应用,那么通过观察tomcat中的繁忙线程数与最大线程数来确定系统的并发数,性能测试过程中需要根据每个行业的不同,在实际测试过程中,需要乘以一个系数来作为性能测试的并发数,吞吐量(tps)这个参数可以通过观察分析系统pv量,已经pv量到tps之间的转换率来确定吞吐量。
第二种情况,如果是没有上线的应用,可以参考同类应用的情况来分析,重点是根据用户数,以及每个用户的在线时长,计算出平均在线用户数与并发数,这个只是一个大概值。吞吐量,也可以参考同类需求来分析。一般情况,没有上线的应用,我们都是测试系统的容量,然后和同类需求做比较,看是否达标。
第六个问题:如果发现数据库所在主机的I/O比较高,如何分析与定位问题
重点查看消耗IO的sql语句,数据库的性能问题,90%来源sql,所以sql的性能分析与调优,大家要重视在oracle端,我使用的是oracle的war报告,在mysql端,我重点查看slow.log与show processlist