調整watermark_scale_factor參數以解決CPU Sys佔用率過高的問題
本文介紹了在Alibaba Cloud Linux 2/3系統中,記憶體壓力較大的業務情境下(啟動多個Executor進程進行壓力測試時),CPU Sys佔用率過高的原因及其解決方案。
問題現象
在記憶體壓力較大的業務情境下(例如巨量資料業務通過Spark Thrift Server啟動多個Executor進程進行壓力測試時),系統的CPU Sys佔用率較高。
問題原因
在Alibaba Cloud Linux 2/3系統中,核心提供了後台回收機制(kswapd)。由於系統預設的min水線和low水線之間的記憶體空間緩衝區較小,在進行業務壓測時,程式大量申請記憶體,導致記憶體從低水線迅速降至最小水線,這引起了直接記憶體的回收,從而使得CPU Sys佔用率變高。
Node 0, zone Normal
pages free 1005304
zeroed 0
min 10751
low 13438
high 16125
spanned 1277952
present 1277952
managed 1231810
cma 0
protection: (0, 0, 0, 0, 0)解決方案
通過調高watermark_scale_factor參數的值,可以增大系統中low水線與min水線之間的差值,從而更早地喚醒kswapd進行記憶體後台回收,以避免引發直接記憶體的回收。
watermark_scale_factor用於控制min、low和high水線之間的間隔。該數值越大,水線間隔也越大,預設值為10,在實際使用中會將該數值/10000,約等於總記憶體的 0.1%。
low水線 ≈ min水線 + watermark_scale_factor * total / 10000
high水線 ≈ low水線 + watermark_scale_factor * total / 10000
執行以下命令,調整watermark_scale_factor的值。
watermark_scale_factor的值應根據實際情況進行設定。以設定watermark_scale_factor值為150為例,即調整為系統總記憶體的1.5%。sudo sh -c 'echo 150 > /proc/sys/vm/watermark_scale_factor'查看修改是否成功。
cat /proc/zoneinfo執行結果樣本如下。
Node 0, zone Normal pages free 985595 zeroed 0 min 10708 low 29185 high 47662 spanned 1277952 present 1277952 managed 1231810 cma 0 protection: (0, 0, 0, 0, 0)