【人间995】【Linux性能优化】CPU使用率达到100%,怎么办?

哔前哔言

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

一、什么是CPU使用率

1.一、CPU

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

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

公式:nginx

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

        

1.二、系统CPU和任务统计信息

查询/proc/stat  docker

  • 第一行表示全部CPU的累加
  • 其余列表示不一样场景下CPU的累加节拍数,单位:USER_HZ10ms

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

二、怎么查看CPU使用率

2.一、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.二、pidstat命令

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

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

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

三、CPU使用率太高怎么办?

3.一、perf工具

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

3.1.一、perf top 采样

须要关注的内容并发

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

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

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

3.1.三、perf report

解析perf record保存的采样信息php-fpm

四、案例实践

4.一、环境准备

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

4.二、操做分析

在第一台虚拟机上执行下面的命令来运行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

附录

一、工具

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

         使用dockerd命令,可查看具体错误缘由

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

二、引用

  • 《极客时间》Linux性能优化实践
相关文章
相关标签/搜索