有沒有辦法限制Linux中的緩衝區快取大小?

有沒有辦法限制Linux中的緩衝區快取大小?

我的程式在 I/O 操作期間消耗了大量內存,這是執行負載的副作用。當我使用 direct_io 運行程式時,記憶體問題消失了,但程式完成任務所需的時間增加了四倍。

有沒有辦法減少緩衝區快取(I/O 操作期間使用的核心緩衝區)最大大小?最好不要改變內核源。

我嘗試過減少/proc/sys/vm/dirty_bytes 等。

更新:echo 1 > /proc/sys/vm/drop_caches echo 2 > /proc/sys/vm/drop_caches echo 3 > /proc/sys/vm/drop_caches 在程式運行時使用暫時減少使用的記憶體量。

我可以以某種方式限制頁面快取、目錄項目和索引節點,而不是不斷釋放它們嗎?這可能會解決我的問題。

以前沒有註意到這一點,但每個 I/O 操作都會出現問題,而不僅僅是分區。看起來 linux 正在快取通過 I/O 的所有內容,直到達到幾乎最大可用記憶體時的某個點,留下 4 MB 可用記憶體。因此,可以為 I/O 快取的記憶體量存在某種上限。但我無法找到它在哪裡。變得善良擺脫絕望。如果我不能在核心原始碼中的某個地方將它除以 2,我會很樂意這樣做。

2016 年 12 月 12 日更新:我已經放棄修復這個問題,但有件事引起了我的注意並提醒我這個問題。我家裡有舊的故障硬碟,當我嘗試用它做某件事時,它會瘋狂地浪費資源。

是否有可能只是硬碟故障?有問題的硬碟在我的問題發生後一個月內就死掉了。如果是這樣的話,我已經得到了答案。

答案1

當你問到程式,你可以使用cgroups

建立一個名為 group1 的 cgroup,並設定記憶體限制(例如 50GB,支援 CPU 等其他限制,範例中也提到了 CPU):

cgcreate -g memory,cpu:group1

cgset -r memory.limit_in_bytes=$((50*1024*1024*1024)) group1

然後,如果您的應用程式已經在運行,請將應用程式放入此 cgroup 中:

cgclassify -g memory,cpu:group1 $(pidof your_app_name)

或在此 cgroup 中執行您的應用程式:

cgexec -g memory,cpu:group1 your_app_name

相關內容