CPU、内存、I/O,谁才是制约高并发的“第一杀手”?

高并发是大型架构核心,下面我详解高并发核心瓶颈@mikechen

高并发系统

在高并发系统中,很多工程师都会问一个问题:系统性能瓶颈到底在哪里?

是 CPU 算力不够?还是内存容量不足?亦或是磁盘 I/O 撑不住?

CPU、内存、I/O,谁才是制约高并发的“第一杀手”?-mikechen

如果要搞定,你需要了解整个服务流程。

一个服务请求,进入系统返回结果,大致经历以下流程:

请求到达
   ↓
网络接收
   ↓
CPU处理业务逻辑
   ↓
访问内存数据
   ↓
访问磁盘或数据库(I/O)
   ↓
返回响应

因此,系统性能的核心依赖于三大资源:

CPU:计算能力,看 CPU:使用 top、vmstat、sar,看 CPU 总利用率;

内存:数据访问速度,使用 free、vmstat、/proc/meminfo,看 available、swap 使用情况;

I/O:数据读写能力,使用 iostat、sar -d,关注 IOPS、吞吐量、await、%util 是否长时间很高。

一旦其中任何一个资源达到上限,就会成为系统瓶颈。

 

为什么 I/O 更容易成为“第一杀手”

CPU 的时延是纳秒级,内存访问是十几到几十纳秒。

而网络、和磁盘 I/O 往往是毫秒级,中间有 6 个数量级的鸿沟,这使得 I/O 阻塞在高并发场景中天然更致命。

CPU、内存、I/O,谁才是制约高并发的“第一杀手”?-mikechen

高并发系统追求的是整体吞吐和响应时间,只要有部分请求在磁盘或网络等待。

线程就会堆积,连接数爆炸,最后表现出来就是“全站都慢了”。

一个典型情况:TPS 上到 10 万级以后,CPU 利用率看起来并不高。

但 load average 暴涨,iowait 居高不下,RT 长尾严重,这基本就是 I/O 已经吃不消的典型信号。

 

CPU:真瓶颈很少见,但“伪 CPU 瓶颈”很多

CPU 真正打满,一般出现在:复杂计算(加解密、大量压缩)。

CPU、内存、I/O,谁才是制约高并发的“第一杀手”?-mikechen

频繁上下文切换(线程太多)、锁竞争严重等场景。

很多“看起来 CPU 很高”的场景,其实是:缓存 miss、频繁内存拷贝、系统调用过多。

或者在忙轮询等待 I/O,根因仍然:在数据移动、和 I/O 上。​

 

内存:一旦不够,就会“间接”变成 I/O 杀手

高并发场景下,只要内存足够。

内存本身很少成为第一瓶颈,但内存不足会触发频繁的页换入换出(swap)。

CPU、内存、I/O,谁才是制约高并发的“第一杀手”?-mikechen

把所有热点都推向磁盘 I/O,系统瞬间雪崩。

数据库、缓存、消息队列这些组件一旦内存配置不合理。

会导致 buffer pool / page cache 命中率降低,更多请求直接打到磁盘,把 I/O 的压力放大数倍。

可以粗略理解为:内存的主要价值是在“挡在 I/O 前面”。

内存够用时,你在对抗 I/O,内存不够用时,你在被 I/O 收割。

评论交流
    说说你的看法