2017-03-01 123 views
1

我運行systemd版本219 根@ EVOvPTX1_RE0-RE0:在/ var /日誌#systemctl --version systemd 219 + PAM -audit -SELINUX + IMA -APPARMOR + SMACK + +的SysVInit UTMP -LIBCRYPTSETUP -GCRYPT + GNUTLS + ACL + XZ -LZ4 -SECCOMP + BLKID -ELFUTILS + KMOD -IDNsystemd內存限制不是強制

我有一個服務,我們稱之爲foo.service,它具有以下內容。

[服務] 的memoryLimit = 1G

我特意添加的代碼分配1M存儲器4096倍當接收到特定事件導致 4G內存ALLOC。這個想法是,在 該進程消耗1G的地址空間後,內存分配將開始失敗。 但是,這似乎並非如此。我能夠分配4G內存 沒有任何問題。這告訴我 服務文件中指定的內存限制未被強制執行。

任何人都可以讓我知道我錯過了什麼嗎?

我看着proc文件系統 - 文件名爲limits。這表明 最大地址空間是無限的,這也確認內存限制 沒有得到強制執行。

回答

0

這種區別是你已經分配了內存,但是你還沒有真正使用它。在top的輸出中,這是「VIRT」內存列(分配)和「RES」列(實際使用)之間的差異。

嘗試修改您的實驗,將值分配給大型數組的元素,而不僅僅是分配內存並查看是否以此方式觸發內存限制。

參考:Resident and Virtual memory on Linux: A short example

+0

感謝您的這個例子。我確實看到分配4G而不使用RES。只有在使用內存之後,我確實看到RES進入4G。但是,即使在服務文件中有「MemoryLimit = 1G」,我也能使VIRT和RES都達到4G。我使用的是systemd 219,它有點舊。是否systemd 219不支持資源管理? –