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。
|
/sys/fs/cgroup/memory/<memcg目錄名稱>/memory.pagecache_limit.enable | 該介面是memcg開關,用於設定各memcg是否啟用Page Cache限制功能。取值範圍:0~1,預設值為0。
|
/sys/fs/cgroup/memory/<memcg目錄名稱>/memory.pagecache_limit.size | 該介面限制當前memcg的Page Cache使用量(單位:位元組)。取值範圍:0~當前memcg的
|
/sys/fs/cgroup/memory/<memcg目錄名稱>/memory.pagecache_limit.sync | 該介面控制當前memcg的Page Cache使用量超出限制後,採用非同步回收還是同步回收。取值範圍:0~1,預設值為0。
|
工作原理
開啟Page Cache限制功能後,memcg粒度的工作原理如下。
當memcg進程分配Page Cache時,判斷當前memcg的Page Cache是否超過限制,並從當前memcg開始往上遍曆,逐級檢查父memcg的
memory.pagecache_limit
值,如果該值為0,表示父memcg禁用了Page Cache限制,則當前memcg以及其子memcg不會受到Page Cache的限制。當memcg的Page Cache使用超過限制時,根據
memory.pagecache_limit.sync
判斷當前回收採用同步回收還是非同步回收。開始回收Page Cache。
同步回收:預設僅支援未對應檔頁回收,當掃描次數超過4次時,允許對對應檔頁進行回收。
非同步回收:預設支援未對應檔頁和對應檔頁回收,當掃描次數超過2次時,允許對髒頁進行回收。
說明在記憶體管理中,存在以下不同類型的頁。
未對應檔頁:這些頁是指未被映射到任何檔案的記憶體頁。通常用於臨時資料和進程私人的記憶體地區,不會持久化到磁碟上。
對應檔頁:這些頁是指被映射到檔案的記憶體頁。對應檔頁允許進程通過訪問記憶體的方式來讀取和寫入檔案資料,從而實現了檔案的隨機訪問。
髒頁:髒頁是指對應檔頁中已經被修改過的頁。當進程對對應檔頁進行寫入時,相應的頁會被標記為髒頁。這表示檔案在記憶體中的副本已經與磁碟上的檔案內容不一致。髒頁通常會定期地被寫回磁碟,以確保資料的持久性。
介面配置樣本
本樣本的情境是構造20 MiB大小的Page Cache,並限制Page Cache的使用量為10 MiB。開啟Page Cache限制功能後,測試是否符合預期。
遠程登入ECS執行個體。
具體操作,請參見通過密碼或密鑰認證登入Linux執行個體。
運行以下命令,開啟Page Cache限制功能的全域開關。
sudo sh -c 'echo 1 > /sys/kernel/mm/pagecache_limit/enabled'
啟用Page Cache限制功能並限制Page Cache的使用量。
運行以下命令,建立一個memcg目錄,例如
/sys/fs/cgroup/memory/test/
。sudo mkdir -p /sys/fs/cgroup/memory/test/
運行以下命令,設定memcg的Page Cache使用量。
本樣本限制memcg的Page Cache使用量為10485760位元組(約10 MiB),命令為:
sudo sh -c 'echo 10485760 > /sys/fs/cgroup/memory/test/memory.pagecache_limit.size'
運行以下命令,設定一種回收方式。
非同步回收
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'
運行以下命令,啟用memcg的Page Cache限制功能。
sudo sh -c 'echo 1 > /sys/fs/cgroup/memory/test/memory.pagecache_limit.enable'
構造Page Cache。
(條件必選)運行以下命令,安裝
libcgroup
軟體包。構造Page Cache需要使用
cgexec
命令。cgexec
命令通常與libcgroup軟體包一起提供,並且需要在系統上進行安裝。如果您的系統中沒有cgexec
,請先安裝libcgroup軟體包。sudo yum install libcgroup-tools
運行以下命令,構造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
查看是否符合預期。
運行以下命令,查看當前Page Cache的使用量。
grep cache /sys/fs/cgroup/memory/test/memory.stat
返回結果如下:
在返回結果中,
cache
表示當前Page Cache的使用量為10543104位元組(約10 MiB),說明已成功限制。運行以下命令,查看Page Cache限制功能的回收結果。
cat /sys/fs/cgroup/memory/test/memory.exstat
返回結果如下:
在返回結果中,
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預讀量,然後重新測試。