Linux性能优化实战
倪朋飞
微软资深工程师,Kubernetes项目维护者
立即订阅
23395 人已学习
课程目录
已完结 64 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (2讲)
开篇词 | 别再让Linux性能问题成为你的绊脚石
免费
01 | 如何学习Linux性能优化?
CPU 性能篇 (13讲)
02 | 基础篇:到底应该怎么理解“平均负载”?
03 | 基础篇:经常说的 CPU 上下文切换是什么意思?(上)
04 | 基础篇:经常说的 CPU 上下文切换是什么意思?(下)
05 | 基础篇:某个应用的CPU使用率居然达到100%,我该怎么办?
06 | 案例篇:系统的 CPU 使用率很高,但为啥却找不到高 CPU 的应用?
07 | 案例篇:系统中出现大量不可中断进程和僵尸进程怎么办?(上)
08 | 案例篇:系统中出现大量不可中断进程和僵尸进程怎么办?(下)
09 | 基础篇:怎么理解Linux软中断?
10 | 案例篇:系统的软中断CPU使用率升高,我该怎么办?
11 | 套路篇:如何迅速分析出系统CPU的瓶颈在哪里?
12 | 套路篇:CPU 性能优化的几个思路
13 | 答疑(一):无法模拟出 RES 中断的问题,怎么办?
14 | 答疑(二):如何用perf工具分析Java程序?
内存性能篇 (8讲)
15 | 基础篇:Linux内存是怎么工作的?
16 | 基础篇:怎么理解内存中的Buffer和Cache?
17 | 案例篇:如何利用系统缓存优化程序的运行效率?
18 | 案例篇:内存泄漏了,我该如何定位和处理?
19 | 案例篇:为什么系统的Swap变高了(上)
20 | 案例篇:为什么系统的Swap变高了?(下)
21 | 套路篇:如何“快准狠”找到系统内存的问题?
22 | 答疑(三):文件系统与磁盘的区别是什么?
I/O 性能篇 (10讲)
23 | 基础篇:Linux 文件系统是怎么工作的?
24 | 基础篇:Linux 磁盘I/O是怎么工作的(上)
25 | 基础篇:Linux 磁盘I/O是怎么工作的(下)
26 | 案例篇:如何找出狂打日志的“内鬼”?
27 | 案例篇:为什么我的磁盘I/O延迟很高?
28 | 案例篇:一个SQL查询要15秒,这是怎么回事?
29 | 案例篇:Redis响应严重延迟,如何解决?
30 | 套路篇:如何迅速分析出系统I/O的瓶颈在哪里?
31 | 套路篇:磁盘 I/O 性能优化的几个思路
32 | 答疑(四):阻塞、非阻塞 I/O 与同步、异步 I/O 的区别和联系
网络性能篇 (13讲)
33 | 关于 Linux 网络,你必须知道这些(上)
34 | 关于 Linux 网络,你必须知道这些(下)
35 | 基础篇:C10K 和 C1000K 回顾
36 | 套路篇:怎么评估系统的网络性能?
37 | 案例篇:DNS 解析时快时慢,我该怎么办?
38 | 案例篇:怎么使用 tcpdump 和 Wireshark 分析网络流量?
39 | 案例篇:怎么缓解 DDoS 攻击带来的性能下降问题?
40 | 案例篇:网络请求延迟变大了,我该怎么办?
41 | 案例篇:如何优化 NAT 性能?(上)
42 | 案例篇:如何优化 NAT 性能?(下)
43 | 套路篇:网络性能优化的几个思路(上)
44 | 套路篇:网络性能优化的几个思路(下)
45 | 答疑(五):网络收发过程中,缓冲区位置在哪里?
综合实战篇 (13讲)
46 | 案例篇:为什么应用容器化后,启动慢了很多?
47 | 案例篇:服务器总是时不时丢包,我该怎么办?(上)
48 | 案例篇:服务器总是时不时丢包,我该怎么办?(下)
49 | 案例篇:内核线程 CPU 利用率太高,我该怎么办?
50 | 案例篇:动态追踪怎么用?(上)
51 | 案例篇:动态追踪怎么用?(下)
52 | 案例篇:服务吞吐量下降很厉害,怎么分析?
53 | 套路篇:系统监控的综合思路
54 | 套路篇:应用监控的一般思路
55 | 套路篇:分析性能问题的一般步骤
56 | 套路篇:优化性能问题的一般方法
57 | 套路篇:Linux 性能工具速查
58 | 答疑(六):容器冷启动如何性能分析?
加餐篇 (4讲)
加餐(一) | 书单推荐:性能优化和Linux 系统原理
加餐(二) | 书单推荐:网络原理和 Linux 内核实现
用户故事 | “半路出家 ”,也要顺利拿下性能优化!
用户故事 | 运维和开发工程师们怎么说?
结束语 (1讲)
结束语 | 愿你攻克性能难关
Linux性能优化实战
登录|注册

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

倪朋飞 2018-12-21
你好,我是倪朋飞。
今天是我们第二期答疑,这期答疑的主题是我们多次用到的 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/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《Linux性能优化实战》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(45)

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

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

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

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

    2018-12-21
    3
  • 辉晖
    对于问题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
    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
  • Griffin
    终于赶上了,倪老师能不能讲讲网络问题应该怎么排查呀,最近老是被docker,docker swarm的container寻址困扰。

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

    2018-12-23
    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
  • 东宇
    老师问下 perf系统调用显示unknown模块怎么处理 可以完全显示函数名字
    2019-12-11
  • Geek_557823
    老师, perf top -g -p {pid} 里面Event Count 和Samples 都为 0, 但是 perf top -g 是有很多数据的
    环境:
    CentOS Linux release 7.7.1908 (Core)
    Linux localhost 3.10.0-1062.el7.x86_64
    perf version 3.10.0-1062.4.1.el7.x86_64.debug
    note:
      ubuntu 上可以正常使用
      重装系统(CentOS-7-x86_64-Minimal-1908.iso (942.00 MB)), yum -y install perf 问题依旧
      使用 Linux Resource 源码安装 问题依旧
    镜像问题: https://segmentfault.com/q/1010000020976198/
    麻烦老师抽空看一下哈
    2019-11-26
  • zKerry
    难到没有综合性质的性能检测工具吗?
    2019-11-06
  • holly
    1. 在模拟高并发过程中,在第一台机器终端使用top命令查看php-fpm的进程号pid
    2. 使用`perf record -g -p pid`一段时间,退出
    3. 使用`docker cp perf.data phpfpm:/tmp`将2生成的perf.data文件拷贝到容器中分析
    4. 执行`docker exec -i -t phpfpm bash`
    5. 在容器的bash中运行如下命令
    ```
    $ cd /tmp/
    $ apt-get update && apt-get install -y linux-tools linux-perf procps
    $ apt-get install -y linux-perf
    $ perf_4.9 report
    ```
    显示的还是地址,而不是函数名
    显示的还是地址,而不是函数名
    Samples: 175K of event 'cpu-clock', Event count (approx.): 43885750000
      Children Self Command Shared Object Symbol `
    + 99.99% 0.00% php-fpm / [.] 0xffff80411a63c2e1 a
    - 99.99% 0.00% php-fpm [unknown] [.] 0x981e258d4c544155 a
         0x981e258d4c544155 a
       - 0x202e1 a
          - 99.70% 0xaf48b4
    ubuntu 18.04按照老师github上安装的docker镜像
    如果极客时间留言支持daima或markdown就好了
    2019-10-10
  • feihui
    老师,你好,请教个问题。关于 Failed to open *** 文件问题,我按照方法三(即 bindfs)的方法进行挂载,但还是提示 Failed to open ***,请问这个问题要怎么解决呢?thx
    2019-08-19
  • 郡主秋
    老师,我的在centos7上用perf分析宿主机上的应用也是显示16进制地址,没有函数名 ,这种怎么处理呢

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

    2019-07-18
  • Geek_joanie
    老师您好,做这个练习的过程中也遇到了符号不能解析的问题,采用了您所说的第三和第四种方法分别进行尝试,但是发现仍然有部分的符号不能解析?

    Samples: 10K of event 'cpu-clock', Event count (approx.): 10074000000

      Children      Self  Command  Shared Object        Symbol

    +   99.99%     0.00%  php-fpm  libc-2.24.so         [.] __libc_start_main

    +   99.99%     0.00%  php-fpm  [unknown]            [.] 0x782e258d4c544155

    +   99.76%     0.00%  php-fpm  php-fpm              [.] php_execute_script

    +   99.76%     0.00%  php-fpm  php-fpm              [.] 0xffffaa91f1219c67

    +   99.75%     0.00%  php-fpm  php-fpm              [.] zend_execute

    +   99.75%     0.00%  php-fpm  php-fpm              [.] zend_execute_scripts

    +   97.43%    37.76%  php-fpm  php-fpm              [.] execute_ex

    +   15.85%     0.00%  php-fpm  php-fpm              [.] 0xffffaa91f11cbea9

    +   11.05%    11.04%  php-fpm  libm-2.24.so         [.] sqrt

    +    8.44%     8.43%  php-fpm  php-fpm              [.] add_function

    +    8.36%     0.00%  php-fpm  php-fpm              [.] 0xffffaa91f11cbd9a

    +    1.95%     0.00%  php-fpm  php-fpm              [.] 0xffffaa91f11b70b7

    +    1.95%     1.95%  php-fpm  php-fpm              [.] 0x0000000000a800b7

    2019-07-09
  • 叶先生
    老师你好:
    我在学习使用perf 分析打包docker 下的.net core应用时,有个问题困扰了很久 在采用你的第四条建议 外面使用 perf record 记录然后进入容器分析,一直看不到.net core 函数名 网上找了一些资料比如在dock镜像打包的时候 export COMPlus_PerfMapEnabled=1,还是无法看到,不知道哪里出了问题

    作者回复: .net 调试符号表有没有配置?可以再试试方法三或者方法一

    2019-05-13
  • 一木成舟🌊
    我是在一台机器上,report record和perf reprot的,report函数名是16进制的,看各位同学的留言是在centos下才会出现。
    但是我是Ubuntu 14.04.2 LTS。也是出现这种问题了。按照老师上面的步骤,
    $ apt-get install -y linux-tools-common linux-tools-generic linux-tools-$(uname -r))
    安装后,还是不行,实在让人费解。

    作者回复: 这应该是版本太老导致的

    2019-03-26
  • 韦伯
    老师,我用的是ubuntu16.04,内核版本4.4.0.117,安装perf时提示需要安装linux-4.4.0.117-generic,但是安装上述包时又找不到。需要升级内核版本解决吗?有没有其他方式可以解决呢

    作者回复: 这一般是源的问题,更新源试试。也可以搜索deb包或者源码安装

    2019-03-04
  • 全大神啊
    花了两天时间看完了CPU部分,收获良多,以前不怎么用的命令,看了老师的文章了解知道了工具的作用,以及原理,大爱~接下来内存部分-.-。

    作者回复: 👍

    2019-02-15
    1
  • 、荒唐_戏_
    d3
    2019-01-26
  • 刘飞
    给大家分享下mac 跑docker时如果安装perf工具:
    首先启动容器时,要增加启动参数--privileged,否则后续操作提示没权限
    安装工具:apt-get install linux-source
    可以在/usr/src下找到压缩宝,解压,进入tools/perf,然后make&&make install进行编译
    把编译生成的perf拷贝到/usr/bin下
    注意:如果使用的时候不显示调用函数名,需要回到编译脚本那一步,仔细看报警信息缺哪些依赖的包,都下载下来重新编译。

    作者回复: 我还真没用 mac 中的 docker 跑过。谢谢分享

    2019-01-23
  • training
    在macbook上用docker上运行phpfpm实例,是不是没有办法跑通perf那些测试,学习用。
    2019-01-04
收起评论
45
返回
顶部