如何建立限制 RAM 使用的使用者?

如何建立限制 RAM 使用的使用者?

所以我有 4 GB RAM + 4GB 交換空間。我想創建一個具有有限 ram 和交換空間的用戶:3 GB RAM 和 1 GB 交換空間。這樣的事可能嗎?是否可以啟動具有有限 RAM 的應用程式並對其進行交換,而無需創建單獨的用戶(並且不安裝任何特殊應用程式 - 僅具有預設的 Debian/CentOS 伺服器配置,並且不使用 sudo)?

更新:

所以我打開terminall並輸入極限值命令:ulimit -v 1000000類似於976,6Mb限制。接下來我打電話ulimit -a發現限制已「開啟」。然後我啟動了一些 bash 腳本來編譯並啟動我的應用程序nohup,a長一 nohup ./cloud-updater-linux.sh >& /dev/null &……但過了一段時間我看到:

在此輸入影像描述

(如果沒有應用任何限制,那就沒問題了 - 它下載了一些大的庫,並開始編譯它。)

但我認為我對 shell 以及使用它啟動的所有進程都應用了限制ulimit -v 1000000?我做錯了什麼?如何限制終端及其啟動的所有子進程的記憶體使用?

答案1

ulimit就是為此而生的。您可以ulimit在每個使用者或每個群組的基礎上設定預設值

/etc/security/limits.conf

ulimit -v KBYTES設定最大虛擬記憶體大小。我認為您不能提供最大交換金額。這只是對使用者可以使用的虛擬記憶體量的限制。

所以你limits.conf會有這條線(最大4G記憶體)

luser  hard  as   4000000

更新 - CGroups

ulimit和施加的限制limits.conf是針對每個進程的。我在這一點上絕對不清楚。

如果您想限制使用者使用的記憶體總量(這就是您所要求的)。你想使用cgroups

/etc/cgconfig.conf

group memlimit {
    memory {
        memory.limit_in_bytes = 4294967296;
    }
}

這將創建一個cgroup最大記憶體限制為 4GiB 的記憶體。

/etc/cgrules.conf

luser   memory   memlimit/

這將導致所有運行的進程都在中建立的 cgroupluser內運行。memlimitcgconfig.conf

答案2

cgroups正如其他答案所指出的那樣,這是執行此操作的正確方法。不幸的是,這個問題沒有完美的解決方案,我們將在下面討論。有多種不同的方法可以設定 cgroup 記憶體使用限制。如何使使用者的登入會話自動成為 cgroup 的一部分,因係統而異。 紅帽有一些工具,也是如此系統

memory.memsw.limit_in_bytesmemory.limit_in_bytes分別設定包括和不包括掉期的限制。缺點memory.limit_in_bytes是它會根據該組的配額來計算由核心代表 cgroup 中的進程快取的檔案。較少的快取意味著更多的磁碟訪問,因此如果系統有一些可用內存,您可能會放棄一些效能。

另一方面,memory.soft_limit_in_bytes允許 cgroup 超過配額,但如果內核 OOM 殺手被調用,那麼從邏輯上講,那些超過配額的 cgroup 將首先被殺死。然而,這樣做的缺點是,在某些情況下,立即需要一些內存,而OOM 殺手沒有時間四處尋找要殺死的進程,在這種情況下,在超出配額的用戶進程被終止之前,某些事情可能會失敗。

ulimit然而,這絕對是錯誤的工具。 ulimit 對虛擬記憶體的使用施加限制,這幾乎肯定不是您想要的。許多現實世界的應用程式使用的虛擬記憶體遠多於實體記憶體。大多數垃圾收集運行時(Java、Go)都以這種方式工作以避免碎片。一個簡單的 C 語言「hello world」程序,如果使用位址清理器編譯,可以使用 20TB 的虛擬記憶體。不依賴的分配器sbrk,例如傑馬洛克(這是 Rust 的預設分配器)或tcmalloc,也會使虛擬記憶體使用量大幅超過其實體使用量。為了提高效率,許多工具都會對應文件,這會增加虛擬使用量,但不一定會增加實體使用量。我的所有 Chrome 進程均使用 2TB 虛擬記憶體。我的筆記型電腦實體記憶體為 8GB。嘗試在這裡設定虛擬記憶體配額的任何方式要么會破壞 Chrome,迫使 Chrome 禁用一些依賴於分配(但不使用)大量虛擬記憶體的安全功能,要么完全無法有效防止用戶濫用系統。

答案3

您無法在使用者層級限制記憶體使用量,ulimit 可以做到這一點,但只能針對單一進程。

即使使用了每個用戶的限制/etc/security/limits.conf,用戶也可以透過運行多個進程來使用所有記憶體。

如果您確實想限制資源,則需要使用資源管理工具,例如拉帕德由 Solaris 下的項目和區域使用。

您可能會研究一下 Linux 上似乎提供類似功能的東西:cgroups

答案4

在具有 systemd 的系統中(例如我正在使用的 Ubuntu 22.04),限制 CPU/內存的最簡單方法是使用 cgroups systemd 配置文件,例如限制為 4GB RAM 和 2 個線程:

nano /etc/systemd/system/user-.slice.d/50-memory.conf

並在該文件中寫入:

[Slice]
MemoryMax=4G
CPUQuota=200%

(然後運行systemctl daemon-reload即可申請)

這適用於所有用戶,但您可以覆蓋單一用戶/etc/systemd/system/user-[uid].slice.d/50-memory.conf

(我認為conf檔案的名稱並不重要,但我不確定)

相關內容