Linux-Kernel

在 Linux 中限制緩衝區記憶體的大小

  • February 8, 2022

有沒有辦法告訴 Linux 核心只使用一定比例的記憶體用於緩衝區記憶體?我知道/proc/sys/vm/drop_caches可以用來臨時清除記憶體,但是是否有任何永久設置可以防止它增長到超過例如 50% 的主記憶體?

我想這樣做的原因是,我有一台執行 Ceph OSD 的伺服器,它不斷地從磁碟提供數據,並設法在幾個小時內將整個物理記憶體用作緩衝區記憶體。同時,我需要執行將分配大量(幾十 GB)物理記憶體的應用程序。與普遍的看法相反(請參閱幾乎所有有關緩衝區記憶體的問題的建議),通過丟棄乾淨的記憶體條目自動釋放記憶體並不是即時的:當緩衝區記憶體已滿時,啟動我的應用程序可能需要一分鐘( *),而在清除記憶體後(使用echo 3 > /proc/sys/vm/drop_caches),相同的應用程序幾乎立即啟動。

(*) 根據 Vtune 在一個名為pageblock_pfn_to_page. 此功能似乎與查找大頁面所需的記憶體壓縮有關,這使我相信實際上碎片是問題所在。

如果您不想要絕對限制,而只是向核心施加壓力以更快地清除緩衝區,您應該查看vm.vfs_cache_pressure

> > 此變數控制核心回收用於記憶體 VFS 記憶體的記憶體的趨勢,而不是頁面記憶體和交換。增加此值會增加回收 VFS 記憶體的速率。 > > >

範圍從 0 到 200。將其移向 200 以獲得更高的壓力。預設設置為 100。您還可以使用該slabtop命令分析您的記憶體使用情況。在您的情況下,dentryand*_inode_cache值必須很高。

如果你想要一個絕對限制,你應該查一下cgroups。將 Ceph OSD 伺服器放在一個 cgroup 中,並通過設置memory.limit_in_bytescgroup 的參數來限制它可以使用的最大記憶體。

> > memory.memsw.limit_in_bytes設置記憶體和交換使用總和的最大數量。如果未指定單位,則該值被解釋為字節。但是,可以使用後綴來表示更大的單位——k 或 K 表示千字節,m 或 M 表示兆字節,g 或 G 表示千兆字節。 > > >

參考:

$$ 1 $$- GlusterFS Linux 核心調整 $$ 2 $$- RHEL 6 資源管理指南

引用自:https://unix.stackexchange.com/questions/253816