Linux 性能优化实战
倪朋飞
资深 Linux 专家,Kubernetes 项目维护者
87256 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 65 讲
结束语 (1讲)
Linux 性能优化实战
15
15
1.0x
00:00/00:00
登录|注册

14 | 答疑(二):如何用perf工具分析Java程序?

在容器外保存分析记录,再去容器内查看结果
指定符号路径为容器文件系统的路径
容器内运行perf
容器外构建相同路径的依赖库
Brendan Gregg的个人网站
Brendan Gregg的书《Systems Performance: Enterprise and the Cloud》
性能工具对系统性能的影响
Children和Self的含义
分析swapper
设置阈值显示调用图
perf report参数说明
开启JDK选项-XX:+PreserveFramePointer
需要/tmp/perf-PID.map文件
perf_events支持JIT
JVM运行堆栈
解决方法
perf report
perf record
问题5:性能优化书籍和参考资料推荐
问题4:理解perf report报告
问题3:perf报告中符号不显示调用栈
问题2:如何用perf工具分析Java程序
问题1:16进制地址而不是函数名
perf工具
性能优化工具perf分析Java程序

该思维导图由 AI 生成,仅供参考

你好,我是倪朋飞。
今天是我们第二期答疑,这期答疑的主题是我们多次用到的 perf 工具,内容主要包括前面案例中, perf 使用方法的各种疑问。
perf 在性能分析中非常有效,是我们每个人都需要掌握的核心工具。perf 的使用方法也很丰富,不过不用担心,目前你只要会用 perf record 和 perf report 就够了。而对于 perf 显示的调用栈中的某些内核符号,如果你不理解也没有关系,可以暂时跳过,并不影响我们的分析。
同样的,为了便于你学习理解,它们并不是严格按照文章顺序排列的,如果你需要回顾内容原文,可以扫描每个问题右下方的二维码查看。

问题 1: 使用 perf 工具时,看到的是 16 进制地址而不是函数名

这也是留言比较多的一个问题,在 CentOS 系统中,使用 perf 工具看不到函数名,只能看到一些 16 进制格式的函数地址。
其实,只要你观察一下 perf 界面最下面的那一行,就会发现一个警告信息:
Failed to open /opt/bitnami/php/lib/php/extensions/opcache.so, continuing without symbols
这说明,perf 找不到待分析进程依赖的库。当然,实际上这个案例中有很多依赖库都找不到,只不过,perf 工具本身只在最后一行显示警告信息,所以你只能看到这一条警告。
这个问题,其实也是在分析 Docker 容器应用时,我们经常碰到的一个问题,因为容器应用依赖的库都在镜像里面。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文介绍了如何使用perf工具来分析Java程序的方法。作者首先解答了使用perf工具时看到的是16进制地址而不是函数名的问题,并提出了四种解决方法。其次,文章延伸讨论了如何用perf工具分析Java程序,指出了需要生成符号表和开启JDK选项来生成全部调用栈。作者强调了学习性能优化时不应该局限于具体的编程语言或性能工具,而是要掌握整体的分析思路。此外,文章还介绍了如何理解perf report报告以及推荐了一本经典的性能优化书籍。整体而言,本文内容涉及到了perf工具的使用方法和性能优化的思路,对于需要了解如何使用perf工具分析Java程序的读者具有一定的参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Linux 性能优化实战》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(67)

  • 最新
  • 精选
  • 我来也
    [D14打卡] 很赞同老师的观点: "任何东西的第一遍学习有不懂的地方很正常,忍住恐惧别放弃,继续往后走,前面很多问题可能会一并解决掉 ,再看第二遍、第三遍就更轻松了。" 我好像很早就这样实践了: 第一遍不管看不看得懂,先尽量细看. 再特意过一段时间回头重新学一遍,除了能掌握更多的东西,还能体会到"温故而知新"的感觉. ---------------------------- 现在就是"师傅领进门,修行看个人." "先从最基本的原理开始,掌握性能分析的思路,然后再逐步深入,探究细节" ---------------------------- 自从学了专栏,越来越觉得自己的<英语>该好好补补了,深感能力不足啊. 那么多好的资源,一手资料几乎都是英文的,看不懂真是可惜了!

    作者回复: 英语也是基本要求,多读多看就熟悉了😊

    2018-12-21
    19
  • ninuxer
    打卡day15 perf report中关于swapper的内容,后面我也去查了,才发现是自己理解有误,感谢老师指出,这里的swapper不是内存概念的swap,而是cpu空闲时执行的一个默认调用 要啃啃《性能之巅:洞悉系统、企业与云计算》了,作者博客http://www.brendangregg.com/ 请教老师,理解内核这块,有合适的书推荐么?我查了下,看了下目录,感觉《Linux内核设计与实现》可能比较适合,其他的如《Linux内核情景分析》,《深入理解Linux内核》怎么样?

    作者回复: 《深入Linux内核架构》挺不错,不过是本大块头,啃下应该要花不少时间

    2018-12-21
    2
    13
  • 辉晖
    对于问题1,使用方法4还是看不到函数名,只能看到一些 16 进制格式的函数地址 在载入perf.data过程不断出现提示:Failed to open ***, continuing without symbols 载入完成后,perf 界面最下面的那一行警告信息是:Cannot load tips.txt file, please install perf!

    作者回复: Failed to open ***, continuing without symbols 说明还是无法找到相应的符号表,根据警告提示逐个安装应该就可以了

    2019-06-27
    2
  • 子轩Zixuan
    趁周末跟上了老师的脚步,老师讲解的很好,感谢!另外我注意到老师在专栏里的实例都是现场调试,但是我遇到过实际情况需要尽快恢复服务,先把代码还原重新发布保证服务可用,只留下一台保留问题现场的机器,但是已经不接受请求了,像这种情况除了事先监控以外,还有别的方案能定位问题吗?

    作者回复: 是的,线上问题要优先恢复,排查不能花过多时间,所以很多情况下都要靠监控系统了解当时的状况。除此之外,原来服务还在的话,可以试试能否重现问题,比如模拟当时的请求;或者也可以从日志中寻找线索。

    2018-12-23
    2
  • Griffin
    终于赶上了,倪老师能不能讲讲网络问题应该怎么排查呀,最近老是被docker,docker swarm的container寻址困扰。

    作者回复: 不要急,我们有网络模块的

    2018-12-23
    2
  • 郡主秋
    老师,我的在centos7上用perf分析宿主机上的应用也是显示16进制地址,没有函数名 ,这种怎么处理呢

    作者回复: perf 界面应该有缺少符号的提示吧?按照提示安装缺少的调试信息

    2019-07-18
    2
    1
  • 辣椒
    老师,我把perf.data拷贝进容器,然后在容器中按照提示安装了perf, 再执行perf_4.9 report时报以下信息: Kernel address maps (/proc/{kallsyms,modules}) were restricted. Check /proc/sys/kernel/kptr_restrict before running 'perf record' As no suitable kallsyms nor vmlinux was found, kernel samples can't be resolved. Samples in kernel modules can't be resolved as well. xPress any key... 我本身的机器是centos7.2. 请老师提示一下解决的思路,谢谢!

    作者回复: echo 0> /proc/sys/kernel/kptr_restrict

    2019-01-07
    1
  • 子轩Zixuan
    感谢老师耐心回复,接着线上定位问题想问下,如果要事先做好监控系统,一般需要做到什么程度?目前只有阿里云的监控感觉不够用

    作者回复: 对的,至少要从系统和应用两个层面监控。系统层面就是我们专栏里提到的系统资源使用情况;应用层面除了进程的资源监控之外,还有应用对外的接口、与其他服务间调用、数据库、应用内部功能模块等一系列的metrics(可以参考APM)

    2018-12-25
    1
  • 无名老卒
    全部刷完了,把各个CPU容易出现问题的情况基本上都写清楚了,而且都有详细的测试用例,除了软中断那个需要SYN攻击之外,其他的测试用例都一五一十的都做过了,受益良多。我有以下疑问,希望老师可以解答下: 1、软中断老师是用SYN攻击的方式来讲解这部分的实例的,那还有没有其他典型的软中断的案例呢? 2、硬中断的实例老师没有讲,可以补一篇吗? 3、老师所讲的实例,都是单一模式的,在实际的生产环境下,情况要复杂很多,老师能再讲一下印象最深刻的实际情况吗? 另外,我有一个小建议,老师的案例都是用docker来搭建环境的,在一个用例要多次下载不同的image,但其实这些image只是里面的测试用例变了,所以可以先下载file文件,使用docker -v挂载的方式进行测试。这样可以大大减少下载镜像的时间。如下,就是使用docker run -v /usr/local/src/app-fix2:/app --privileged --name app-fix -d feisky/app:iowait 来运行的镜像。 ``` [root@linjx src]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 0ecb229f87e4 feisky/app:iowait "/app" 3 minutes ago Up 3 minutes app-fix a251996e0d60 feisky/app:iowait "/app" 5 hours ago Exited (137) 20 minutes ago app ```

    作者回复: 1. 网络后面还会讲 2. 硬中断的原理其实差不太多,所以没有单独拎出来 3. 现在单个模块的案例的确不太复杂,这也是为了让大家都能更直观理解这些问题 关于image下载,其实可以使用国内的镜像加速,网络搜索找到。并且基础镜像一样的话,也只需要下载新的layer即可。 最后,你的容器推退出了,请参考github设置启动参数解决。

    2018-12-23
    1
  • geraltlaush
    老师,有个问题,如果iowait过高,导致系统卡死,ssh几乎操作不动,怎么快速找出进程杀掉,iotop敲了20分钟没响应

    作者回复: 这种情况没法SSH操作,只能靠监控系统了,一定要把这些性能指标监控起来

    2018-12-22
    1
收起评论
显示
设置
留言
67
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部