首先解答一下上一课时的问题。磁盘的速度这么慢,为什么 Kafka 操作磁盘,吞吐量还能那么高?

这是因为,磁盘之所以慢,主要就是慢在寻道的操作上面。Kafka 官方测试表明,这个寻道时间长达 10ms。磁盘的顺序写和随机写的速度比,可以达到 6 千倍,Kafka 就是采用的顺序写的方式。

经过上一课时我们了解到,想要进行深入排查,需要收集较详细的性能数据,包括操作系统性能数据、JVM 的性能数据、应用的性能数据等。

那么,我们应该如何获取这些数据呢?本课时我将介绍一系列常用的性能测试工具。

nmon —— 获取系统性能数据

除了在上一课时中介绍的 top、free 等命令,还有一些将资源整合在一起的监控工具,

nmon 便是一个老牌的 Linux 性能监控工具,它不仅有漂亮的监控界面(如下图所示),还能产出细致的监控报表。

nmon 监控界面

我在对应用做性能评估时,通常会加上 nmon 的报告,这会让测试结果更加有说服力。你在平时工作中也可如此尝试。

上一课时介绍的一些操作系统性能指标,都可从 nmon 中获取。它的监控范围很广,包括 CPU、内存、网络、磁盘、文件系统、NFS、系统资源等信息。

nmon 在 sourceforge 发布,我已经下载下来并上传到了仓库中。比如我的是 CentOS 7 系统,选择对应的版本即可执行。

./nmon_x86_64_centos7

按 C 键可加入 CPU 面板;按 M 键可加入内存面板;按 N 键可加入网络;按 D 键可加入磁盘等。

通过下面的命令,表示每 5 秒采集一次数据,共采集 12 次,它会把这一段时间之内的数据记录下来。比如本次生成了 localhost_200623_1633.nmon 这个文件,我们把它从服务器上下载下来。

./nmon_x86_64_centos7  -f -s 5 -c 12 -m  -m .

注意:执行命令之后,可以通过 ps 命令找到这个进程。

[root@localhost nmon16m_helpsystems]# ps -ef| grep nmon
root      2228     1  0 16:33 pts/0    00:00:00 ./nmon_x86_64_centos7 -f -s 5 -c 12 -m .

使用 nmonchart 工具(见仓库),即可生成 html 文件。下面是生成文件的截图。

nmonchart 报表

jvisualvm —— 获取 JVM 性能数据

jvisualvm 原是随着 JDK 发布的一个工具,Java 9 之后开始单独发布。通过它,可以了解应用在运行中的内部情况。我们可以连接本地或者远程的服务器,监控大量的性能数据。

通过插件功能,jvisualvm 能获得更强大的扩展。如下图所示,建议把所有的插件下载下来进行体验。

jvisualvm 插件安装

要想监控远程的应用,还需要在被监控的 App 上加入 jmx 参数。

-Dcom.sun.management.jmxremote.port=14000
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false

上述配置的意义是开启 JMX 连接端口 14000,同时配置不需要 SSL 安全认证方式连接。

对于性能优化来说,我们主要用到它的采样器。注意,由于抽样分析过程对程序运行性能有较大的影响,一般我们只在测试环境中使用此功能。

jvisualvm CPU 性能采样图

对于一个 Java 应用来说,除了要关注它的 CPU 指标,垃圾回收方面也是不容忽视的性能点,我们主要关注以下三点。

  • CPU 分析:统计方法的执行次数和执行耗时,这些数据可用于分析哪个方法执行时间过长,成为热点等。

  • 内存分析:可以通过内存监视和内存快照等方式进行分析,进而检测内存泄漏问题,优化内存使用情况。

  • 线程分析:可以查看线程的状态变化,以及一些死锁情况。

Arthas —— 获取单个请求的调用链耗时

Arthas 是一个 Java 诊断工具,可以排查内存溢出、CPU 飙升、负载高等内容,可以说是一个 jstack、jmap 等命令的大集合。

Arthas 启动界面

Arthas 支持很多命令,我们以 trace 命令为例。

有时候,我们统计到某个接口的耗时非常高,但又无法找到具体原因时,就可以使用这个 trace 命令。该命令会从方法执行开始记录整个链路上的执行情况,然后统计每个节点的性能开销,最终以树状打印,很多性能问题一眼就能看出来。

下面就是一个执行结果示例。

$ trace demo.MathGame run
Press Q or Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 28 ms.
`---ts=2019-12-04 00:45:08;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@3d4eac69`---[0.617465ms] demo.MathGame:run()`---[0.078946ms] demo.MathGame:primeFactors() #24 [throws Exception]

---ts=2019-12-04 00:45:09;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@3d4eac69    —[1.276874ms] demo.MathGame:run()
       `—[0.03752ms] demo.MathGame:primeFactors() #24 [throws Exception]

我们在后面的课时中,也会有实例来演示如何找到问题发生的具体原因。

wrk —— 获取 Web 接口的性能数据

wrk(点击进入 GitHub 网站查看)是一款 HTTP 压测工具,和 ab 命令类似,它也是一个命令行工具。

我们先来看一下它的执行结果。

Running 30s test @ http://127.0.0.1:8080/index.html12 threads and 400 connectionsThread Stats   Avg      Stdev     Max   +/- StdevLatency   635.91us    0.89ms  12.92ms   93.69%Req/Sec    56.20k     8.07k   62.00k    86.54%22464657 requests in 30.00s, 17.76GB read
Requests/sec: 748868.53
Transfer/sec:    606.33MB

可以看到,wrk 统计了常见的性能指标,对 Web 服务性能测试非常有用。同时,wrk 支持 Lua 脚本,用来控制 setup、init、delay、request、response 等函数,可以更好地模拟用户请求。

小结

为了获取更多性能数据,我们在本课时介绍了以下 5 款工具。

  • nmon 获取系统性能数据;

  • jvisualvm 获取 JVM 性能数据;

  • jmc 获取 Java 应用详细性能数据;

  • arthas 获取单个请求的调用链耗时;

  • wrk 获取 Web 接口的性能数据。

可以看出,这些工具有偏低层的、有偏应用的、有偏统计的、有偏细节的,在定位性能问题时,你需要灵活地使用这些工具,既从全貌上掌握应用的属性,也从细节上找到性能的瓶颈,对应用性能进行全方位的掌控。

这些工具能够很好地帮助我们找到系统的瓶颈点,那么对代码进行优化时,如何分析优化效果呢?又如何对代码片段进行快速、专业的测试呢?下一课时,我将介绍“基准测试 JMH”,来解答以上问题。

【java 性能优化实战】3 工具实践:如何获取代码性能数据?相关推荐

  1. linux性能优化实战学习笔记-(1)CPU性能分析工具与套路

    版权归Linux性能优化实战 作者倪鹏飞,本文主要是为学习.整理相关知识点,请勿用作商用,侵删. linux性能分析工具 下图来自:Brendan D. Gregg http://www.brenda ...

  2. 拉勾教育 | Java 性能优化实战 21 讲

    开篇词 开篇词 | Java 性能优化,是进阶高级架构师的炼金石 你好,我是李国.作为<Java 性能优化与面试 21 讲>这个课程的作者,我先来简单介绍下自己. 我曾任京东金融.陌陌科技 ...

  3. 《java性能优化实战》之编程性能优化

    目录 一.java编程性能优化实战 1.如何使用String.intern 节省内存 2.如何使用字符串的分割方法? 3.ArrayList还是LinkedList?使用不当性能差千倍 4.Strea ...

  4. 开源即巅峰,《Java程序性能优化实战》GitHub三小时标星已超34k

    蓦然回首自己做开发已经十年了,这十年中我获得了很多,技术能力.培训.出国.大公司的经历,还有很多很好的朋友.但再仔细一想,这十年中我至少浪费了五年时间,这五年可以足够让自己成长为一个优秀的程序员,可惜 ...

  5. 太牛了!我把阿里、腾讯、字节跳动、美团等Android性能优化实战整合成了一个PDF文档

    安卓开发大军浩浩荡荡,经过近十年的发展,Android技术优化日异月新,如今Android 11.0 已经发布,Android系统性能也已经非常流畅,可以在体验上完全媲美iOS. 但是,到了各大厂商手 ...

  6. Android主线程耗时动画卡顿,Android性能优化实战之界面卡顿

    原标题:Android性能优化实战之界面卡顿 作者:红橙Darren https://www.jianshu.com/p/18bb507d6e62 今天是个奇怪的日子,有三位同学找我,都是关于界面卡顿 ...

  7. 2 周流量激增百倍的腾讯课堂后台扩容和性能优化实战

    作者:andyawang,腾讯 CSIG 后台开发工程师 疫情期间,学校网课需求激增,腾讯课堂 2 天上线极速版,2 周内支持同时在线人数超百倍增长,对整个后台挑战非常大.整整 2 个月下来,同合作团 ...

  8. Linux性能优化实战学习笔记:第四十六讲=====实战分析

    Linux性能优化实战学习笔记:第四十六讲 一.上节回顾 不知不觉,我们已经学完了整个专栏的四大基础模块,即 CPU.内存.文件系统和磁盘 I/O.以及网络的性能分析和优化.相信你已经掌握了这些基础模 ...

  9. Linux性能优化实战学习笔记:第十讲==中断

    Linux性能优化实战学习笔记:第十讲 一.坏境准备 1.拓扑图 2.安装包 在第9节的基础上 在VM2上安装hping3依奈包 ? 1 2 3 4 5 6 7 wget http://www.tcp ...

  10. JavaScript系列—性能优化之《网站性能优化实战——从12.67s到1.06s的故事》

    本篇博文来源于网络 226 人赞同了该文章 原文作者:IMWeb jerryOnlyZRJ  原文链接:网站性能优化实战--从12.67s到1.06s的故事 - 腾讯Web前端 IMWeb 团队社区 ...

最新文章

  1. 达摩院年终预测重磅出炉:AI for Science 高居榜首,2022 十大科技趋势!
  2. 用VS2010构建MASM的编程环境
  3. css响应式布局 兼容ie6
  4. ABAP性能优化之修改一组纪录
  5. java正则表达式 匹配()_学习Java正则表达式(匹配、替换、查找)
  6. mysql数据表数据丢失6_MYSQL数据表损坏的原因分析和修复方法小结
  7. 努力和拼尽全力之间,到底差了什么
  8. 电子计算机厂 四月份生产计,一题多解 分数和百分数应用题(1)
  9. c语言 不显示dos窗口,运行DOS批处理不显示DOS窗口的方法
  10. poj 2186(强连通分量)
  11. 敏捷开发总结(2)开发过程活动
  12. 桌面下雪软件测试工程师,桌面下雪
  13. CFA大起底:三百六十度无死角详解CFA到底是个啥?
  14. [iOS]高德地图SDK开发--准备篇
  15. 那个找不到工作的iOS程序猿
  16. 什么是晶圆CMP的ILD?
  17. html5沙漏动画,CSS3 沙漏动画
  18. 24小时制与12小时制的时间换算
  19. 电子设计竞赛前的点点滴滴
  20. java爬虫webcollector_JAVA爬虫框架:WebCollector

热门文章

  1. 合种樟子松、云杉和胡杨
  2. R语言使用ggplot2包使用geom_violin函数绘制分组小提琴图(自定义分组的填充色)实战
  3. R语言使用ggplot2包geom_jitter()函数绘制分组(strip plot,一维散点图)带状图(水平带状图、垂直带状图、抖动程度配置)实战
  4. R语言ggplot2可视化创建堆叠的柱状图(stacked barplot)并且每个堆叠的柱状图都缩放到总和为100%实战:最后所有的堆叠的柱子都一样高、Y轴以百分比的形式来显示
  5. conda创建子环境并注册kernel
  6. 极大似然估计(Maximum Likelihood Estimattion Theory)是什么?极大似然估计的本质思想是什么?为什么极大似然可以作为损失函数使用?负对数似然损失函数(Negative
  7. js符号转码_js传特殊字符到controller (java)的转码问题
  8. Nature news: 未来40年,DNA测序将走向何方?
  9. 三代测序原理与数据文件简介(SMRT+Nanopore)
  10. 多媒体个人计算机的英语,计算机英语之网络多媒体篇