1、案例小结

1、平均负载

uptime查看系统的平均负载,在其升高后,又用 mpstatpidstat,观察每个CPU和每个进程CPU的使用情况,进而找出导致平均负载升高的进程,也就是压测工具 stress。

2、上下文切换

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

3、进程CPU使用率升高

使用top,发现CPU使用率升高的进程是 php-fpm,再用 perf top ,观察 php-fpm 调用链,最后找出 CPU 升高的根源,也就是库函数 sqrt() 。

4、系统CPU使用率升高

使用top,查看系统CPU升高,但通过 toppidstat,却找不出高CPU使用率的进程。然后再观察 top,又从 CPU使用率不高但处于 Running 的进程入手,找出可疑之处,最后通过 pref recordperf report ,发现是短时进程的问题。
针对短时进程,也可以使用专门的工具 execsnoop,他可以实时监控进程调用的外部命令。
注意:

  • pidstat 中, %wait 表示进程等待 CPU 的时间百分比。
  • top 中 ,iowait% 则表示等待 I/O 的 CPU 时间百分比。

    2、工具

    b0c67a7196f5ca4cc58f14f959a364ca.webp

    3、分析思路

    7a445960a4bc0a58a02e1bc75648aa17.webp

    4、优化

    1、应用程序优化

  • 编译器优化:很多编译器提供了优化选项

  • 算法优化:使用复杂度更低的算法
  • 异步处理:避免程序因为等待某一资源而一直阻塞
  • 多线程代替多进程:线程的上下文切换不切换进程地址空间,可以降低成本
  • 善用缓存

    2、系统优化

  • CPU绑定:把进程绑定到一个或多个CPU上,提高CPU缓存命中率,减少跨CPU调度带来的上下文切换消耗

  • CPU独占:进一步将CPU分组,通过CPU亲和性机制为其分配进程,CPU就由指定的进程独占
  • 优先级调整:使用nice调整进程的优先级,正值调低,负值调高优先级,保证核心应用优先处理
  • 为进程设置资源限制:cgroups来设置进程的CPU上限,防止某个应用耗尽系统资源
  • NUMA优化:支持NUMA的处理器会划分为多个node,每个node都有自己的本地内存空间。NUMA优化,就是让CPU尽可能只访问本地内存
  • 中断负载均衡:中断程序会耗费大量CPU。开启 irqbalance 服务或者配置 smp_affinity,就可以把中断处理过程自动负载均衡到多个 CPU 上。