监控指标解读和JVM 分析&调优
【摘要】 1、中间件指标编辑 当前正在运行的线程数不能超过设定的最大值。一般情况下系统性能较好的情况下,线 程数最小值设置 50 和最大值设置 200 比较合适。 当前运行的 JDBC 连接数不能超过设定的最大值。一般情况下系统性能较好的情况下,JDBC 最小值设置 50 和最大值设置 200 比较合适。 GC频率不能频繁,特别是 FULL GC 更不能频繁,一般情况下系统性能较好的情况下,...
1、中间件指标
当前正在运行的线程数不能超过设定的最大值。一般情况下系统性能较好的情况下,线 程数最小值设置 50 和最大值设置 200 比较合适。
当前运行的 JDBC 连接数不能超过设定的最大值。一般情况下系统性能较好的情况下,
JDBC 最小值设置 50 和最大值设置 200 比较合适。
GC频率不能频繁,特别是 FULL GC 更不能频繁,一般情况下系统性能较好的情况下,
JVM 最小堆大小和最大堆大小分别设置 1024M 比较合适。
2、数据库指标
SQL 耗时越小越好,一般情况下微秒级别。
命中率越高越好,一般情况下不能低于 95%。
锁等待次数越低越好,等待时间越短越好。
压测内容 | 压测线程数 | 吞吐量/s | 90%响应时间 | 99%响应时间 |
Nginx | 50 | 2335 | 11 | 944 |
Gateway | 50 | 10367 | 8 | 31 |
简单服务 | 50 | 11341 | 8 | 17 |
首页一级菜单渲染 | 50 | 270(db,thymeleaf) | 267 | 365 |
首页渲染(开缓存) | 50 | 290 | 251 | 365 |
首页渲染(开缓存、 优化数据库、关日 志) |
50 | 700 | 105 | 183 |
三级分类数据获取 | 50 | 2(db)/8(加索引) | ... | .. |
三级分类(优化业 务) |
50 | 111 | 571 | 896 |
三级分类(使用 redis作为缓存) |
50 | 411 | 153 | 217 |
首页全量数据获取 | 50 | 7(静态资源) |
Gateway+简单服务 | 50 | 3126 | 30 | 125 |
全链路 | 50 | 800 | 88 | 310 |
中间件越多,性能损失越大,大多都损失在网络交互了;
业务:
Db(MySQL 优化)
模板的渲染速度(缓存)
静态资源
5、JVM 分析&调优
jvm 调优,调的是稳定,并不能带给你性能的大幅提升。服务稳定的重要性就不用多说了, 保证服务的稳定,gc 永远会是 Java 程序员需要考虑的不稳定因素之一。复杂和高并发下的 服务,必须保证每次 gc 不会出现性能下降,各种性能指标不会出现波动,gc 回收规律而且干净,找到合适的 jvm 设置。Full gc 最会影响性能,根据代码问题,避免 full gc 频率。可以 适当调大年轻代容量,让大对象可以在年轻代触发 yong gc,调整大对象在年轻代的回收频 次,尽可能保证大对象在年轻代回收,减小老年代缩短回收时间;
1、几个常用工具
2、命令示例
jstat 工具特别强大,有众多的可选项,详细查看堆内各个部分的使用量,以及加载类的数量。 使用时,需加上查看进程的进程 id,和所选参数。
jstat -class pid: 显示加载 class 的数量,及所占空间等信息
jstat -compiler pid: 显示 VM 实时编译的数量等信息。
jstat -gc pid :可以显示 gc 的信息,查看 gc 的次数,及时间
jstat -gccapacity pid: 堆内存统计,三代(young,old,perm)内存使用和占用大小
jstat -gcnew pid: 新生代垃圾回收统计
jstat -gcnewcapacity pid: 新生代内存统计
jstat -gcold pid: 老年代垃圾回收统计
除了以上一个参数外,还可以同时加上 两个数字,如:jstat -printcompilation 3024 250 6 是 每 250 毫秒打印一次,一共打印 6 次,还可以加上-h3 每三行显示一下标题。
jstat -gcutil pid 1000 100 : 1000ms 统计一次 gc 情况统计 100 次;
在使用这些工具前,先用 JPS 命令获取当前的每个 JVM 进程号,然后选择要查看的 JVM。
jinfo 是 JDK 自带的命令,可以用来查看正在运行的 java 应用程序的扩展参数,包括 Java System 属性和 JVM 命令行参数;也可以动态的修改正在运行的 JVM 一些参数。当系统崩 溃时,jinfo 可以从 core 文件里面知道崩溃的 Java 应用程序的配置信息
jinfo pid :输出当前 jvm 进程的全部参数和系统属性
jinfo -flag name pid: 可以查看指定的 jvm 参数的值;打印结果:-无此参数,+有
jinfo -flag [+|-]name pid: 开启或者关闭对应名称的参数(无需重启虚拟机)
jinfo -flag name=value pid: 修改指定参数的值
jinfo -flags pid :输出全部的参数
jinfo -sysprops pid :输出当前 jvm 进行的全部的系统属性
jmap 可以生成 heap dump 文件,也可以查看堆内对象分析内存信息等,如果不使用这个命 令,还可以使用-XX:+HeapDumpOnOutOfMemoryError 参数来让虚拟机出现 OOM 的时候自动 生成 dump 文件。
jmap -dump:live,format=b,file=dump.hprof pid
dump 堆到文件,format 指定输出格式,live 指明是活着的对象,file 指定文件名。eclipse 可 以打开这个文件
jmap -heap pid
打印 heap 的概要信息,GC 使用的算法,heap 的配置和使用情况,可以用此来判断内存目 前的使用情况以及垃圾回收情况
jmap -finalizerinfo pid 打印等待回收的对象信息
jmap -histo:live pid 打印堆的对象统计,包括对象数、内存大小等。jmap -histo:live 这个 命令执行,JVM 会先触发 gc,然后再统计信息
jmap -clstats pid
打印 Java 类加载器的智能统计信息,对于每个类加载器而言,对于每个类加载器而言,它 的名称,活跃度,地址,父类加载器,它所加载的类的数量和大小都会被打印。此外,包含 的字符串数量和大小也会被打印。
-F 强制模式。如果指定的 pid 没有响应,请使用 jmap -dump 或 jmap -histo 选项。此 模式下,不支持 live 子选项。
jmap -F -histo pid
jstack 是 jdk 自带的线程堆栈分析工具,使用该命令可以查看或导出 Java 应用程序中线程堆 栈信息。
jstack pid 输出当前 jvm 进程的全部参数和系统属性
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)