Creating threads fails with “Resource temporarily unavailable” with 4.3 kernel
The problem is caused by the TasksMax
systemd attribute. It was introduced in systemd 228 and makes use of the cgroups pid subsystem, which was introduced in the linux kernel 4.3. A task limit of 512
is thus enabled in systemd if kernel 4.3 or newer is running. The feature is announced here and was introduced in this pull request and the default values were set by this pull request. After upgrading my kernel to 4.3, systemctl status docker
displays a Tasks
line:
# systemctl status docker
● docker.service - Docker Application Container Engine
Loaded: loaded (/etc/systemd/system/docker.service; disabled; vendor preset: disabled)
Active: active (running) since Fri 2016-01-15 19:58:00 CET; 1min 52s ago
Docs: https://docs.docker.com
Main PID: 2770 (docker)
Tasks: 502 (limit: 512)
CGroup: /system.slice/docker.service
Setting TasksMax=infinity
in the [Service]
section of docker.service
fixes the problem. docker.service
is usually in /usr/share/systemd/system
, but it can also be put/copied in /etc/systemd/system
to avoid it being overridden by the package manager.
A pull request is increasing TasksMax
for the docker example systemd files, and an Arch Linux bug report is trying to achieve the same for the package. There is some additional discussion going on on the Arch Linux Forum and in an Arch Linux bug report regarding lxc.
DefaultTasksMax
can be used in the [Manager]
section in /etc/systemd/system.conf
(or /etc/systemd/user.conf
for user-run services) to control the default value for TasksMax
.
Systemd also applies a limit for programs run from a login-shell. These default to 4096
per user (will be increased to 12288
) and are configured as UserTasksMax
in the [Login]
section of /etc/systemd/logind.conf
.
cdauth's answer is correct, but there is another detail to add.
On my Ubuntu 16.04 system with systemd 229 and a 4.3 kernel, a 512 pid limit was enforced on session scopes by default even when UserTasksMax was set to the new, increased default of 12288. So any user session scope was limited to 512 threads.
The only way I found to remove the limit was to set DefaultTasksMax=unlimited
in /etc/systemd/system.conf
and systemctl daemon-reexec
(or reboot).
You can check if this is happening by issuing systemctl status
, picking a session scope, and cat /sys/fs/cgroup/pids/user.slice/user-${UID}.slice/session-FOO.scope/pids.max
.