調整watermark_scale_factor參數以解決CPU Sys佔用率過高的問題

更新時間:
Copy as MD

本文介紹了在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、lowhigh水線之間的間隔。該數值越大,水線間隔也越大,預設值為10,在實際使用中會將該數值/10000,約等於總記憶體的 0.1%。

  • low水線 ≈ min水線 + watermark_scale_factor * total / 10000

  • high水線 ≈ low水線 + watermark_scale_factor * total / 10000

  1. 執行以下命令,調整watermark_scale_factor的值。

    watermark_scale_factor的值應根據實際情況進行設定。以設定watermark_scale_factor值為150為例,即調整為系統總記憶體的1.5%。

    sudo sh -c 'echo 150 > /proc/sys/vm/watermark_scale_factor'
  2. 查看修改是否成功。

    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)