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