
所以我有 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
內運行。memlimit
cgconfig.conf
答案2
cgroups
正如其他答案所指出的那樣,這是執行此操作的正確方法。不幸的是,這個問題沒有完美的解決方案,我們將在下面討論。有多種不同的方法可以設定 cgroup 記憶體使用限制。如何使使用者的登入會話自動成為 cgroup 的一部分,因係統而異。 紅帽有一些工具,也是如此系統。
memory.memsw.limit_in_bytes
並memory.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
答案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檔案的名稱並不重要,但我不確定)