CPU使用率:原理、监控与优化

CPU使用率:是指在特定时间段内,CPU被占用的时间比例,通常以百分比表示。它反映了CPU的繁忙程度,是衡量系统负载和性能的重要指标。

一、核心概念

多核CPU的百分比计算方式:

每个CPU核心的利用率单独计算为100%

8核CPU的理论最大利用率为 8*100% = 800%

16核CPU则为1600%,以此类推

通常,任务管理器或top命令显示的是单个核心的使用率,比如四核CPU的话,总共有400%的可能。但如果是多线程或者多核处理器,不同的系统可能会有不同的显示方式。例如,在Linux系统中,top命令可能会显示超过100%的使用率,因为每个核心单独计算,所以如果有8个核心,800%就意味着所有核心都在满负荷运行。

常见场景:

计算密集型任务(如视频渲染、科学计算)

高并发服务(Web服务器处理大量请求)

程序异常(死循环、内存泄漏)

二、诊断流程

定位进程:

# Linux/MacOS

top -c # 按P排序CPU使用

htop # 图形化查看各核心负载

pidstat -u 1 3 # 详细进程监控

# Windows

任务管理器 → 性能标签 → 打开资源监视器

分析类型:

正常高负载:所有核心满载但响应正常(如渲染输出文件持续增长)

异常负载:伴随系统卡顿、服务超时、温度报警

常见异常原因:

死循环代码(如未正确退出的递归)

线程竞争(锁未释放导致大量线程等待)

配置错误(线程池设置过大)

恶意挖矿程序

三、解决方案

对于预期内的高负载:

垂直扩展:升级CPU(更多核心/更高主频)

水平扩展:分布式计算

优化算法复杂度(如O(n²)→O(n logn))

对于异常高负载:

# Linux终止进程

sudo kill -9 $(pidof 异常进程名)

# 或按CPU排序杀死前3高进程

ps -eo pid,ppid,cmd,%cpu --sort=-%cpu | head -n 4 | awk '{print $1}' | xargs kill -9

长期优化:

使用cgroups限制进程资源

配置监控告警(Prometheus+Alertmanager)

代码层添加性能熔断机制

四、特殊场景注意

容器环境(Docker/K8s):

# 查看容器CPU限制

docker inspect <容器ID> | grep -i cpushares

# 实时监控容器CPU

docker stats --format "table {

{.Container}}\t{

{.CPUPerc}}"

可能显示超过100%但实际受限于cgroup配额

虚拟化环境:

需区分宿主CPU和客户机CPU分配

可能因CPU超售导致高利用率假象

当遇到持续高CPU使用时,建议优先保存性能分析数据:

# 记录60秒的CPU使用采样

perf record -F 99 -a -g -- sleep 60

# 生成火焰图

perf script | FlameGraph/stackcollapse-perf.pl | FlameGraph/flamegraph.pl > cpu.svg

这将生成可视化分析报告,帮助精准定位热点代码。

五、代码监控脚本

当监控GPU显卡时:

import psutil

import pynvml

import time

import csv

import os

def get_process_info(pid=None, process_name=None):

"""

获取指定进程的CPU使用率和显存占用情况。

:param pid: 进程ID

:param process_name: 进程名称

:return: 进程对象,CPU使用率,显存占用(MB)

"""

process = None

if pid:

try:

process = psutil.Process(pid)

except psutil.NoSuchProcess:

print(f"未找到PID为{

pid}的进程。")

return None, None, None

elif process_name:

for proc in psutil.process_iter(['pid', 'name'])