開發人員Malte Skarupke在部落格上抱怨,將遊戲移植到遊戲串流服務Google Stadia時,所遭遇到的效能問題,是因為Linux核心排程器(Kernel Scheduler)也就是Linux自旋鎖的問題,使遊戲畫面產生數毫秒的延遲,而這個話題受到熱烈討論,引來Linux之父Linus Torvalds研究後親自回覆,並表示Malte Skarupke提出的問題“That's pure garbage.”

Malte Skarupke提到,他偶然聽到有開發者,將遊戲狂怒煉獄2(Rage 2)移植到Google Stadia的時候,遇到奇怪的延遲問題,而這些延遲問題的共通點皆使用自旋鎖(Spinlock)。由於Malte Skarupke自己也在撰寫自旋鎖相關的程式,他解釋,這個問題發生的原因在於,一個執行緒在沒有其他執行緒持有該自旋鎖時,需要花費數毫秒的時間獲取該自旋鎖,他提到,遊戲中每16毫秒或33毫秒就需要在螢幕上顯示一個畫面,即便只延遲一毫秒也是嚴重的事,特別是暫停所有的執行緒。

Malte Skarupke花費了數個月的時間研究這個問題,並表示大部分的互斥鎖(Mutex)的實作都很好,但是大多數的自旋鎖實作都很糟糕,而Linux核心排程器還可以但並非最理想的作法。最後Malte Skarupke的解決方案,則是將自旋鎖寫法切換為互斥鎖。

Linus Torvalds親自研究了Malte Skarupke的説法,並且指出Malte Skarupke整個文章都是錯的。Linus Torvalds表示,自旋鎖只能在確實知道使用期間,不會被排程的時候才能使用,並且指出Malte Skarupke的測量時間的方法是錯的,因為Malte Skarupke讀取釋放鎖之前的時間,然後讀取獲取鎖之後的時間,並且比較與沒有持有鎖的時間差。Linus Torvalds使用了強烈的用詞,認為這既愚蠢又毫無意義,整個都是錯,完全就是垃圾。

Linus Torvalds建議開發人員,使用鎖的時候,告訴系統正在等候鎖,並在解鎖執行緒時讓你知道,Linus Torvalds強調,除非開發者清楚自己在進行的工作,否則不要在使用者空間中使用自旋鎖,而他認為,開發者知道自己在做什麼的可能性基本上是零。

也就是說,Malte Skarupke的發現,其實是因為本來就以不對的方式使用自旋鎖,Linus Torvalds認為一開始就不應該使用自旋鎖,Linux核心排程器沒有問題,有問題是開發人員的使用方式。


Advertisement

更多 iThome相關內容