拓冰建站拓冰建站
首页 / 资讯中心 / 正文

CPU 负载与 I/O 负载详解:原理、压力来源、监控与调优

CPU 负载与 I/O 负载详解原理、压力来源、监控与调优在性能工程中我们常说CPU 密集型用 CPU 负载衡量系统压力I/O 密集型用 I/O 负载衡量系统压力。本文系统梳理这两类负载到底指什么操作、为什么会给系统带来压力、压力过大时如何解决以及如何获取这些指标。一、基本概念负载Load到底是什么在 Linux 中负载最直观的体现是load average平均负载它表示的是在单位时间内系统中处于可运行状态R和不可中断睡眠状态D的平均进程数。RRunning/Runnable正在 CPU 上运行或在运行队列里等待 CPU 调度的进程。→对应 CPU 负载DUninterruptible Sleep正在等待磁盘 I/O 或某些内核锁不可被信号中断的进程。→对应 I/O 负载所以load average同时包含了 CPU 压力和 I/O 压力两类。这就是为什么单看负载高无法判断瓶颈到底在 CPU 还是在磁盘——需要结合更多指标。$ uptime 10:30:00 up 30 days, 2 users, load average: 2.50, 1.80, 1.20 ↑1分钟 ↑5分钟 ↑15分钟经验法则负载值长期 CPU 逻辑核数 × 1说明系统存在压力 核数 × 2~4 通常意味着明显过载。二、CPU 负载2.1 CPU 负载主要指什么操作CPU 负载高意味着大量时间花在CPU 计算本身而非等待外部资源。典型操作类别典型操作数值计算科学计算、矩阵运算、加密/解密AES、RSA、哈希计算SHA、bcrypt数据处理大规模排序、聚合、正则匹配海量文本、JSON/XML 解析与序列化编译与压缩代码编译gcc/javac、视频转码H.264/H.265、压缩解压gzip/zstd机器学习模型训练、推理前向/反向传播、特征工程业务逻辑复杂业务规则计算、图算法、递归回溯、虚拟机/JIT 执行内存密集计算大对象 GC垃圾回收会占 CPU、内存拷贝、序列化特征进程大部分时间处于 R 状态频繁占用 CPU 时间片几乎不阻塞在磁盘或网络上。2.2 为什么会给系统带来压力CPU 时间片是有限资源核数决定了同一时刻能并行执行的指令流数量。8 核 CPU 最多真正并行 8 个线程。调度开销可运行进程过多时调度器频繁切换上下文context switch缓存L1/L2/TLB命中率下降造成切换越多越慢的恶性循环。响应延迟恶化CPU 排队长交互式请求/实时任务的延迟RT上升。热与功耗持续高 CPU 占用会拉高频率与功耗可能触发降频thermal throttling反而变慢。级联效应CPU 打满后GC、心跳、监控线程也拿不到时间片导致雪崩。2.3 CPU 压力过大时如何解决先定位再优化横向扩容Scale Out增加节点把计算任务分摊到多台机器MapReduce、分片。纵向扩容Scale Up提升单机 CPU 核数/主频或绑核taskset/cgroups隔离关键进程。算法与数据结构优化降低时间复杂度O(n²)→O(n log n)、空间换时间缓存/预计算、减少重复计算记忆化。异步与并发模型CPU 密集任务用固定大小线程池线程数 ≈ 核数 1避免线程过多引发切换用协程/Reactive 模型减少阻塞。卸载到专用硬件GPU 加速CUDA、加密卡、向量化指令SIMD/AVX。限流与削峰对突发流量用令牌桶/漏桶限流任务排队保护核心链路。热点排查用perf top/ 火焰图FlameGraph找出热点函数针对性优化。JIT/GC 调优JVM 类应用调整 GC 策略与堆参数减少停顿。2.4 如何获取 CPU 指标工具用途关键指标uptime/cat /proc/loadavg查看平均负载1/5/15 分钟 load averagetop/htop进程级 CPU 占用%CPU、运行队列长度、us/sy/si/wavmstat 1系统级 CPU 与上下文切换r运行队列、us、sy、cs上下文切换mpstat -P ALL 1每个 CPU 核的使用率%usr/%sys/%iowait/%idlepidstat 1进程级 CPU各进程%CPUperf top/perf record函数级热点剖析CPU 周期占用排行sar -u 1历史与实时 CPU长期趋势ps -eLo psr,pid,comm查看线程跑在哪核绑核分析关键解读us高 → 用户态计算密集优化业务代码。sy高 → 内核态开销大可能是系统调用/上下文切换/锁竞争过多。sisoftirq高 → 网络中断/软中断频繁。waiowait高 → 实际是磁盘瓶颈伪装成 CPU 等待应转向 I/O 分析。三、I/O 负载3.1 I/O 负载主要指什么操作I/O 负载高意味着大量进程阻塞在等待外部数据传输上D 状态。I/O 分为几类I/O 类型典型操作磁盘 I/O数据库读写MySQL/PostgreSQL、日志写入、文件上传下载、大文件读取、Checkpoint 刷盘网络 I/OHTTP/RPC 调用、数据库连接等待、Kafka 收发、跨机房同步、CDN 回源终端/设备 I/O串口、键盘输入现代场景少IPC I/O管道、共享内存、Unix Socket 传输大数据特征进程大量时间处于 D 状态CPU 反而可能很闲%idle高但load average高典型CPU 没满但系统卡。3.2 为什么会给系统带来压力速度鸿沟巨大CPU 主频 GHz 级纳秒内存百纳秒SSD 微秒级机械盘毫秒级网络往返毫秒~秒级。慢设备拖累整体。阻塞占用资源每个等待 I/O 的进程/线程仍占用内存、文件描述符、连接池、内存等线程数膨胀。磁盘机械瓶颈机械盘 IOPS 通常只有 100~200即使是 SSD写入也有寿命与带宽上限随机写尤其昂贵。上下文切换大量阻塞线程被唤醒后又阻塞引发频繁调度。缓存击穿随机 I/O 破坏预读与页缓存命中率放大实际磁盘压力。锁与连接池竞争连接池打满、行锁等待、缓冲池刷脏抖动如 MySQL doublewrite/checkpoint 风暴。网络带宽与延迟带宽打满引发重传与排队RTT 上升放大请求时延。3.3 I/O 压力过大时如何解决磁盘 I/O 方向加缓存内存缓存Redis/Memcached、页缓存预读、应用层本地缓存减少落盘访问。批量与合并批量读写、合并小 I/Owrite coalescing、顺序写替代随机写LSM-Tree、Kafka 顺序追加。异步与缓冲异步 I/Oaio/epoll、写缓冲、Write-Behind让进程不等 I/O 完成。存储升级机械盘 → SATA SSD → NVMe SSDRAID/PV 提升并发带宽。数据布局优化索引优化减少回表、分区/分片降低单盘数据量、列存压缩、冷热分层。压缩与去重减少实际传输与落盘字节数。I/O 调度器与队列调整cfq/mq-deadline/none、nr_requests、磁盘队列深度。零拷贝sendfile/mmap减少内核-用户态数据拷贝。网络 I/O 方向连接复用连接池、HTTP Keep-Alive、多路复用HTTP/2、gRPC 多路复用。异步非阻塞NIO/epoll/Reactor 模型少量线程撑起大量连接。减少跨网络调用批量化接口、本地聚合、缓存结果、动静分离。压缩与协议优化protobuf/thrift 替代 JSON、gzip/brotli 压缩、减少 payload。就近访问CDN、边缘缓存、同可用区部署、读写分离就近读。超时与熔断设置合理超时、熔断器Hystrix/Sentinel避免级联阻塞。3.4 如何获取 I/O 指标工具用途关键指标iostat -dx 1每块磁盘的 I/O 统计r/s、w/s、rkB/s、await、%util、svctmvmstat 1系统级 I/O 与运行状态bo/bi块读写、waiowait、bD 状态进程数iotop进程级 I/O 占用各进程读写带宽pidstat -d 1进程级磁盘 I/O进程kB_rd/s、kB_wr/sdstat综合磁盘、网络、CPU 一屏sar -d 1/sar -n DEV 1历史磁盘与网络长期趋势nstat/ss -s/netstat -s网络协议栈重传、丢包、连接数ethtool/iftop/nethogs网卡与进程级流量带宽占用、收发速率blktrace/ftrace块层追踪I/O 落盘路径与延迟分布关键解读await高 → 请求在队列里等太久磁盘可能过载或随机 I/O 过多。%util接近 100% → 磁盘带宽/时间被打满注意SSD 上 %util100% 不一定到瓶颈因多队列并发。waiowait高 b高 CPU%idle高 → 典型 I/O 瓶颈。网络retrans/drop增长 → 网络质量问题。四、CPU 负载 vs I/O 负载对比维度CPU 负载I/O 负载进程状态主要 R运行/就绪主要 D不可中断睡眠瓶颈位置CPU 算力磁盘/网络/设备典型top表现us/sy高%idle低%idle高wa高load 高优化方向扩容、算法、异步卸载缓存、批量、异步、升级存储时间尺度纳秒~毫秒微秒~秒常见误判把 GC 停顿当 I/O把 iowait 高当 CPU 不够快速判断口诀CPU%us高 load 高 →CPU 密集去优化计算。CPU%idle高 wa高 load 高 →I/O 密集去优化存储/网络。%sy高 → 系统调用/上下文切换/锁竞争去减少线程数与锁。load 高但 CPU/IO 都不突出 → 可能 D 状态进程多内核锁、NFS 挂载卡死排查内核态。五、监控指标获取总览命令速查# 综合负载 uptime# load averagecat/proc/loadavg# 负载 运行/总进程数# CPU top-bn1|head-5# CPU 总览mpstat-PALL12# 每核使用率vmstat15# r/b/cs/us/sy/wapidstat-u1# 进程 CPUperftop# 函数热点# 磁盘 I/O iostat-dx15# 每盘 IOPS/带宽/await/utiliotop-o# 进程 I/Opidstat-d1# 进程读写sar-d1# 历史磁盘# 网络 I/O sar-nDEV1# 网卡流量ss-s/netstat-s# 连接与协议栈nethogs# 进程级流量# 综合可视化 dstat-tcdmn# 一屏看 CPU/磁盘/网络/内存推荐持续监控栈Prometheus node_exporter Grafana长期存储与可视化 CPU/I/O 指标。node_exporter暴露node_load1/5/15、node_cpu_*、node_disk_*、node_network_*。业务侧APMSkyWalking/Pinpoint追踪慢调用区分 CPU 瓶颈与外部 I/O 瓶颈。六、小结CPU 负载本质是算力排队压力来自计算需求超过 CPU 并行处理能力解法是扩容 算法优化 异步卸载。I/O 负载本质是等慢设备压力来自慢速磁盘/网络与有限带宽解法是缓存 批量 异步 升级存储 协议优化。load average同时含 R 与 D 两类必须结合%us/%sy/%wa/%idle与iostat才能定位真正的瓶颈。排障顺序uptime→top/vmstat区分 CPU 还是 I/O→mpstat/iostat定位到核/盘→pidstat/perf/iotop定位到进程/函数→ 针对性优化。一句话先分清在算还是在等再决定是优化 CPU 还是优化 I/O这是所有性能调优的起点。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门