哔前言经常练习费曼学习法了解系统知识原理掌握性能分析工具多练习,多思考,多提问只记录个人学习记录,欢迎指正1.什么是CPU使用率1.1、CPUCPU利用率:统计单位时间内CPU使用率,数值以%表示Beatrate:每秒的时间中断次数。内核节拍率(HZ,可配置),用户空间节拍率(USER_HZ,固定,不可变)Linux使用CPULinux多任务操作系统,将每个CPU时间分成很短的时间片,然后通过调度器依次分配使用和为每个任务维护CPU时间首先定义节拍率,触发时间中断,使用全局变量Jiffies记录自启动以来的节拍数,一旦发生中断,Jiffies加1公式:CPU使用率是除以外的总时间idletimeCPU时间百分比性能工具计算CPU使用率,间隔取2个值,计算平均CPU使用率【注意,不同工具的时间间隔可能不一致,需要设置一致]1.2、系统CPU和任务统计查询/proc/stat第一行表示所有CPU的累计,其他列表示CPU在不同场景下的累计节拍,单位:USER_HZ为10ms2,如何查看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时间guestnice[gnice]:运行低优先级虚拟机时间2.2、pidstat命令详细查看各进程CPU占用情况%usr需要关注的内容:user态CPU使用率%system:内核态CPU使用率%guest:运行虚拟机CPU使用率%wait:等待CPU使用率%CPU:总CPU使用率Average:平均值没看到%wait,显示区域太小,3.CPU占用率过高怎么办?3.1.perf工具可以分析系统的各种事件和内核性能,也可以分析指定应用程序的性能问题。3.1.1.perftop采样需要注意的内容Samples:采样个数event:事件类型Eventcount:事件总数Overhead:指该符号的性能事件在所有应用中所占的比例Shared:指函数所在的动态共享对象或指令所在,如:内核、进程名、动态链接库名等。内核空间Symbol:表示符号名,即函数名。当函数未命名时,使用十六进制地址表示系统的性能信息。3.1.2、perfrecord离线存储,按Ctrl+C终止采样3.1.3、perfreport分析perfrecord中保存的采样信息4、案例实践4.1、环境准备机器配置:2CPU,8GB内存预装docker,sysstat、perf、ab等工具4.2、运行分析在第一台运行Nginx和PHP服务的虚拟机上执行如下命令#dockerrun--namenginx-p10000:80-itdfeisky/nginx#dockerrun--namephpfpm-itd--networkcontainer:nginxfeisky/php-fpm第二个终端使用curl访问http://[VM1的IP]:10000确认Nginx已经正常启动。你应该能够看到它有效!的回应。测试虚拟机的ip地址为192.168.153.132接下来我们来测试一下这个Nginx服务的性能。在第二个终端运行如下ab命令#并发测试10个请求测试Nginx性能,一共100个请求ab-c10-n100http://192.168.153.132:10000/在第二个终端,测试会是请求总数增加到10000#并发10个请求测试Nginx性能,一共10000个请求ab-c10-n10000http://192.168.153.132:10000/这里可以看到有几个php-系统中fpm进程总CPU使用率接近200%;并且每个CPU的用户使用率(us)也已经超过了98%,接近饱和。这样我们就可以确认是用户空间的php-fpm进程导致了CPU占用率的突然升高。接下来我们用perf分析是哪个函数导致的#-g打开调用关系分析,-p指定php-fpm的进程号45943$perftop-g-p45943复制Nginx应用的源码看看是否它调用了这两个函数#停止原始应用程序$dockerrm-fnginxphpfpm#运行优化后的应用程序$dockerrun--namenginx-p10000:80-itdfeisky/nginx:cpu-fix$dockerrun--namephpfpm-itd--networkcontainer:nginxfeisky/php-fpm:cpu-fix附录1、安装docker时,docker服务一直无法启动。使用dockerd命令查看perf安装具体报错原因:sudoyuminstallperfab(apachebench)HTTP服务性能测试工具2,参考《极客时间》Linux性能优化实践
