mirror of
https://github.com/systemd/systemd.git
synced 2024-11-28 04:33:36 +08:00
core: optionally, accept a percentage value for MemoryLimit= and related settings
If a percentage is used, it is taken relative to the installed RAM size. This should make it easier to write generic unit files that adapt to the local system.
This commit is contained in:
parent
9184ca48ea
commit
875ae5661a
@ -228,9 +228,11 @@
|
||||
reclaimed as long as memory can be reclaimed from unprotected units.</para>
|
||||
|
||||
<para>Takes a memory size in bytes. If the value is suffixed with K, M, G or T, the specified memory size is
|
||||
parsed as Kilobytes, Megabytes, Gigabytes, or Terabytes (with the base 1024), respectively. This controls the
|
||||
<literal>memory.low</literal> control group attribute. For details about this control group attribute, see
|
||||
<ulink url="https://www.kernel.org/doc/Documentation/cgroup-v2.txt">cgroup-v2.txt</ulink>.</para>
|
||||
parsed as Kilobytes, Megabytes, Gigabytes, or Terabytes (with the base 1024), respectively. Alternatively, a
|
||||
percentage value may be specified, which is taken relative to the installed physical memory on the
|
||||
system. This controls the <literal>memory.low</literal> control group attribute. For details about this
|
||||
control group attribute, see <ulink
|
||||
url="https://www.kernel.org/doc/Documentation/cgroup-v2.txt">cgroup-v2.txt</ulink>.</para>
|
||||
|
||||
<para>Implies <literal>MemoryAccounting=true</literal>.</para>
|
||||
|
||||
@ -247,7 +249,9 @@
|
||||
aggressively in such cases. This is the main mechanism to control memory usage of a unit.</para>
|
||||
|
||||
<para>Takes a memory size in bytes. If the value is suffixed with K, M, G or T, the specified memory size is
|
||||
parsed as Kilobytes, Megabytes, Gigabytes, or Terabytes (with the base 1024), respectively. If assigned the
|
||||
parsed as Kilobytes, Megabytes, Gigabytes, or Terabytes (with the base 1024), respectively. Alternatively, a
|
||||
percentage value may be specified, which is taken relative to the installed physical memory on the
|
||||
system. If assigned the
|
||||
special value <literal>infinity</literal>, no memory limit is applied. This controls the
|
||||
<literal>memory.high</literal> control group attribute. For details about this control group attribute, see
|
||||
<ulink url="https://www.kernel.org/doc/Documentation/cgroup-v2.txt">cgroup-v2.txt</ulink>.</para>
|
||||
@ -268,8 +272,9 @@
|
||||
last line of defense.</para>
|
||||
|
||||
<para>Takes a memory size in bytes. If the value is suffixed with K, M, G or T, the specified memory size is
|
||||
parsed as Kilobytes, Megabytes, Gigabytes, or Terabytes (with the base 1024), respectively. If assigned the
|
||||
special value <literal>infinity</literal>, no memory limit is applied. This controls the
|
||||
parsed as Kilobytes, Megabytes, Gigabytes, or Terabytes (with the base 1024), respectively. Alternatively, a
|
||||
percentage value may be specified, which is taken relative to the installed physical memory on the system. If
|
||||
assigned the special value <literal>infinity</literal>, no memory limit is applied. This controls the
|
||||
<literal>memory.max</literal> control group attribute. For details about this control group attribute, see
|
||||
<ulink url="https://www.kernel.org/doc/Documentation/cgroup-v2.txt">cgroup-v2.txt</ulink>.</para>
|
||||
|
||||
@ -284,17 +289,14 @@
|
||||
<term><varname>MemoryLimit=<replaceable>bytes</replaceable></varname></term>
|
||||
|
||||
<listitem>
|
||||
<para>Specify the limit on maximum memory usage of the
|
||||
executed processes. The limit specifies how much process and
|
||||
kernel memory can be used by tasks in this unit. Takes a
|
||||
memory size in bytes. If the value is suffixed with K, M, G
|
||||
or T, the specified memory size is parsed as Kilobytes,
|
||||
Megabytes, Gigabytes, or Terabytes (with the base 1024),
|
||||
respectively. If assigned the special value
|
||||
<literal>infinity</literal>, no memory limit is applied. This
|
||||
controls the <literal>memory.limit_in_bytes</literal>
|
||||
control group attribute. For details about this control
|
||||
group attribute, see <ulink
|
||||
<para>Specify the limit on maximum memory usage of the executed processes. The limit specifies how much
|
||||
process and kernel memory can be used by tasks in this unit. Takes a memory size in bytes. If the value is
|
||||
suffixed with K, M, G or T, the specified memory size is parsed as Kilobytes, Megabytes, Gigabytes, or
|
||||
Terabytes (with the base 1024), respectively. Alternatively, a percentage value may be specified, which is
|
||||
taken relative to the installed physical memory on the system. If assigned the special value
|
||||
<literal>infinity</literal>, no memory limit is applied. This controls the
|
||||
<literal>memory.limit_in_bytes</literal> control group attribute. For details about this control group
|
||||
attribute, see <ulink
|
||||
url="https://www.kernel.org/doc/Documentation/cgroup-v1/memory.txt">memory.txt</ulink>.</para>
|
||||
|
||||
<para>Implies <literal>MemoryAccounting=true</literal>.</para>
|
||||
|
@ -2812,9 +2812,19 @@ int config_parse_memory_limit(
|
||||
int r;
|
||||
|
||||
if (!isempty(rvalue) && !streq(rvalue, "infinity")) {
|
||||
r = parse_size(rvalue, 1024, &bytes);
|
||||
if (r < 0 || bytes < 1) {
|
||||
log_syntax(unit, LOG_ERR, filename, line, r, "Memory limit '%s' invalid. Ignoring.", rvalue);
|
||||
|
||||
r = parse_percent(rvalue);
|
||||
if (r < 0) {
|
||||
r = parse_size(rvalue, 1024, &bytes);
|
||||
if (r < 0) {
|
||||
log_syntax(unit, LOG_ERR, filename, line, r, "Memory limit '%s' invalid. Ignoring.", rvalue);
|
||||
return 0;
|
||||
}
|
||||
} else
|
||||
bytes = (((physical_memory() / page_size()) * (uint64_t) r) / 100) * page_size();
|
||||
|
||||
if (bytes < 1) {
|
||||
log_syntax(unit, LOG_ERR, filename, line, 0, "Memory limit '%s' too small. Ignoring.", rvalue);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user