工作集与抖动是什么,为什么系统会越来越卡
工作集和抖动,是把缺页中断、页面置换和 swap 真正落到系统性能上的关键概念。
这部分主要回答两个问题:
为什么程序不是随机访问全部页,而往往只集中访问一小部分? 为什么内存不够时,系统不是稍微慢一点,而是会突然变得非常卡?
一、什么是工作集
工作集可以理解成:
一个进程在某一段时间内,频繁访问、真正活跃使用的那部分页面集合。
虽然一个进程理论上可能拥有很多页,但在某个短时间窗口里,程序通常只会反复访问其中一小部分。这一小部分页,就是它当前的工作集。
所以工作集不是:
- 进程拥有的全部页
而是:
- 当前真正离不开、频繁访问的那批页
二、为什么会有工作集
因为程序通常具有局部性原理。
1. 时间局部性
刚访问过的页,短时间内还可能再次访问。
2. 空间局部性
访问某个地址后,附近地址也很可能很快被访问。
正因为程序通常围绕少量热点页活动,所以工作集的概念才成立。
三、为什么工作集重要
如果一个进程当前工作集中的页都能驻留在物理内存里,那它通常运行得比较顺畅,缺页率也会比较低。
但如果:
连工作集都装不下
程序就会频繁缺页,随后进入频繁调页和页面置换,性能会迅速恶化。
四、什么是抖动(Thrashing)
抖动可以理解成:
系统的大部分时间都在忙着换页,而不是忙着执行真正的程序逻辑。
也就是说,程序不是在做业务,而是在不断:
- 缺页
- 换页
- 再缺页
- 再换页
一旦进入这种状态,系统就会表现得非常卡。
五、抖动是怎么发生的
最典型的原因是:
物理内存无法容纳活跃进程当前所需的工作集。
常见原因包括:
- 可用物理内存太小
- 活跃进程并发太高
- 每个进程的工作集都比较大
这时系统就会被迫反复在这些关键页之间来回换:
- 刚换进来的页马上又被换出去
- 刚换出去的页又很快需要重新换回来
这就是抖动。
六、为什么抖动会让系统“突然”变得很卡
因为这不是普通的“缺页稍微增多”,而是进入了一种恶性循环:
- 缺页率越来越高
- 页面置换越来越频繁
- 大量时间花在磁盘 IO 和内核处理上
- 真正执行业务逻辑的时间越来越少
所以系统表现出来就不是“稍微慢一点”,而是:
磁盘和 swap 很忙,但程序推进很慢。
七、为什么抖动时系统很忙,程序却推进很慢
因为系统忙的并不是“有效计算”,而是在不断处理:
- 缺页中断
- 页面置换
- 磁盘读写
- 页表更新
- swap 调度
也就是说 CPU 和磁盘都可能很忙,但忙的是内存管理开销,而不是应用真正的业务逻辑。
八、怎么缓解抖动
1. 减少并发进程数
如果活跃进程太多,每个都要占工作集,总内存很容易撑不住。减少并发后,每个进程更容易保住自己的工作集。
2. 增加物理内存
这是最直接的方法。如果工作集总和终于能放得下,缺页率通常就会明显下降。
3. 优化程序局部性
让程序尽量围绕一批热点数据和代码运行,而不是频繁跨很大范围跳转,这样工作集会更稳定。
4. 优化页面置换策略
尽量避免把热点页换出去,能在一定程度上缓解频繁换页。
九、总结
工作集是指一个进程在某一段时间内频繁访问、真正活跃使用的那部分页面集合。由于程序具有局部性,一个进程虽然可能拥有很多页,但短时间内通常只围绕其中一小部分页活动。抖动则是指系统由于物理内存不足,无法容纳活跃进程的工作集,导致频繁发生缺页和页面置换,大量时间都花在换页和磁盘 IO 上,而不是真正执行程序逻辑。它的典型表现是系统很忙,但程序推进非常慢。
