真實系統、效能與前沿

作業系統效能調校

作業系統效能調校,是一門實務手藝:先量測系統為何比它原本能達到的更慢,然後改動某處讓它變快。把它想成一座城市的交通工程師:在加開一條車道之前,他們會在每個路口數車流,找出塞車究竟發生在哪。最高原則一樣——先量測,再改動。瞎猜慢在哪裡只是白費力氣,因為真正的瓶頸往往不在直覺所指之處。

方法的核心是找出瓶頸:那個已飽和、限制住其他一切的單一資源(CPU、記憶體、磁碟或網路),因為去加速瓶頸以外的任何東西都不會有改變。你用基準測試取得可重複的數字,再對執行中的系統做剖析,看時間實際花在哪。值得留意的常見作業系統成本貴得出人意料:一次系統呼叫要從使用者模式跨進核心模式再跨回來,代價遠高於普通的函式呼叫;一次環境切換要儲存與還原行程狀態,並汙染 CPU 快取;一次分頁錯誤或一趟磁碟的代價,比一次記憶體存取高出好幾個數量級;而鎖競爭可能讓許多核心在互相等待中空轉。於是調校就意味著減少這些——把系統呼叫批次化、削減不必要的複製、改善區域性讓快取命中、選用更好的排程器或輸入輸出政策,或乾脆給工作負載更多記憶體讓它停止輾轉。

兩點誠實的警語。第一,Amdahl 定律:若你優化的部分只佔總時間的一小部分,即使把它變成無限快也幾乎沒幫助——永遠先攻擊最大的成本。第二,當心不在真實工作負載上量測就動手優化;對基準有幫助的改動可能傷害實際應用程式,對一台機器有幫助的修正可能傷害另一台。效能工作是經驗性的:量測、改一件事、再量測。

一個程式每次只讀一個位元組,用了一百萬次各自獨立的 read 呼叫,感覺很慢。剖析顯示幾乎所有時間都花在跨進核心。解法不是更快的磁碟,而是更少的系統呼叫:改成一次讀 64 KB 的區塊,把一百萬次核心跨越變成幾百次——往往不需新硬體就能快上十倍。

先找到瓶頸;在這裡,更少的系統呼叫勝過更快的磁碟。

經典的陷阱是憑猜測優化。永遠先量測:最慢的部分常常不在你以為之處,而依 Amdahl 定律,加速真正瓶頸以外的任何東西幾乎毫無收穫。

又称
performance optimization效能優化效能調整