本系列记录操作系统常见性能指标,写这个主要是记录也是回顾,笔记很长,拆分了几个部分,本篇记录CPU 的性能指标
CPU是计算机中最常见的概念,但是如何衡量CPU是否存在性能瓶颈,需要看哪些指标,可能多少都能说出来,CPU负载高、CPU使用率高、CPU缓存命中率低等等。具体怎样算高,哪些因素影响,如何排查呢?这里简单记录一下一些概念,希望帮助理解。
平均负载是指单位时间内,系统处于可运行状态和不可中断状态的平均进程数,也就是平均活跃进程数,包括了正在使用 CPU 的进程,还包括等待 CPU 和等待 I/O 的进程
平均负载 = (正在运行的进程数 + 等待运行的进程数) / CPU内核数
是指正在使用 CPU 或者正在等待 CPU 的进程
ps 命令看到的,处于 R 状态(Running 或 Runnable)的进程
正处于内核态关键流程中的进程,并且这些流程是不可打断的
ps 命令中看到的 D 状态(Uninterruptible Sleep,也称为 Disk Sleep)的进程
top 看到的load average: 0.02, 0.10, 0.05 分别是表示1分钟,5分钟,15分钟的平均负载
如果一个单核CPU平均负载为1,则表示该CPU正在运行一个进程60秒,或者多个进程正在分时运行,使得CPU使用率保持在100%。
但是对于多核CPU,平均负载超过1就表示在满负荷运行了。
看看下文理解平均负载
Understanding Linux CPU Load - when should you be worried? | Scout APM Blog
CPU 密集型进程,使用大量 CPU 会导致平均负载升高;
I/O 密集型进程,等待 I/O 也会导致平均负载升高,但 CPU 使用率不一定很高;
大量等待 CPU 的进程调度也会导致平均负载升高,此时的 CPU 使用率也会比较高。
注意:
sysstat 11.5.5 以上版本才有%wait字段
sysstat 软件包含了mpstat/iostat/pidstat等软件,而且会通过记录系统的CPU性能数据
默认在/var/log/sa 目录下,可以通过sar -f sa文件查看记录的数据
上下文:CPU的任何任务的执行,必须依赖CPU寄存器(CPU 内置的容量小、但速度极快的内存)以及程序计数器(用来存储 CPU 正在执行的指令位置、或者即将执行的下一条指令位置)
上下文切换有三类,进程、线程的上下文切换,以及中断上下文切换
进程从用户态进入内核态时,需要系统调用来完成
系统调用的CPU上下文切换过程(不切换进程):
进程上下文切换描述:
常见进程切换场景:
简单来说就是用完了CPU时间片,或者被抢占了的时候会进程上下文切换
常见线程上下文切换场景:
为了快速响应硬件的事件,中断处理会打断进程的正常调度和执行,转而调用中断处理程序,响应设备事件
/proc/interrupts 这个只读文件中读取中断使用情况
例如:
网卡接收到数据包后,通过硬件中断的方式,通知内核有新的数据到了,内核调用中断处理程序响应;
上半部就是将网卡数据读入内存,更新寄存器状态,再发送软中断信号,通知下半部处理;
下半部收到软中断信号唤醒后,从内存中找到网络数据,根据网络协议栈,对数据进行逐层解析处理,直到发送给应用。
pidstat -w 查看系统的上下文切换情况,依据切换类型分析大致原因
cswch(voluntary context switches)自愿上下文切换:
描述:指进程无法获取所需资源,导致的上下文切换
场景:I/O、内存等系统资源不足时,就会发生自愿上下文切换
nvcswch(non voluntary context switches)非自愿上下文切换:
描述:进程由于时间片已到等原因,被系统强制调度,进而发生的上下文切换
场景:大量进程都在争抢 CPU 时,就容易发生非自愿上下文切换
注意:pidstat 默认显示进程的指标数据,加上 -t 参数后,才会输出线程的指标
单位时间内 CPU 繁忙情况的统计,跟平均负载并不一定完全对应
我们有时候能在 top 命令的结果里面能看到超过100%的情况,这是因为这个进程占用了多个CPU
top 通过读取 /proc/stat 文件计算CPU利用率,/proc/stat 文件包含各种系统统计信息,包括 CPU 利用率数据。
mpstat 5 5
默认使用 3 秒时间间隔 \ 默认显示所有CPU的使用率平均值 \ 按1切换到每个CPU的使用率
僵尸进程持续的时间都比较短,在父进程回收它的资源后就会消亡,或者在父进程退出后,由 init 进程回收后也会消亡;
crond 的定时任务在执行时会大量标准输出时,可能会引起sendmail 的僵尸进程,不会释放,需要重定向标准输出;
使用的是进程的整个生命周期(/proc/stat)
ps -ef standard syntax 优点看到父进程
ps aux BSD syntax 优点看状态和使用情况
perf 是Linux 性能分析工具,可以查看实时的性能数据以及导出和导入性能数据,目前不太熟悉
perf top
实时显示占用 CPU 时钟最多的函数或者指令,因此可以用来查找热点函数(需要累积一定量的事件)
perf top -e cycles:k # 查看内核空间CPU消耗最多的函数
perf top -e cycles:u # 查看用户空间CPU消耗最多的函数
perf top -g -p pid
-g开启调用关系分析,-p指定进程号
perf record -g -p
记录相关信息到perf.data
perf report perf.data
加载文件记录的信息,通常用于解决容器内与宿主机依赖不一致的情况、
dstat 它吸收了 vmstat、iostat、ifstat 等几种工具的优点,可以同时观察系统的 CPU、磁盘 I/O、网络以及内存使用情况,这个软件来自 pcp-system-tools工具包
dstat --list # 查看所有可用的插件
dstat # 默认 -cdngy 参数,可以查看cpu 磁盘IO 网络IO 上下文切换
dstat -at # 在默认基础上加时间打印
mpstat 5 5
Apache HTTP服务器基准测试工具,用来测试网站性能,如下是一次请求10个,共计100个请求
ab -c 10 -n 100 http://localhost:8080/
注意这个得带上末尾的路径,光写端口不行,不要用来测试正常运行的网站!!!
CPU缓存命中率是指CPU在执行操作时,所需数据已经在缓存中的比例。缓存命中率的高低直接影响到CPU的性能表现。
这节内容来自AI生成
1)使用Perf工具:可以使用Perf工具来监测CPU缓存的命中率
perf stat -e LLC-loads,LLC-load-misses,LLC-stores,LLC-store-misses
实测:虚拟机会返回不支持,物理机才有效;按Ctrl+c 停止采集;
2)优化代码和数据结构:
3)查看CPU缓存配置:了解CPU缓存的层次结构和大小,可以帮助分析缓存不命中的原因。
lscpu
命令来查看CPU的详细信息,包括缓存的大小和层次结构cat /proc/cpuinfo
命令也可以获取到CPU的相关信息 lscpu | grep -E 'cache|CPU'dmidecode
可以提供更详细的硬件信息,包括CPU缓存配置(没看懂)4)代码分析:通过性能分析工具(如gprof、Valgrind等)来分析代码,找出频繁导致缓存不命中的代码段。
5)系统监控:使用系统监控工具(如htop、vmstat等)来监控CPU和内存的使用情况,辅助分析缓存命中率。