CPU使用率--下篇
CPU使用率--下篇
CPU 缓存
CPU 缓存是位于中央处理单元(CPU)内部的一组高速存储器,用于临时存储经常被处理器访问的指令和数据。缓存的存在是为了提高计算机的性能,因为它可以更快地提供处理器所需的信息,而无需等待主内存的较慢访问。
CPU 缓存通常分为多级缓存(L1、L2、L3):
- L1 Cache(一级缓存):
- 位于 CPU 内部,距离核心最近,速度最快。
- 分为指令缓存(L1i)和数据缓存(L1d)。
- 尺寸较小,通常在几十KB的范围。
- L2 Cache(二级缓存):
- 位于 CPU 内部,但相对于 L1 Cache 较远,速度次于 L1。
- 通常也分为指令缓存和数据缓存。
- 尺寸较大,可以达到几百KB到数兆字节。
- L3 Cache(三级缓存):
- 通常位于 CPU 芯片上,但不同核心共享。
- 比 L1 和 L2 缓存更大,可以达到数兆字节。
- 速度相对较慢,但仍然远快于主内存
CPU 缓存介于 CPU 和内存之间,缓存的是热点的内存数据。这些缓存按照大小不同分为 L1、L2、L3 等三级缓存,其中 L1 和 L2 在同一个cpu核中, 而在同一个CPU插槽中的多个核共享一个 L3 缓存。缓存命中率,即直接通过缓存获取数据的请求次数,占所有数据请求次数的百分比。当可以直接通过缓存获取到需要的数据,则命中缓存;否则需要从磁盘等地方读取获取数据。缓存命中率越高,表示直接从缓存获取数据的次数越多,程序执行效率越高。
使用cachestat 可以查看整个个操作系统缓存的读写命中情况:
cachestat安装方式:
yum install perf-tools-unstable
下面以1秒间隔输出三组缓存信息:
$ cachestat 1
Counting cache functions... Output every 1 seconds.
HITS MISSES DIRTIES RATIO BUFFERS_MB CACHE_MB
1989 0 13 100.0% 501 2600
12969 0 1412 100.0% 501 2600
16798 0 2803 100.0% 501 2600
$ lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 4
On-line CPU(s) list: 0-3
Thread(s) per core: 1
Core(s) per socket: 1
座: 4
NUMA 节点: 1
厂商 ID: GenuineIntel
CPU 系列: 6
型号: 85
型号名称: Intel(R) Xeon(R) Silver 4210 CPU @ 2.20GHz
步进: 7
CPU MHz: 2194.844
BogoMIPS: 4389.68
超管理器厂商: VMware
虚拟化类型: 完全
L1d 缓存: 32K
L1i 缓存: 32K
L2 缓存: 1024K
L3 缓存: 14080K
NUMA 节点0 CPU: 0-3
三级缓存要比一、二级缓存大许多倍,这是因为当下的 CPU 都是多核心的,每个核心都有自己的一、二级缓存,但三级缓存却是一颗 CPU 上所有核心共享的。
常用的性能监测工具
指标----->工具
性能指标 | 工具 | 说明 |
---|---|---|
平均负载 | uptime, top | top 提供更全面的指标 |
系统整体CPU使用率 | top, vmstat, mpstat, sar, /proc/stat | sar 可以记录历史数据;/proc/stat 是其他性能工具的数据来源 |
进程CPU使用率 | top, pidstat, ps, htop, atop | pidstat 只显示实际使用了 CPU 的进程;htop 和 atop 以不同颜色显示更直观 |
系统上下文切换 | vmstat | 除了上下文切换次数,还提供运行状态和不可中断状态进程的数量 |
进程上下文切换 | pidstat -w | 查看进程的上下文切换次数 |
软中断 | top, /proc/softirgs, mpstat | top 提供软中断 CPU 使用率;/proc/softirqs 和 mpstat 提供各种软中断在每个 CPU 上的运行次数 |
硬中断 | vmstat, /proc/interrupts | vmstat 提供总的中断次数;/proc/interrupts 提供各种中断在每个 CPU 上运行的累积次数 |
网络 | dstat, sar, tcpdump | dstat 和 sar 提供总的网络接收和发送情况;tcpdump 可以动态抓取正在进行的网络通讯 |
I/O | dstat, sar | dstat 和 sar 都提供了 I/O 的整体情况 |
CPU个数 | /proc/cpuinfo, lscpu | 直接读取 /proc/cpuinfo 文件,或者使用 lscpu 命令查看 CPU 信息 |
工具----->指标
工具 | CPU性能指标 |
---|---|
uptime | 平均负载 |
top | 平均负载、运行队列、整体的CPU使用率以及每个进程的状态和CPU使用率 |
htop | top增强版,以不同颜色区分不同类型的进程,更直观 |
atop | CPU、内存、磁盘和网络等各种资源的全面监控 |
vmstat | 系统整体的cpu使用率、上下文切换次数、中断次数,还包括处于运行和不可中断状态的进程数 |
mpstat | 每个CPU的使用率和软中断次数 |
pidstat | 进程和线程的CPU使用率、中断上下文切换次数 |
/proc/softirgs | 软中断类型和在每个CPU上的累积中断次数 |
/proc/interrupts | 硬中断类型和在每个CPU上的累积中断次数 |
ps | 每个进程的状态和CPU使用率 |
pstree | 进程的父子关系 |
dstat | 系统整体的CPU使用率 |
sar | 系统整体的CPU使用率,包括可配置的历史数据 |
strace | 进程的系统调用 |
perf | CPU性能事件剖析,如调用链分析、CPU缓存、CPU调度等 |
execsnoop | 监控短时进程 |
工具使用关系
使用案例
top、vmstat 和 pidstat 分别提供的重要的 CPU 指标,并用虚线表示关联关系,对应出了性能分析下一步的方向。
通过这张图你可以发现,这三个命令,几乎包含了所有重要的 CPU 性能指标,比如: 从 top 的输出可以得到各种 CPU 使用率以及僵尸进程和平均负载等信息。
- 从 vmstat 的输出可以得到上下文切换次数、中断次数、运行状态和不可中断状态的进程数。
- 从 pidstat 的输出可以得到进程的用户 CPU 使用率、系统 CPU 使用率、以及自愿上下文切换和非自愿上下文切换情况。
eg-1
pidstat 输出的进程用户 CPU 使用率升高,会导致 top 输出的用户 CPU 使用率 升高。所以,当发现 top 输出的用户 CPU 使用率有问题时,可以跟 pidstat 的输出做对比,观 察是否是某个进程导致的问题。 而找出导致性能问题的进程后,就要用进程分析工具来分析进程的行为,比如使用 strace 分析 系统调用情况,以及使用 perf 分析调用链中各级函数的执行情况
。
eg-2
top 输出的平均负载升高,可以跟 vmstat 输出的运行状态和不可中断状态的进程 数做对比,观察是哪种进程导致的负载升高。 如果是不可中断进程数增多了,那么就需要做 I/O 的分析,也就是用 dstat 或 sar 等工具, 进一步分析 I/O 的情况。 如果是运行状态进程数增多了,那就需要回到 top 和 pidstat,找出这些处于运行状态的到 底是什么进程,然后再用进程分析工具,做进一步分析。
eg-3
当发现 top 输出的软中断 CPU 使用率升高时,可以查看 /proc/softirqs 文件中 各种类型软中断的变化情况,确定到底是哪种软中断出的问题。比如,发现是网络接收中断导致 的问题,那就可以继续用网络分析工具 sar 和 tcpdump 来分析。