性能优化(1. CPU分析工具)

性能优化(1. CPU分析工具)

关于本系列

本系列的计划是,前几部分讲述相关工具,后面讲述工具如何使用,在遇到问题的时候的一些分析套路。

概述

性能是对整个系统的研究,包括了所有的硬件组件和整个软件栈。

性能优化是个系统工程,总是牵一发而动全身。它涉及了从程序设计、算法分析、编程语言,再到系统、存储、网络等各种底层基础设施的方方面面。每一个组件都有可能出问题,而且很有可能多个组件同时出问题。需要把系统从应用程序、库函数、系统调用、再到内核和硬件等不同的层级贯穿起来。

工具

常用的CPU分析工具包括:uptime,vmstat,mpstat,sar,ps,top,pdstat,time,DTrace,perf.

uptime

在系统变慢的时候,我们都喜欢top,uptime看看系统的负载情况。

uptime

 23:28:33 up 1 day, 19:15, 4 users, load average: 0.01, 0.02, 0.00

前面三个输出是:

    当前时间 系统运行时间 正在登录的用户数

最后三个数字是1,5,15分钟内的平均负载。通过比较这三个数字,我们可以判断负载在15分钟内,是在上升,下降还是平稳。

平均负载表示了对CPU资源的需求,汇总正在运行的线程数。它不仅包括了正在使用 CPU 的进程,还包括等待 CPU 和等待 I/O 的进程。注意,平均负载是指单位时间内,系统处于可运行状态和不可中断状态的平均进程数,也就是平均活跃进程数,它和 CPU 使用率并没有直接关系。

可运行状态的进程,是指正在使用 CPU 或者正在等待 CPU 的进程。就是我们常用 ps 命令看到的,处于 R 状态(Running 或 Runnable)的进程。

不可中断状态的进程则是正处于内核态关键流程中的进程,并且这些流程是不可打断的,比如最常见的是等待硬件设备的 I/O 响应。就是我们在 ps 命令中看到的 D 状态(Uninterruptible Sleep,也称为 Disk Sleep)的进程。(不可中断状态实际上是系统对进程和硬件设备的一种保护机制)

区分平均负载与CPU使用率

CPU 使用率,是单位时间内 CPU 繁忙情况的统计,跟平均负载并不一定完全对应。

    CPU 密集型进程,使用大量 CPU 会导致平均负载升高,此时这两者是一致的; I/O 密集型进程,等待 I/O 也会导致平均负载升高,但 CPU 使用率不一定很高; 大量等待 CPU 的进程调度也会导致平均负载升高,此时的 CPU 使用率也会比较高。

观测工具:iostat、mpstat、pidstat

    iostat 是一个系统磁盘操作活动进行监视工具,是I/O statistics(输入/输出统计)的缩写。 mpstat 是一个常用的多核 CPU 性能分析工具,用来实时查看每个 CPU 的性能指标,以及所有 CPU 的平均指标,是Multiprocessor Statistics的缩写。 pidstat 是一个常用的进程性能分析工具,用来实时查看进程的 CPU、内存、I/O 以及上下文切换等性能指标。

模拟工具:stress

模拟CPU使用率高的情况:

$ stress --cpu 1 --timeout 600

模拟IO压力高的情况:

$ stress -i 1 --timeout 600

模拟大量进程需要调度的情况:

$ stress -c 8 --timeout 600

结论与思考

平均负载提供了一个快速查看系统整体性能的手段,反映了整体的负载情况。

但只看平均负载本身,并不能直接发现,到底是哪里出现了瓶颈。

所以,在理解平均负载时,需要注意:

经验分享 程序员 微信小程序 职场和发展