[Linux性能优化]一:CPU - 迁

 

套路篇

1 CPU性能指标

 

 

2 性能工具

  首先,平均负载的案例。我们先用 uptime, 查看了系统的平均负载;而在平均负载升高后,又用 mpstat 和 pidstat ,分别观察了每个 CPU 和每个进程 CPU 的使用情况,进而找出了导致平均负载升高的进程,也就是我们的压测工具 stress。

  第二个,上下文切换的案例。我们先用 vmstat ,查看了系统的上下文切换次数和中断次数;然后通过 pidstat ,观察了进程的自愿上下文切换和非自愿上下文切换情况;最后通过 pidstat ,观察了线程的上下文切换情况,找出了上下文切换次数增多的根源,也就是我们的基准测试工具 sysbench。

  第三个,进程 CPU 使用率升高的案例。我们先用 top ,查看了系统和进程的 CPU 使用情况,发现 CPU 使用率升高的进程是 php-fpm;再用 perf top ,观察 php-fpm 的调用链,最终找出 CPU 升高的根源,也就是库函数 sqrt() 。

  第四个,系统的 CPU 使用率升高的案例。我们先用 top 观察到了系统 CPU 升高,但通过 top 和 pidstat ,却找不出高 CPU 使用率的进程。于是,我们重新审视 top 的输出,又从 CPU 使用率不高但处于 Running 状态的进程入手,找出了可疑之处,最终通过 perf record 和 perf report ,发现原来是短时进程在捣鬼。另外,对于短时进程,我还介绍了一个专门的工具 execsnoop,它可以实时监控进程调用的外部命令。

  第五个,不可中断进程和僵尸进程的案例。我们先用 top 观察到了 iowait 升高的问题,并发现了大量的不可中断进程和僵尸进程;接着我们用 dstat 发现是这是由磁盘读导致的,于是又通过 pidstat 找出了相关的进程。但我们用 strace 查看进程系统调用却失败了,最终还是用 perf 分析进程调用链,才发现根源在于磁盘直接 I/O 。

  最后一个,软中断的案例。我们通过 top 观察到,系统的软中断 CPU 使用率升高;接着查看 /proc/softirqs, 找到了几种变化速率较快的软中断;然后通过 sar 命令,发现是网络小包的问题,最后再用 tcpdump ,找出网络帧的类型和来源,确定是一个 SYN FLOOD 攻击导致的。

 

 

 

 

 利用top、vmstat和pidstat三个工具,快速定位性能问题:

 

 

 

3 有多个性能问题同时存在,要怎么选择?

        广泛使用“二八原则”,就是说80%的问题都是20%的代码导致的

4 有多种优化方法时,要如何选择

  1.  CPU性能优化
    1. 性能指标: CPU使用率,用户CPU使用率,系统CPU使用率,等待I/O的CPU使用率,软中断和硬中断的CPU使用率
    2. 平均负载(Load Average) 1 5 15分钟的平均负载,理想情况平均负载等于逻辑CPU个数
    3. 进程上下文切换 无法获取资源而导致的自愿上下文切换; 被系统强制调用导致的非自愿上下文切换
    4. CPU缓存的命中率 
  2. 应用程序优化
    1. 编译器优化
    2. 算法优化
    3. 异步处理
    4. 多线程代替多线程
    5. 善用缓存
  3. 系统优化
    1. CPU绑定
    2. CPU独占
    3. 优先级调整
    4. 为进程设置资源限制
    5. NUMA优化
    6. 中断负载均衡
  4. 千万避免过早优化
    1. 过早优化是万恶之源  

 

 

1 确定性能的量化指标

2 测试优化前的性能指标

3 测试优化后的性能指标

 

像是 Java 这种通过 JVM 来运行的应用程序,运行堆...

极客时间版权所有: https://time.geekbang.org/column/article/73738

posted @ 2019-03-26 10:02  richardzgt  阅读(479)  评论(0编辑  收藏  举报