内存颠簸指系统物理内存严重不足时,页面被频繁换出又立刻换入,CPU 大部分时间耗在页面调度而非实际计算上,系统吞吐量骤降、响应极慢的现象。工作集模型是分析和预防颠簸的经典理论,现代系统还配合 OOM Killer、内存压力指标等手段应对。

| 所属领域 | 内存管理 |
| 理论模型 | 工作集模型(1968) |
| 提出者 | 彼得·丹宁(Peter Denning) |
| 典型症状 | 换入换出频繁、CPU 空转 |
| 现代对策 | PSI 指标、OOM Killer、zram |
内存颠簸(Thrashing),又译抖动,是虚拟内存系统中的一种病态:当进程所需的内存页远超可用物理内存时,系统被迫频繁地把刚换出的页面又换回来,磁盘 IO 满载而 CPU 大量空转等待,几乎无法推进任何实际工作。用户的直观感受是硬盘灯狂闪、系统卡死般缓慢。
分页式虚拟内存允许程序使用超过物理内存的地址空间,不常用的页面被换出到交换空间。正常情况下缺页只是偶发事件;可一旦所有活跃进程的常用页面总量超过物理内存,每次调度到某个进程,它都要先通过一连串缺页把自己的页面换回来,同时把别的进程的页面挤出去,如此循环往复。1968 年,计算机科学家彼得·丹宁(Peter Denning)提出工作集模型来刻画这一现象:每个进程在一段时间窗口内实际访问的页面集合称为工作集,只有当内存能同时容纳所有活跃进程的工作集时,系统才能高效运行。
Linux 通过 kswapd 后台回收、页面回收 LRU 链表和交换倾向参数 swappiness 来延缓颠簸;当回收彻底无望时由 OOM Killer 直接杀死进程止损。较新的内核提供 PSI(压力滞留信息)指标,量化任务因等待内存而停顿的时间,Android 和 systemd-oomd、Facebook 的 oomd 等用户态守护进程都基于 PSI 在颠簸恶化前主动干预。桌面用户遇到颠簸的实用建议是加大物理内存、启用 zram 压缩交换或减少同时运行的大型程序。
问:怎么判断系统正在颠簸?答:典型特征是 CPU 使用率不高但系统极慢,vmstat 显示 si、so(换入换出)持续高企,iowait 占比大,PSI 的 memory 压力指标持续飙升。
问:把交换空间设得越大越能避免颠簸吗?答:不能。交换空间只是延后了内存耗尽,物理内存装不下工作集时,交换越多颠簸越严重。根治办法是加内存或减少并发工作负载。
问:关闭交换分区能不能杜绝颠簸?答:不完全能。即使没有交换,内核仍会反复丢弃并重读代码页和文件缓存页,产生类似颠簸的抖动,且更容易直接触发 OOM Killer。

| 所属领域 | 内存管理 |
| 理论模型 | 工作集模型(1968) |
| 提出者 | 彼得·丹宁(Peter Denning) |
| 典型症状 | 换入换出频繁、CPU 空转 |
| 现代对策 | PSI 指标、OOM Killer、zram |
登录 后参与讨论
暂无讨论,来发表第一条评论吧