本帖最后由 Globaldc 于 2020-8-12 21:39 编辑
系统平均负载升高的原因一般来说,系统平均负载升高意味着 CPU 使用率上升。但是他们没有必然联系,CPU 密集型计算任务较多一般系统平均负载会上升,但是如果 IO 密集型任务较多也会导致系统平均负载升高但是此时的 CPU 使用率不一定高,可能很低因为很多进程都处于不可中断状态,等待 CPU 调度也会升高系统平均负载。 所以假如我们系统平均负载很高,但是 CPU 使用率不是很高,则需要考虑是否系统遇到了 IO 瓶颈,应该优化 IO 读写速度。 所以系统是否遇到 CPU 瓶颈需要结合 CPU 使用率,系统瓶颈负载一起查看(当然还有其他指标需要对比查看,下面继续讲解) 案例问题排查stress是一个施加系统压力和压力测试系统的工具,我们可以使用stress工具压测试 CPU,以便方便我们定位和排查 CPU 问题。 yum install stress // 安装stress工具
stress 命令使用// --cpu 8:8个进程不停的执行sqrt()计算操作
// --io 4:4个进程不同的执行sync()io操作(刷盘)
// --vm 2:2个进程不停的执行malloc()内存申请操作
// --vm-bytes 128M:限制1个执行malloc的进程申请内存大小
stress --cpu 8 --io 4 --vm 2 --vm-bytes 128M --timeout 10s
CPU 使用率问题排查总结一下 CPU 使用率问题及排查思路: 用户 CPU 和 Nice CPU 高,说明用户态进程占用了较多的 CPU,所以应该着重排查进程的性能问题。 系统 CPU 高,说明内核态占用了较多的 CPU,所以应该着重排查内核线程或者系统调用的性能问题。 I/O 等待 CPU 高,说明等待 I/O 的时间比较长,所以应该着重排查系统存储是不是出现了 I/O 问题。 软中断和硬中断高,说明软中断或硬中断的处理程序占用了较多的 CPU,所以应该着重排查内核中的中断服务程序。
CPU 问题排查套路CPU 使用率CPU 使用率主要包含以下几个方面: 用户 CPU 使用率,包括用户态 CPU 使用率(user)和低优先级用户态 CPU 使用率(nice),表示 CPU 在用户态运行的时间百分比。用户 CPU 使用率高,通常说明有应用程序比较繁忙。 系统 CPU 使用率,表示 CPU 在内核态运行的时间百分比(不包括中断)。系统 CPU 使用率高,说明内核比较繁忙。 等待 I/O 的 CPU 使用率,通常也称为 iowait,表示等待 I/O 的时间百分比。iowait 高,通常说明系统与硬件设备的 I/O 交互时间比较长。 软中断和硬中断的 CPU 使用率,分别表示内核调用软中断处理程序、硬中断处理程序的时间百分比。它们的使用率高,通常说明系统发生了大量的中断。 除在虚拟化环境中会用到的窃取 CPU 使用率(steal)和客户 CPU 使用率(guest),分别表示被其他虚拟机占用的 CPU 时间百分比,和运行客户虚拟机的 CPU 时间百分比。
通过性能指标查工具(CPU 相关)
性能指标 | 工具 | 说明 | 平均负载 | uptime
top | uptime 简单展示最近一段时间的平均负载
top 展示更多指标 | CPU 使用率 | vmstat
mpstat
top
sar
/proc/stat
| top、vmstat、mpstat 只可以动态查看当前,而 sar 可以查看历史
/proc/stat 是其他性能工具的数据来源 | 进程 CPU 使用率 | top
pidstat
ps
htop
atop
| top、ps 可以以排序方式展示进程 CPU、pidstat 不可排序展示
htop、atop 则以不同颜色展示各类数据更直观 | 系统上下文切换 | vmstat | 展示上下文切换此时、运行状态、不可中断状态进程数量 | 进程上下文切换 | pidstat | 展示项很多,包括进程上下文切换信息 | 软中断 | top
/proc/softirqs
mpstat | top 可查看软中断 CPU 使用率
/proc/softirqs 和 mpstat 则可以查看每个 CPU 上的累计信息 | 硬中断 | vmstat
/proc/interrupts | vmstat 查看总中断次数信息
/proc/interrupts 查看各种中断在每个 CPU 核心上的累计信息 | 网络 | dstat
sar
tcpdump | dstat、sar 较详细的展示出总的网络收发情况
tcpdump 提供动态抓取数据包的能力 | IO | dstat、sar | 2 者都提供了详细的 IO 整体情况 | CPU 信息 | /proc/cpuinfo
lscpu | 都可以查看 CPU 信息 | 系统分析 | perf
execsnoop | perf 分析各种内核函数调用、热点函数信息
execsnoop 监控短时进程 |
根据工具查性能指标(CPU 相关)
性能工具 | CPU 性能指标 | uptime | 5、10、15 分钟内的平均负载展示 | top | 平均负载、运行队列、CPU 各项使用率、进程状态和 CPU 使用率 | htop | top 增强版,以不同颜色区分不同类型进程,展示更直观 | atop | CPU、内存、磁盘、网络资源全访问监控,十分齐全 | vmstat | 系统整体 CPU 使用率、上下文切换次数、中断次数,还包括处于运行(r)和不可中断状态(b)的进程数量 | pidstat | 进程、线程(-t)的每个 CPU 占用信息,中断上下文切换次数 | /proc/softirqs | 展示每个 CPU 上的软中断类型及次数 | /proc/inerrupts | 展示每个 CPU 上的硬中断类型及次数 | ps | 每个进程的状态和 CPU 使用率 | pstree | 进程的父子关系展示 | dstat | 系统整体 CPU 使用率(以及相关 IO、网络信息) | sar | 系统整体 CPU 使用率,以及使用率历史信息 | strace | 跟踪进程的系统调用 | perf | CPU 性能事件分析,例如:函数调用链、CPU 缓存命中率、CPU 调度等 | execsnoop | 短时进程分析 |
CPU 问题排查方向
有了以上性能工具,在实际遇到问题时我们并不可能全部性能工具跑一遍,这样效率也太低了,所以这里可以先运行几个常用的工具 top、vmstat、pidstat 分析系统大概的运行情况然后在具体定位原因。
top 系统CPU => vmstat 上下文切换次数 => pidstat 非自愿上下文切换次数 => 各类进程分析工具(perf strace ps execsnoop pstack)
top 用户CPU => pidstat 用户CPU => 一般是CPU计算型任务
top 僵尸进程 => 各类进程分析工具(perf strace ps execsnoop pstack)
top 平均负载 => vmstat 运行状态进程数 => pidstat 用户CPU => 各类进程分析工具(perf strace ps execsnoop pstack)
top 等待IO CPU => vmstat 不可中断状态进程数 => IO分析工具(dstat、sar -d)
top 硬中断 => vmstat 中断次数 => 查看具体中断类型(/proc/interrupts)
top 软中断 => 查看具体中断类型(/proc/softirqs) => 网络分析工具(sar -n、tcpdump) 或者 SCHED(pidstat 非自愿上下文切换)
CPU 问题优化方向
性能优化往往是多方面的,CPU、内存、网络等都是有关联的,这里暂且给出 CPU 优化的思路,以供参考。
程序优化
基本优化:程序逻辑的优化比如减少循环次数、减少内存分配,减少递归等等。
编译器优化:开启编译器优化选项例如gcc -O2对程序代码优化。
算法优化:降低苏研发复杂度,例如使用nlogn的排序算法,使用logn的查找算法等。
异步处理:例如把轮询改为通知方式
多线程代替多进程:某些场景下多线程可以代替多进程,因为上下文切换成本较低
缓存:包括多级缓存的使用(略)加快数据访问
系统优化
CPU 绑定:绑定到一个或多个 CPU 上,可以提高 CPU 缓存命中率,减少跨 CPU 调度带来的上下文切换问题
CPU 独占:跟 CPU 绑定类似,进一步将 CPU 分组,并通过 CPU 亲和性机制为其分配进程。
优先级调整:使用 nice 调整进程的优先级,适当降低非核心应用的优先级,增高核心应用的优先级,可以确保核心应用得到优先处理。
为进程设置资源限制:使用 Linux cgroups 来设置进程的 CPU 使用上限,可以防止由于某个应用自身的问题,而耗尽系统资源。
NUMA 优化:支持 NUMA 的处理器会被划分为多个 Node,每个 Node 有本地的内存空间,这样 CPU 可以直接访问本地空间内存。
中断负载均衡:无论是软中断还是硬中断,它们的中断处理程序都可能会耗费大量的 CPU。开启 irqbalance 服务或者配置 smp_affinity,就可以把中断处理过程自动负载均衡到多个 CPU 上。
|