嗨各位,不知道各位有沒有過被老闆說 你去測看看 XXX 的那個新功能(feature)
呢?
當初我雖然沒被老闆叫去測新功能,但就想裝看看剛出的 Kubernetes 1.28
(我真的只有裝看看而已)
但每次裝個叢集都要噴掉個幾分鐘,於是我就在想 有沒有能讓我裝叢集更快的方式呢?
翻譯蒟蒻: 資源就那些,能不能在不花錢的情況下但安裝時間更少
於是乎,我找到了一些能讓我榨出更多效能的小招
對了,在進入主題前我想先打一下廣告
KAIS 是我最近開源的專案,主要的功能是用來安裝 Kubernetes 叢集
之後預計會更新如自動安裝工具或環境除錯等功能
歡迎各位先進提供意見、一同參與或單純使用也可以
好,回到正題
要榨出更多的性能前,我們得先問 瓶頸在哪裡?
以我做實驗的 Server 來說
所以或許我們能從 I/O
來改善
而 Linux Kernel 中,預設會拿一部份的記憶體來當作硬碟寫入的快取(cache)
也就是說,當硬碟寫入的行為發生時,資料會先被寫入至記憶體,再從記憶體寫入至硬碟
這能在一定程度上緩解硬碟 I/O 的瓶頸,但也有可能造成潛在的資料損失(突然斷電、記憶體錯誤等)
而如果想調整這方面的設定,我們可以修改 /etc/sysctl.conf
這次實驗中,我分別修改了 vm.dirty_background_ratio
和 vm.dirty_ratio
vm.dirty_background_ratio
為 Linux 中用來保存做為快取的百分比(不同發行版可能預設有不同的比例),超過此值時會觸發從記憶體寫入硬碟的動作vm.dirty_ratio
為限制快取儲存的百分比閥值,當快取超過此值時,系統會阻止(Block)任何寫入行為,直到記憶體中的快取被寫入到硬碟
以我的需求來說,我希望 I/O 越快越好 (はやく!もっとはやく!)
而完全不在意可能會有資料損失的問題(畢竟只是用來快速裝測試環境嘛)
所以我們可以把這兩個值提高,並且把分配給 VM 的 RAM 拉高
如此一來我們只要確保在裝叢集時,寫入到硬碟的資料量不大於 vm.dirty_background_ratio(百分比)
* 分配給 VM 的記憶體
我們就能確保所有的資料寫入都會保存在記憶體
中,因而獲取更好的 I/O 效能
所以我分配給 VM 20GB 的記憶體
並且將 /etc/sysctl.conf
的 vm.dirty_background_ratio
和 vm.dirty_ratio
分別設置為
vm.dirty_background_ratio=60
vm.dirty_ratio=80
然後我們套用更改後的設定
sudo sysctl -p
然後實驗環境的部分,我們使用 KAIS 安裝 1.23.6
版的 Kubernetes
curl https://raw.githubusercontent.com/vincent5753/KAIS/main/legacy/Ubuntu20-K8s_1_23-containerd-flannel.sh | bash
在更改 vm.dirty_background_ratio
和 vm.dirty_ratio
前
叢集的總安裝時間 (從 下載各種套件 到 節點Ready) 共 03 分 54 秒
而節點從 Not Ready
到 Ready
共花費 60 秒
在更改了 vm.dirty_background_ratio
和 vm.dirty_ratio
後
叢集的總安裝時間 (從 下載各種套件 到 節點Ready) 共 02 分 34 秒
而節點從 Not Ready
到 Ready
共花費 12 秒
可以看出調整 Linux Kernel 的快取策略可以幫我們省下一點時間
(但還是請根據自己的情境判斷和拿捏風險)
參考文章: 高寫入系統 Linux 效能調教
各位我們明天見