簡體   English   中英

在 Linux 上限制進程內存/CPU 使用

[英]Limiting process memory/CPU usage on linux

我知道我們可以使用nice命令調整調度優先級。

然而,手冊頁並沒有說明它是同時限制 CPU 和內存還是只限制 CPU(無論如何,它不能用於指定絕對限制)。

有沒有辦法在 Linux 中運行進程並限制其內存使用量為“X”MB 和 CPU 使用量為“Y”Mhz?

您可能想要調查cgroups以及舊的(過時的) ulimit

Linux具體答案:

對於運行ulimit -m $LIMIT_IN_KB的歷史系統,應該是正確的答案。 現在你必須使用cgroupscgexecsystemd-run

但是,對於仍在過渡到systemd的系統,似乎沒有任何解決方案不需要為您希望使用的每個限制設置預制配置。 這是因為此類系統(例如 Debian/Ubuntu)仍然使用“混合層次結構 cgroups”,而 systemd 僅支持使用較新的“統一層次結構 cgroups”設置內存限制。 如果您的 Linux 發行版已經在運行具有統一層次結構 cgroups 的systemd ,那么運行具有特定限制的給定用戶模式進程應該像這樣工作

systemd-run --user --pipe -p MemoryMax=42M -p CPUWeight=10 [command-to-run ...]

要么

systemd-run --user --scope -p MemoryMax=42M -p CPUWeight=10 [command-to-run ...]

有關可能的參數,請參閱man systemd.resource-control

如果我理解正確,設置CPUWeight指示內核在 CPU 完全任務且默認為100時要提供多少 CPU,如果多個進程競爭 CPU 時間,則較低的值意味着較少的 CPU 時間。 如果 CPU 使用率低於 100%,它不會限制 CPU 使用率,這通常是一件好事。 如果你真的想在機器空閑時強制進程使用少於單核,你可以設置例如CPUQuota=10%來強制進程使用最多 10% 的單核。 如果您設置CPUQuota=200% ,這意味着該進程平均最多可以使用 2 個內核(但如果沒有 CPU 綁定,它可以在更多 CPU 上使用它的一些時間)。

附加信息:

更新(2021 年):似乎

systemd-run --user --pty -p MemoryMax=42M -p CPUWeight=10 ...

如果您運行的systemd版本包括對錯誤的修復,應該可以工作https://github.com/systemd/systemd/issues/9512 – 實際上,您需要此處列出的修復: https ://github.com/systemd/ systemd/拉/10894

如果您的系統缺少這些修復程序,則命令

systemd-run --user --pty -p MemoryMax=42M -p CPUWeight=10 ...

似乎有效,但實際上並未強制執行內存限制。

實際上, Ubuntu 20.04 LTS 似乎不包含所需的修復 以下應該失敗:

$ systemd-run --user --pty -p MemoryMax=42M -p MemorySwapMax=50M -p CPUWeight=10 stress -t 10 --vm-keep --vm-bytes 10m -m 20

因為命令stress預計需要略多於 200 MB 的 RAM,但內存限制設置得較低。 根據 bug https://github.com/systemd/systemd/issues/10581 Poettering 說如果發行版使用cgroupsv2這應該有效,無論它在實踐中意味着什么。

我不知道正確實現用戶模式cgroup限制的發行版。 因此,您需要root來配置限制。

理論上,您應該能夠為此目的使用ulimit 但是,我個人從未讓它發揮作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM