Linus Torvalds 再改頁面鎖邏輯,把 if 替換為 while
幾個(gè)月前,Linus Torvalds 在 Linux 5.9 版本中重寫了 wait_on_page_bit_common() 相關(guān)邏輯,原因是為了解決頁面鎖競(jìng)爭(zhēng)的公平性問題。
在這之前,頁面鎖持有者在執(zhí)行 ”unlock_page()" 時(shí)僅會(huì)喚醒等待隊(duì)列里的一個(gè)獨(dú)占進(jìn)程(FIFO,且該進(jìn)程正在執(zhí)行 “lock_page” ),但是該進(jìn)程不一定正在運(yùn)行,特別是在負(fù)載情況下,只有其獲得 CPU 時(shí)間才能真正運(yùn)行,與此同時(shí),其它正在運(yùn)行的沒有進(jìn)入等待隊(duì)列的進(jìn)程可以直接獲得頁面鎖,這個(gè)過程雖然依然有效利用了頁面,但會(huì)導(dǎo)致非常不公平的情況,被喚醒的等待進(jìn)程運(yùn)行后發(fā)現(xiàn)頁面鎖沒有釋放,于是重新進(jìn)入等待隊(duì)列,而且是最后一個(gè),極端情況下,這個(gè)進(jìn)程可能會(huì)重復(fù)該過程以至于等待數(shù)十秒。
因此 Linus Torvalds 修改為在喚醒等待進(jìn)程時(shí)同時(shí)會(huì)把鎖交給它,無論它是否正在運(yùn)行。
然而,這并沒有完全解決問題。自這之后,偶爾會(huì)發(fā)生 BUG_ON() ,因?yàn)樯鲜?“wait-to-set” 的過程并非原子性的,所以被喚醒的進(jìn)程仍有可能被“第三者插足”。如果要把 “wait-to-set” 這一過程修改為原子性操作,需要修改大約 50 個(gè)函數(shù),因此,在上周,Linus Torvalds 把 wait_on_page_writeback () 函數(shù)中的 if 修改為 while 來解決這一問題。而這基本上又回到了最開始的情況,不過發(fā)生頻率要低得多,因此仍然可控。
不過,據(jù)外國(guó)媒體報(bào)道,其在該版上的基準(zhǔn)測(cè)試中, PostgreSQL 性能下降了 5%-10%,對(duì)此,Linus Torvalds 認(rèn)為這種下降并非由該補(bǔ)丁引起,可能和其測(cè)試模型或機(jī)器性能有關(guān)。
Linux 5.11-rc3 現(xiàn)已發(fā)布,感興趣的同學(xué)可以進(jìn)行相關(guān)測(cè)試
更多詳細(xì)內(nèi)容查看以下 commit:
- mm: make wait_on_page_writeback() wait for multiple pending writebacks
- mm: rewrite wait_on_page_bit_common() logic
本文轉(zhuǎn)自O(shè)SCHINA
本文標(biāo)題:Linus Torvalds 再改頁面鎖邏輯,把 if 替換為 while
本文地址:https://www.oschina.net/news/126262/linus-torvalds-change-if-2-while