分頁置換與輾轉現象

輾轉現象(thrashing)

想像你想在一張小到只放得下一本書的書桌上讀書,而你實際上需要在五本之間翻來翻去。每次你伸手拿另一本,都得把手上的放回書架再取一本——而你才一這麼做,就又需要剛放回去的那本。你把所有時間都花在來回書架,幾乎沒時間真正閱讀。一台正處於這種狀態的電腦就是在輾轉:它幾乎把全部力氣都用在記憶體與磁碟之間搬頁,幾乎做不出真正的工作。

具體來說,當行程的頁框太少、容不下它們的工作集——也就是它們此刻正積極需要的頁——時,輾轉就發生了。記憶體太少時,每個行程都不斷出錯:它逐出一個片刻後就要用的頁,才換進一個現在需要的頁,於是立刻又出錯。這引發一個惡性螺旋。CPU 閒坐著等緩慢的磁碟 I/O,所以使用率下降;一個盯著低 CPU 使用率的排程器斷定它應該再放進更多行程來讓 CPU 忙起來;新行程也需要頁框,於是現在每個行程的頁框更少、錯得更兇,CPU 使用率進一步崩潰。越過某個臨界點之後,增加負載會讓產出率暴跌而非上升。

為什麼重要,以及一個常見的誤解:輾轉不是「磁碟很慢」也不是「程式有錯」——它是當記憶體相對於活躍需求被超量承諾時所浮現的整體行為。解方是控制多元程式規劃的程度,讓每個行程為其工作集保有足夠的頁框:工作集模型追蹤每個行程實際需要多少頁框,若總和超過可用記憶體就暫停某些行程;頁錯誤頻率(PFF)方法盯著每個行程的錯誤率,若它錯太頻繁就多給頁框,若它很少出錯就收回頁框。要注意,正是區域性讓這件事得以被修正——程式會把它們的參考聚在一起,所以一份適度而精選的頁框配額通常就足夠了。

五個行程共用的記憶體剛好夠它們合計的工作集。作業系統放進了第六個;現在每個行程都少了幾個頁框。錯誤暴增,CPU 閒坐等磁碟,使用率掉到近乎零——而看到 CPU 閒置的進入排程器,反而想再放進更多,使崩潰更深。

每個行程的頁框太少、CPU 閒置等磁碟、產出率自由落體。

輾轉不是磁碟慢也不是程式錯誤;它是系統因為活躍行程合計的頁框太少,而把幾乎所有時間都花在分頁上。解方是限制多元程式規劃的程度(工作集或 PFF 控制),而不是光靠更快的硬體。

又称
顛簸顛簸現象瘋狂置換