为什么电脑会卡:从内存管理看卡顿

先把结论放前面:电脑“卡”的时候,很多时候不是 CPU 算不动,而是内存系统在忙着腾挪、回收、写回和换页。界面迟钝、切窗口慢、打开文件像在等半天,表面看是卡,底层往往是“等内存”。

先别把“内存满了”理解得太粗

很多人看任务管理器,第一反应是“内存 90% 了,所以卡”。这句话只说对了一半。

内存管理不是简单的“空”和“满”。操作系统会把内存分成几类东西:正在被程序直接用的数据、文件缓存、可以回收的缓存、还有真正空闲的页。它们都占着 RAM,但角色不一样。

物理内存
├── 正在跑程序的数据
├── 文件缓存
├── 可回收的旧缓存
└── 真正空闲的页

所以有时候你看到“内存用了很多”,系统其实并不危险,因为其中一部分是缓存,丢了也能再从磁盘读回来。Linux 里的 free 命令也专门给了 available 这一列,它比单看 free 更接近“现在还能舒服地拿来用多少”。

真正麻烦的是:系统已经没有多少“轻松可用”的页了,开始频繁做回收。

卡顿通常从这里开始

可以把过程理解成一条很现实的流水线:

程序要新内存
  -> 发现空闲页不够
  -> 内核开始回收缓存 / 挪走旧页
  -> 需要的话把脏页写回磁盘
  -> 还不够就把一部分匿名页换出去
  -> 程序只能等
  -> 你看到的是鼠标拖影、窗口停顿、输入延迟

这一步最要命的不是“总共用了多少内存”,而是“系统为了腾出内存,付出了多少等待时间”。

如果只是回收一些干净缓存,代价还不算大。可一旦涉及脏页写回、匿名页换出、再把刚换出的页读回来,事情就开始变慢了。内存本来应该是极快的,结果现在每次申请都可能牵动磁盘,而磁盘比 RAM 慢几个数量级。

这时你感受到的“卡”,其实是等待链条被拉长了。

为什么一旦开始换页,系统会越来越不对劲

换页本身不是坏事。操作系统设计它,就是为了在内存不够时还能活下去。但它有个很现实的问题:如果工作集比 RAM 大太多,系统就会在“哪些页该留、哪些页该走”这件事上反复折腾。

这类反复来回的搬家,通常比一次性吃紧更难受。Linux 的 PSI 文档把这类资源紧张带来的延迟、吞吐下降和 stall 单独拿出来看,原因就是它会真实影响交互体验。严重时,系统甚至会进入一种近似“忙着等”的状态。

简单说就是:

  • 程序想要的页不在内存里
  • 内核把它们换出去
  • 程序又很快把它们要回来
  • 磁盘和内存都在来回跑
  • CPU 却没有真正干活

这就是很多人说的“明明 CPU 还没满,机器却已经卡了”。

还有一种卡,叫“内存碎片”

这件事平时不太被普通用户注意,但它确实会让机器发脾气。

有些任务不只是要“有内存”,而是要“有一大块连续内存”或者某种特定属性的页。普通小块页还好说,一旦系统碎片化严重,内核就可能要做额外的整理,也就是把分散的页挪一挪、拼一拼。这个过程叫 compaction

听起来只是“整理一下房间”,但在机器上,整理房间也是要成本的。它可能让分配请求在后台等更久,甚至让原本不卡的界面突然抖一下。

这也是为什么某些机器平时看着没问题,一开大文件、虚拟机、图形软件或者大型浏览器标签页,就突然有几秒钟明显顿挫。不是某一条指令坏了,而是内存布局已经开始不顺手。

你可能见过的几种“内存型卡顿”

| 表现 | 更像什么 | | --- | --- | | 切窗口慢、动画掉帧 | 进程在等内存回收或换页 | | 磁盘灯长亮、风扇转起来 | 脏页回写、swap 读写在跑 | | 打开程序第一次慢,第二次快 | 第一次要读磁盘,第二次吃到缓存 | | 用着用着整机发钝 | 进入了持续内存压力,系统在反复搬家 |

这里最容易误判的是最后一条。很多人以为“整机发钝”一定是 CPU 不够,其实更常见的是内存系统在做大量隐形工作。对用户来说,你看不见它在回收、写回和换页,只看见所有动作都慢了半拍。

那该怎么判断是不是内存惹的祸

不用一上来就看很硬核的指标,先看体感和几个简单信号就够了。

如果你同时遇到这些情况,八成就和内存有关:

  • 程序打开第一下很慢,第二下明显快
  • 多开几个应用后,整机开始拖沓
  • 切换窗口、滚动页面、输入法响应都变慢
  • 磁盘活动明显增加
  • 关掉几个大程序后,系统马上恢复顺滑

在 Linux 上,free -hvmstat 1top,再加上 /proc/pressure/memory,基本就能看出个大概。/proc/pressure/memory 这个接口很有意思,它不是只告诉你“用了多少”,而是告诉你系统在内存压力下到底卡了多久。这个视角比单纯看占用率更接近“为什么会卡”。

其实你可以把它想成“搬家费”

如果非要用一个更生活化的说法,我会把内存管理理解成搬家费。

平时的内存像一个正在正常运转的仓库,货物摆得整整齐齐,拿取都很快。可一旦仓库太挤,系统就要开始清货、归档、打包、转运。这个阶段不是“没货可用”,而是“能用,但要付额外成本”。

电脑卡顿,大多就是这个额外成本开始明显到肉眼可见的时候。

Linux 源码里真正处理这些事的主干,主要就在 linux-master/mm/vmscan.c 这一类文件里;而 linux-master/Documentation/accounting/psi.rst 则把“资源压力会带来延迟和吞吐下降”说得很直白。源码和文档讲的是系统行为,普通用户看到的则是卡顿、迟钝和偶发假死。

最后

所以,电脑为什么会卡?

因为内存不是一个静态仓库,而是一个一直在做分配、回收、缓存、换页、整理的动态系统。只要它还能顺畅地把这些事做完,机器就很跟手;一旦它开始频繁搬家,磁盘和回收工作抢走太多时间,卡顿就来了。

如果你以后再遇到“电脑卡”,先别急着只盯 CPU。很多时候,真正拖慢你的,是内存管理那一整套看不见的后台动作。

需要的话,我可以继续把这篇扩展成一个更偏 Linux 视角的版本,直接讲 kswapd、direct reclaim、swap、page cache 和 PSI 是怎么连起来的。

吉ICP备2024014750号-1 备案图标 京公网安备11011202100605号