首先,服务是突然变慢还是长时间运行后观察到变慢?类似问题是否重复出现?
“慢”的定义是什么,能够理解是系统对其他方面的请求的反应延时变长吗?
问题可能来自于 Java 服务自身,也可能仅仅是受系统里其他服务的影响。初始判断可以 先确认是否出现了意外的程序错误,例如检查应用本身的错误日志。 对于分布式系统,很多都会实现更加系统的日志、性能等监控系统。一些 Java 诊断 工具也可以用于这个诊断,例如通过 JFR(Java Flight Recordera>),监控应用是否大 量出现了某种类型的异常。 如果有,那么异常可能就是个突破点。 如果没有,可以先检查系统级别的资源等情况,监控 CPU、内存等资源是否被其他进程 大量占用,并且这种占用是否不符合系统正常运行状况。
对于JVM 层面的性能分析,利用各种工具,如利用 JMC、JConsole 等工具进行运行时监控,在运行时进行堆转储分析,或者获取各种角度的统计数据(如jstat - gcutil 分析 GC、内存分带等)。
对于应用Profiling,简单来说就是利用一些侵入性的手段,收集程序运行时的细节,以定 位性能问题瓶颈。所谓的细节,就是例如内存的使用情况、最频繁调用的方法是什么,或者 上下文切换的情况等。但是不建议生产系统进行 Profiling,大多数是在性能测 试阶段进行。但是,当生产系统确实存在这种需求时,也不是没有选择。建议使用 JFR 配合JMC来做 Profiling,因为它是从 Hotspot JVM 内部收集底层信息,并经过了大量优化。
系统性能分析中,CPU、内存和 IO 是主要关注项。 对于 CPU,如果是常见的 Linux,可以先用 top 命令查看负载状况
除了 CPU,内存和 IO 是重要的注意事项,利用 free 之类查看内存使用。 或者,进一步判断 swap 使用情况,top 命令输出中 Virt 作为虚拟内存使用量,就是物 理内存(Res)和 swap 求和,所以可以反推 swap 使用。显然,JVM 是不希望发生大 量的 swap 使用的。