全部產品
Search
文件中心

Alibaba Cloud Linux:Page Cache限制功能

更新時間:Jul 17, 2024

Alibaba Cloud Linux 3(核心版本5.10.134-14開始)增加了Page Cache(檔案快取)限制功能,用於解決因Page Cache無限制使用帶來的系統穩定性問題,例如業務抖動、預期外的記憶體溢出OOM(Out Of Memory)等。

背景資訊

在核心系統中,系統分配記憶體並在相應記憶體子系統(memcg)中的統計達到memcg設定的記憶體上限時,會觸發memcg層級的直接記憶體回收,這可能導致當前進程的效能抖動。儘管具有Memcg後台非同步回收功能,但對於突發性的記憶體申請來說,其效果有限。有些任務例如Spark計算架構,Page Cache會經常佔用大量記憶體,並且大部分是髒頁。髒頁的回收速度較慢,導致了預期外的OOM情況的發生。因此,限制Page Cache的使用量對於保持業務的穩定性和減少預期外的OOM問題非常重要。

Alibaba Cloud Linux 3增加了Page Cache限制功能,支援以memcg為粒度(包括根組即整機)對Page Cache的使用進行限制。該功能可以通過設定Page Cache的上限,對超過限制的Page Cache進行非同步回收或者同步回收。這可以協助控制Page Cache的使用量,防止其佔用過多的記憶體資源,從而提高系統的穩定性和可靠性。

介面說明

介面

說明

/sys/kernel/mm/pagecache_limit/enabled

該介面是全域開關,用於設定當前核心系統是否啟用Page Cache限制功能。取值範圍:0~1,預設值為0。

  • 取值為1,表示允許啟用Page Cache限制功能。

  • 取值為0,表示禁用全部Page Cache限制功能。

/sys/fs/cgroup/memory/<memcg目錄名稱>/memory.pagecache_limit.enable

該介面是memcg開關,用於設定各memcg是否啟用Page Cache限制功能。取值範圍:0~1,預設值為0。

  • 取值為1,表示當前memcg啟用Page Cache限制功能。

  • 取值為0,表示當前memcg禁用Page Cache限制功能,則該memcg以及其子memcg不會受到Page Cache的限制。

/sys/fs/cgroup/memory/<memcg目錄名稱>/memory.pagecache_limit.size

該介面限制當前memcg的Page Cache使用量(單位:位元組)。取值範圍:0~當前memcg的memory.limit_in_bytes值,由您自訂設定,預設值為0。

  • 取值為0,表示當前memcg禁用Page Cache限制功能(即使全域開關和memcg開關都開啟)。

  • 取值為非0值,表示當前memcg tree的Page Cache的使用量的上限。

    說明

    memcg的Page Cache使用量包含當前memcg的所有子memcg的使用量。

/sys/fs/cgroup/memory/<memcg目錄名稱>/memory.pagecache_limit.sync

該介面控制當前memcg的Page Cache使用量超出限制後,採用非同步回收還是同步回收。取值範圍:0~1,預設值為0。

  • 取值為0,表示採用非同步回收。非同步回收採用workqueue的方式實現,在後台以非同步方式進行回收操作,可以減少對主線程的影響。

    說明

    workqueue是Linux核心中的一種機制,用於管理和執行非同步工作(即背景工作)。通過將回收操作添加到workqueue中,系統可以將回收任務交給後台線程處理,從而實現非同步回收。

  • 取值為1,表示採用同步回收。同步回收會阻塞當前進程進行直接回收,即回收操作會在當前進程的上下文中執行,可能會導致當前進程的效能抖動。

工作原理

開啟Page Cache限制功能後,memcg粒度的工作原理如下。

  1. 當memcg進程分配Page Cache時,判斷當前memcg的Page Cache是否超過限制,並從當前memcg開始往上遍曆,逐級檢查父memcg的memory.pagecache_limit值,如果該值為0,表示父memcg禁用了Page Cache限制,則當前memcg以及其子memcg不會受到Page Cache的限制。

  2. 當memcg的Page Cache使用超過限制時,根據memory.pagecache_limit.sync判斷當前回收採用同步回收還是非同步回收。

  3. 開始回收Page Cache。

    • 同步回收:預設僅支援未對應檔頁回收,當掃描次數超過4次時,允許對對應檔頁進行回收。

    • 非同步回收:預設支援未對應檔頁和對應檔頁回收,當掃描次數超過2次時,允許對髒頁進行回收。

      說明

      在記憶體管理中,存在以下不同類型的頁。

      • 未對應檔頁:這些頁是指未被映射到任何檔案的記憶體頁。通常用於臨時資料和進程私人的記憶體地區,不會持久化到磁碟上。

      • 對應檔頁:這些頁是指被映射到檔案的記憶體頁。對應檔頁允許進程通過訪問記憶體的方式來讀取和寫入檔案資料,從而實現了檔案的隨機訪問。

      • 髒頁:髒頁是指對應檔頁中已經被修改過的頁。當進程對對應檔頁進行寫入時,相應的頁會被標記為髒頁。這表示檔案在記憶體中的副本已經與磁碟上的檔案內容不一致。髒頁通常會定期地被寫回磁碟,以確保資料的持久性。

image

介面配置樣本

本樣本的情境是構造20 MiB大小的Page Cache,並限制Page Cache的使用量為10 MiB。開啟Page Cache限制功能後,測試是否符合預期。

  1. 遠程登入ECS執行個體。

    具體操作,請參見通過密碼或密鑰認證登入Linux執行個體

  2. 運行以下命令,開啟Page Cache限制功能的全域開關。

    sudo sh -c 'echo 1 > /sys/kernel/mm/pagecache_limit/enabled'
  3. 啟用Page Cache限制功能並限制Page Cache的使用量。

    1. 運行以下命令,建立一個memcg目錄,例如/sys/fs/cgroup/memory/test/

      sudo mkdir -p /sys/fs/cgroup/memory/test/
    2. 運行以下命令,設定memcg的Page Cache使用量。

      本樣本限制memcg的Page Cache使用量為10485760位元組(約10 MiB),命令為:

      sudo sh -c 'echo 10485760 > /sys/fs/cgroup/memory/test/memory.pagecache_limit.size'
    3. 運行以下命令,設定一種回收方式。

      • 非同步回收

        sudo sh -c 'echo 0 > /sys/fs/cgroup/memory/test/memory.pagecache_limit.sync'
      • 同步回收

        sudo sh -c 'echo 1 > /sys/fs/cgroup/memory/test/memory.pagecache_limit.sync'
    4. 運行以下命令,啟用memcg的Page Cache限制功能。

      sudo sh -c 'echo 1 > /sys/fs/cgroup/memory/test/memory.pagecache_limit.enable'
  4. 構造Page Cache。

    1. (條件必選)運行以下命令,安裝libcgroup軟體包。

      構造Page Cache需要使用cgexec命令。cgexec命令通常與libcgroup軟體包一起提供,並且需要在系統上進行安裝。如果您的系統中沒有cgexec,請先安裝libcgroup軟體包。

      sudo yum install libcgroup-tools
    2. 運行以下命令,構造Page Cache。

      本樣本使用dd命令以每次寫入1 MiB的塊大小,連續寫入20次,來構造一個總計20 MiB的Page Cache。命令為:

      sudo dd if=/dev/zero of=./testfile bs=1M count=20 oflag=direct
      sudo cgexec -g "memory:test" cat ./testfile > /dev/null
  5. 查看是否符合預期。

    1. 運行以下命令,查看當前Page Cache的使用量。

      grep cache /sys/fs/cgroup/memory/test/memory.stat

      返回結果如下:

      image.png

      在返回結果中,cache表示當前Page Cache的使用量為10543104位元組(約10 MiB),說明已成功限制。

    2. 運行以下命令,查看Page Cache限制功能的回收結果。

      cat /sys/fs/cgroup/memory/test/memory.exstat

      返回結果如下:

      image.png

      在返回結果中,pagecache_limit_reclaimed_kb表示回收的頁數(單位:KB),這裡是10108KB(約10 MiB),說明回收了10 MiB。

      通過測試結果可以看出,構造了20 MiB的Page Cache,限制Page Cache的使用量為10 MiB。當Page Cache的使用量超出限制時,回收了10 MiB的Page Cache,符合預期。

      說明

      如果測試發現pagecache_limit_reclaimed_kb值較大不符合預期,可能是IO預讀引入的問題導致額外的回收。此時建議您運行echo 128 | sudo tee /sys/block/vda/queue/read_ahead_kb命令(vda是雲端硬碟的裝置名稱,請您根據實際環境替換),設定IO預讀量,然後重新測試。