1

哔前哔言

  • 始终践行费曼学习法
  • 理解系统知识原理
  • 掌握性能分析工具
  • 多实践,多思考,多提问
  • 仅记录个人的学习记录,欢迎指点纠正

1、什么是CPU使用率

1.1、CPU

CPU使用率:单位时间内CPU使用情况的统计,值以%表示
节拍率:每秒钟的时间中断次数。内核节拍率(HZ,可配置),用户空间节拍率(USER_HZ ,固定不可变)

  • Linux使用CPU
       Linux 多任务操作系统,将每个CPU时间划分成很短的时间片,再通过调度器轮流分配给各个任务使用
  • 维护CPU时间
       先定义节拍率,触发时间中断,并使用全局变量Jiffies记录开机以来的节拍数,发生一次中断,Jiffies加1

公式:

  •    CPU使用率,就是除了空闲时间外的其他时间占总CPU时间的百分比
  • 性能工具计算CPU使用率,取间隔一段时间的2次值,计算平均CPU使用率
    【注,不同工具的时间间隔可能会不一致,需设置成一致】

        

1.2、系统CPU和任务统计信息

查询/proc/stat  

  • 第一行表示所有CPU的累加
  • 其他列表示不同场景下CPU的累加节拍数,单位:USER_HZ10ms

image2020-3-21_17-47-16.png

2、怎么查看CPU使用率

2.1、top命令

  • 显示了系统总体的CPU和内存使用情况,以及各个进程的资源使用情况
  • CPU使用率相关指标:
    user【us】:用户态的CPU时间,包括guest时间
    nice【ni】:低优先级用户态CPU时间,nice可取值范围-20到19,数值越大,优先级反而越低
    system【sys】:内核态CPU时间
    idle【id】:空闲时间。不包括等待I/O时间
    iowait【wa】:等待I/O的CPU时间
    irq【hi】:处理硬中断CPU时间
    softirq【si】:处理硬中断的CPU时间
    steal 【st】:处于虚拟机中,被其他虚拟机占用CPU时间
    guest【guest】:运行虚拟机CPU时间
    guest nice【gnice】:低优先级运行虚拟机时间

image2020-3-21_17-47-16.png

2.2、pidstat命令

  • 每个进程CPU使用的详细情况
  • 需要关注的内容
    %usr:用户态CPU使用率
    %system  :内核态CPU使用率
    %guest:运行虚拟机CPU使用率
    %wait:等待CPU使用率
    %CPU:总CPU使用率
    Average:平均值

image2020-3-21_18-10-51.png

没有看到%wait,显示区域太小,在文件最下面

3、CPU使用率过高怎么办?

3.1、perf工具

   可分析系统的各种事件和内核性能,还可以分析指定应用程序的性能问题

3.1.1、perf top 采样

需要关注的内容

  • Samples:采样数
  • event:事件类型
  • Event count:事件总数量
  • Overhead:指该符号的性能事件在所有采用中的比例
  • Shared:指该函数或指令所在的动态共享对象,如:内核、进程名、动态链接库名等
  • Object:动态共享对象的类型

    • [.]表示用户空间的可执行程序、或者动态链接库
    • [k]表示内核空间
  • Symbol:表示符号名,即函数名,当函数未命名时用16进制地址表示
3.1.2、perf record

离线保存系统的性能信息,按Ctrl+C终止采样

3.1.3、perf report

解析perf record保存的采样信息

4、案例实践

4.1、环境准备

  • 机器配置:2CPU,8GB内存
  • 预先安装docker,sysstat,perf,ab等工具

4.2、操作分析

在第一台虚拟机上执行下面的命令来运行Nginx和PHP的服务

# docker run --name nginx -p 10000:80 -itd feisky/nginx
# docker run --name phpfpm -itd --network container:nginx feisky/php-fpm

第二个终端使用curl访问http://[VM1的IP]:10000,确认Nginx已经正常启动。你应该可以看到It works!的响应。

测试虚拟机的ip地址192.168.153.132

image2020-3-23_16-36-52.png

接着,我们来测试一下,这个Nginx服务的性能。在第二个终端运行下面的ab命令

# 并发10个请求测试Nginx性能,总共测试100个请求
ab -c 10 -n 100 http://192.168.153.132:10000/

image2020-3-23_16-42-59.png

在第二个终端,将测试的请求总数增加到 10000

# 并发10个请求测试Nginx性能,总共测试10000个请求
ab -c 10 -n 10000 http://192.168.153.132:10000/

这里可以看到,系统中有几个 php-fpm 进程的 CPU 使用率加起来接近 200%;而每个 CPU 的用户使用率(us)也已经超过了 98%,接近饱和。

这样,我们就可以确认,正是用户空间的 php-fpm 进程,导致 CPU 使用率骤升。

接下来,我们使用perf分析是哪个函数导致

# -g开启调用关系分析,-p指定php-fpm的进程号45943
$ perf top -g -p 45943

image2020-3-23_16-49-52.png

拷贝出 Nginx 应用的源码,看看是不是调用了这两个函数

image2020-3-23_16-59-25.png

# 停止原来的应用
$ docker rm -f nginx phpfpm
# 运行优化后的应用
$ docker run --name nginx -p 10000:80 -itd feisky/nginx:cpu-fix
$ docker run --name phpfpm -itd --network container:nginx feisky/php-fpm:cpu-fix

image2020-3-23_17-2-16.png
image2020-3-23_17-3-58.png

附录

1、工具

  • 安装docker时,启动docker service一直失败。

         使用dockerd命令,可查看具体错误原因

  • perf安装:sudo yum install perf
  • ab(apache bench) HTTP服务性能测试工具

2、引用

  • 《极客时间》Linux性能优化实践

南吕十八
5 声望3 粉丝

空白的简介,空白的人生