Java web应用性能分析概叙-CSDN博客
Java web应用性能分析之客户端慢_有的客户端跑java应用特别慢-CSDN博客
Java web应用性能分析服务端慢之前端页面慢_前端页面加载性能分析-CSDN博客
Java web应用性能分析服务端慢之Nginx慢_前端nginx请求比直接连接后台慢很多-CSDN博客
Java web应用性能分析服务端慢之前端代码优化_javaweb响应缓慢的原因-CSDN博客
Java web应用性能分析之服务端慢和优化概叙_cpu飙高java-CSDN博客
Java web应用性能分析之服务端慢[网络慢]_如何排查应用服务慢-CSDN博客
Java web应用性能分析之【CPU飙升分析概述】_web页面性能分析cpu占满是因为死循环,还是循环过多-CSDN博客
Java web应用性能分析之【6种OOM监控和分析】-CSDN博客
前面的文章,我从客户端慢和服务端慢做了分析解读,其表象无非就是linux服务器性能分析,重点是服务器资源监控,观察cpu、内存、磁盘、网络等方面的资源消耗情况,再结合运行日志、业务场景、业务逻辑实现进行综合分析。
Java web应用性能分析之【Linux服务器性能监控分析概叙】_java web内存分析工具-CSDN博客
同样分析java进程问题也是从cpu、内存、磁盘、网络等方面的资源消耗情况入手。
java进程常见问题
Java Web应用中的java进程问题从系统表象来看归结起来总共有四方面:CPU、内存、磁盘、网络。具体包括:
CPU问题:CPU 使用率峰值突然飚高(cpu占用率、ws上下文切换频繁、load avg飙高),GC问题。
内存问题:物理内存不足、溢出 (泄露)、OOM(堆、栈、元空间、线程)
磁盘问题:磁盘空间不足或者满了、log4j日志写磁盘慢阻塞业务请求、物理磁盘性能差、操作系统的io调度算法(elevator=deadline,这个算法试图把每次请求的延迟降至最低。该算法重排了请求的顺序来提高性能);
网络问题:网络流量异常、网络攻击、服务器带宽不足、网络io(零拷贝,dubbo支持零拷贝)、web服务器io模型(Nginx、Tomcat等)。
业务问题:业务高并发带来的PV 量过高、服务调用耗时异常、线程死锁、多线程并发问题、频繁进行 Full GC等问题;业务逻辑问题(具体场景具体分析)。
安装前请您修改 I/O 调度方式,设置系统使用 deadline 调度器,有 2 种方法能完成 I/O 调度方式的修改:
【方法一】 修改 grub 启动参数,操作系统启动时 deadline 全局生效。编辑 /boot/grub/menu.lst 文件,kernel 参数添加内容“elevator=deadline”:
查看磁盘调度
cat /sys/block/vda/queue/scheduler
修改 GRUB 的配置文件,重启生效
vi /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash" 修改为
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash elevator=deadline"
【方法二】 执行如下命令,修改当前系统配置,操作系统重启后需重新设置: # echo deadline > /sys/block/XXX/queue/scheduler 其中 XXX 表示要修改的物理磁盘,一般应设置第二块磁盘 sdb。可使 用如下语句查看修改结果:
I/O调度方法的查看与设置
1)查看当前系统的I/O调度方法:
# cat /sys/block/sda/queue/scheduler
noop anticipatory deadline [cfq]
2)临地更改I/O调度方法:
例如:想更改到noop电梯调度算法:
echo noop > /sys/block/sda/queue/scheduler
3)想永久的更改I/O调度方法:
修改内核引导参数,加入elevator=调度程序名
# vi /boot/grub/menu.lst
更改到如下内容:
kernel /boot/vmlinuz-2.6.18-8.el5 ro root=LABEL=/ elevator=deadline rhgb quiet
重启之后,查看调度方法:
# cat /sys/block/sda/queue/scheduler
noop anticipatory [deadline] cfq
已经是deadline了
Deadline(截止时间调度程序)
通过时间以及硬盘区域进行分类,这个分类和合并要求类似于noop的调度程序.
Deadline确保了在一个截止时间内服务请求,这个截止时间是可调整的,而默认读期限短于写期限.这样就防止了写操作因为不能被读取而饿死的现象.
Deadline对数据库环境(ORACLE RAC,MYSQL等)是最好的选择。
deadline实现了四个队列,其中两个分别处理正常read和write,按扇区号排序,进行正常io的合并处理以提高吞吐量.因为IO请求可能会集中在某些磁盘位置,这样会导致新来的请求一直被合并,于是可能会有其他磁盘位置的io请求被饿死。于是实现了另外两个处理超时read和write的队列,按请求创建时间排序,如果有超时的请求出现,就放进这两个队列,调度算法保证超时(达到最终期限时间)的队列中的请求会优先被处理,防止请求被饿死。由于deadline的特点,无疑在这里无法区分进程,也就不能实现针对进程的io资源控制。
对IO调度使用的建议
Deadline I/O scheduler 使用轮询的调度器,简洁小巧,提供了最小的读取延迟和尚佳的吞吐量,特别适合于读取较多的环境(比如数据库,Oracle 10G 之类).
Anticipatory I/O scheduler 假设一个块设备只有一个物理查找磁头(例如一个单独的SATA硬盘),将多个随机的小写入流合并成一个大写入流,用写入延时换取最大的写入吞吐量.适用于 大多数环境,特别是写入较多的环境(比如文件服务器)Web,App等应用我们可以采纳as调度.
CFQ I/O scheduler使用QoS策略为所有任务分配等量的带宽,避免进程被饿死并实现了较低的延迟,可以认为是上述两种调度器的折中.适用于有大量进程的多 用户系统
我在生产环境中测试过一台机器本来流量只有350M的样子,有时压力就不行了,流量也上不去了,因为读比较多, 所以使用deadline后,流量上升了50M,从流量之类的图上也见到稳定很多.
有关IO的几个内核参数
/proc/sys/vm/dirty_ratio
这个参数控制文件系统的文件系统写缓冲区的大小,单位是百分比,表示系统内存的百分比,表示当写缓冲使用到系统内存多少的时候,开始向磁盘写出数 据。增大之会使用更多系统内存用于磁盘写缓冲,也可以极大提高系统的写性能。但是,当你需要持续、恒定的写入场合时,应该降低其数值,一般启动上缺省是 10。下面是增大的方法:
echo ‘40′> /proc/sys/vm/dirty_ratio
/proc/sys/vm/dirty_background_ratio
这个参数控制文件系统的pdflush进程,在何时刷新磁盘。单位是百分比,表示系统内存的百分比,意思是当写缓冲使用到系统内存多少的时候, pdflush开始向磁盘写出数据。增大之会使用更多系统内存用于磁盘写缓冲,也可以极大提高系统的写性能。但是,当你需要持续、恒定的写入场合时,应该 降低其数值,一般启动上缺省是 5。下面是增大的方法:
echo ‘20′ > /proc/sys/vm/dirty_background_ratio
/proc/sys/vm/dirty_writeback_centisecs
这个参数控制内核的脏数据刷新进程pdflush的运行间隔。单位是 1/100 秒。缺省数值是500,也就是 5 秒。如果你的系统是持续地写入动作,那么实际上还是降低这个数值比较好,这样可以把尖峰的写操作削平成多次写操作。设置方法如下:
echo ‘200′ > /proc/sys/vm/dirty_writeback_centisecs
如果你的系统是短期地尖峰式的写操作,并且写入数据不大(几十M/次)且内存有比较多富裕,那么应该增大此数值:
echo ‘1000′ > /proc/sys/vm/dirty_writeback_centisecs
/proc/sys/vm/dirty_expire_centisecs
这个参数声明Linux内核写缓冲区里面的数据多“旧”了之后,pdflush进程就开始考虑写到磁盘中去。单位是 1/100秒。缺省是 30000,也就是 30 秒的数据就算旧了,将会刷新磁盘。对于特别重载的写操作来说,这个值适当缩小也是好的,但也不能缩小太多,因为缩小太多也会导致IO提高太快。建议设置为 1500,也就是15秒算旧。
echo ‘1500′ > /proc/sys/vm/dirty_expire_centisecs
当然,如果你的系统内存比较大,并且写入模式是间歇式的,并且每次写入的数据不大(比如几十M),那么这个值还是大些的好。
问题分析定位
一般会采用排除法,从外部排查到内部排查的方式来定位线上服务问题。
- 首先我们要排除其他进程 (除主进程之外) 可能引起的故障问题;
- 然后排除业务应用可能引起的故障问题;
- 可以考虑是否为运营商或者云服务提供商所引起的故障。
分析工具
Linux性能工具:
Java web应用性能分析之【Linux服务器性能监控分析概叙】_java web内存分析工具-CSDN博客
sar:收集、报告和保存系统活动信息。
sadf:以多种格式(例如 CSV、XML、JSON 等) 显示 sar 命令的输出。
iostat:报告 CPU 统计信息和输入/输出统计信息,用于设备和分区。
mpstat:报告关于各个可用 CPU 的统计信息。
pidstat:报告关于各个进程的统计信息。
tapestat:报告磁带驱动器统计信息。
cifsiostat:报告 CIFS 文件系统统计信息。
java进程问题分析定位工具
一般我们主要是用jdk自带工具和arthas。
jdk自带工具:jps、jinfo、jstat、jstack、jcmd、jmap、jconsole、jvisualvm
- VisualVM
- VisualVM是一个功能强大的Java应用程序性能分析工具、是NetBeans的profile子项目。
- 其可以生成线程转储文件,同时还提供了堆转储、CPU和内存分析等功能。
- 在线程面板中,monitor、running、sleeping、wait、park分别代表线程的不同状态。
- GitHub - oracle/visualvm: VisualVM is an All-in-One Java Troubleshooting Tool
- VisualVM: Releases
- Eclipse MAT
- Eclipse MAT(Memory Analyzer Tool)是一个专业的Java内存分析工具,可以分析堆转储文件,查找内存泄漏问题,分析对象引用关系等。
- Eclipse Memory Analyzer Open Source Project | The Eclipse Foundation
- Arthas
- 阿里巴巴开源的Java 应用诊断利器
- Home | arthas
- YourKit Java Profiler
- YourKit是一个商业化的Java性能分析工具,提供了线程转储分析功能,可以快速定位线程问题,同时还提供了内存和CPU分析功能。
- Java Profiler Features - YourKit
- FastThread
- FastThread是一款针对Java线程分析的工具,可以帮助用户分析线程转储文件,查找线程问题,识别性能瓶颈等。
- Smart Java thread dump analyzer - thread dump analysis in seconds
- Glowroot |
- Glowroot是一个开源的Java应用性能监控工具(Open source Java APM),可以生成线程转储文件,并提供了一些线程分析功能,如线程状态、锁信息等。
- Glowroot
- spotify thread dump analyzer
- Online Java Thread Dump Analyzer
- arthas
- 简介 | arthas
- https://github.com/alibaba/arthas/issues/1892
解决方案
依据分析定位,具体问题具体解决。