在 Linux 中限制緩衝區記憶體的大小
有沒有辦法告訴 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
命令分析您的記憶體使用情況。在您的情況下,dentry
and*_inode_cache
值必須很高。如果你想要一個絕對限制,你應該查一下
cgroups
。將 Ceph OSD 伺服器放在一個 cgroup 中,並通過設置memory.limit_in_bytes
cgroup 的參數來限制它可以使用的最大記憶體。> >
memory.memsw.limit_in_bytes
設置記憶體和交換使用總和的最大數量。如果未指定單位,則該值被解釋為字節。但是,可以使用後綴來表示更大的單位——k 或 K 表示千字節,m 或 M 表示兆字節,g 或 G 表示千兆字節。 > > >參考:
$$ 1 $$- GlusterFS Linux 核心調整 $$ 2 $$- RHEL 6 資源管理指南