2

I'm trying to use the systemd infrastructure to kill my memory leaking service when its memory usage reaches some value. The configuration file used is this:

[Unit]
Description="Start memory gobbler"
After=network.target
MemoryAccounting=true
MemoryHigh=1024K
MemoryMax=4096K

[Service]
ExecStart=/data/memgoble 8388600

systemd version is 237. However, no matter what I set in the MemoryMax the kernel would kill the process on its own terms, usually when its memory consumption reaches almost the entire physical RAM. I'm running this on an embedded system with no swap.

Anyone sees an obvious error in the configuration? Perhaps there are some other settings that I'm missing.

  • 1
    Have you considered using ulimit older simpler, and should work in this case. – ctrl-alt-delor Jun 11 '18 at 23:18
  • Unfortunately, I don't have a choice in this matter. systemd is the only option. Based on the man page the MemoryMax should work for a service. It just doesn't for some reason. – ilya1725 Jun 11 '18 at 23:25
  • you do have an option to consider it. It looks like you did. – ctrl-alt-delor Jun 12 '18 at 11:05
  • 2
    @ctrl-alt-delor ulimit doesn't work for memory restrictions. The last kernel to support it (RLIMIT_RSS) was 2.4.30, which is 12 years old. See unix.stackexchange.com/a/32375/4358 – Patrick Jun 12 '18 at 12:25
6

You have the config parameters in the wrong section.

If you look in your logs, you should see:

Unknown lvalue 'MemoryAccounting' in section 'Unit'
Unknown lvalue 'MemoryHigh' in section 'Unit'
Unknown lvalue 'MemoryMax' in section 'Unit'

https://www.freedesktop.org/software/systemd/man/systemd.resource-control.html

The resource control configuration options are configured in the [Slice], [Scope], [Service], [Socket], [Mount], or [Swap] sections, depending on the unit type.

Thus you want:

[Unit]
Description="Start memory gobbler"
After=network.target

[Service]
ExecStart=/data/memgoble 8388600
MemoryAccounting=true
MemoryHigh=1024K
MemoryMax=4096K
  • 1
    Good catch @Patrick. I did the change you suggested, but still get these errors: Jun 12 19:15:52 intel-corei7-64 systemd[1]: /lib/systemd/system/memgoble.service: Unknown lvalue 'MemoryHigh' in section 'Service' Jun 12 19:15:52 intel-corei7-64 systemd[1]: /lib/systemd/system/memgoble.service: Unknown lvalue 'MemoryMax' in section 'Service' Which is strange because based on the systemd manual this is where the configuration should reside. – ilya1725 Jun 12 '18 at 19:19
  • Check the man page on your system. Note the comments in the linked man page such as "MemoryMax= replaces MemoryLimit=" and others. The linked man page is the very latest version. Your system might not be running that version. – Patrick Jun 12 '18 at 19:26
  • Yeap, the systemd version I thought I've had was actually much older, that was the problem. – ilya1725 Jun 12 '18 at 20:03

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.