內容其實是 2014 年底 Netflix 工程師的演講,只是最近被 Ubuntu 官方網站再次宣傳又紅了起來。

醒語錄:『無視場景只講優化,是耍流氓』

雖然簡報中沒有提到任何場景,但我們都知道 Netflix 主要是做影音串流平台,所以他提及的場景適用於「線上串流平台」。

我先前有提過,不同的場景有不同的作法,例如「電子商務」與「廣告平台」的需求非常不一樣。

接下來分享我對該簡報內容的幾個看法。

一、schedtool

Netflix 提到有些 Java 程式適合使用 schedtool 工具設定為 SCHED_BATCH 來優化 (簡報第 36 頁)。但沒指出什麼情況。

簡單說,當應用程式 (不限 Java) 屬於 CPU 運算密集型且執行時間很久 (數小時至數天) 時,使用 SCHED_BATCH 才會有意義,否則只會更慘。所以一般網站應用不需要。

另外,我不建議使用 schedtool,而是 chrt。因為 schedtool 在 Ubuntu 上需要額外安裝,而 chrt 已是內建工具且功效相同。

二、vm.swappiness

Netflix 建議將 vm.swappiness 設定為 0 (簡報第 37 頁),但我建議設定為 1,而且適用大多數場景。

詳細原因請見【Redis, another step on the road】此簡報的 96 ~ 100 頁。

簡單說,當系統達到臨界點時,你希望應用整個崩潰還是變慢?顯然 Netflix 偏好前者。

三、File system 效能優化

Netflix 建議的設定有點激進, “background flush earlier, aggressive flush later” (簡報第 39 頁)。

他採用的策略是,及早開始將資料從記憶體寫入硬碟,直到快滿時再大量強制寫入。這表示,若背景寫入資料的速度來不及處理實際寫入量,而達到某個臨界點時,會突然把大量的資料強制寫入。此時系統的效能幾乎會卡在這個時間點,而且大量資料的寫入時間也會很久。

例如系統為 16GB 記憶體,按照他的建議設為 80% 臨界,所以大量寫入的資料量會是 12.8 GB (16GB * 80%),效能影響顯著。

因此如果系統強調的是效能穩定,不能忍受劇烈振盪,則 Netflix 的設定就不適合你。例如系統不能忍受有時候需要數秒以上才有回應時。