Zwiększenie maksymalnej ilości tasków w systemd

Zmiana limitu zadań w warstwie systemu

Gdy mamy problem z ilością tasków w warstwie systemu. W logach można często zobaczyć podobny komunikat:

cgroup: fork rejected by pids controller in /system.slice/sshd.service 

Możemy sprawdzić maksymalną dostępną ilość wątków dla systemd

$ systemctl show --property DefaultTasksMax
DefaultTasksMax=4915

Aby sprawdzić ile wykorzystano dla konkretnego demona wpisujemy np:

$ systemctl status sshd | grep -i tasks: 
 Tasks: 1 (limit: 4915) # tutaj 1 to używane a limit 4915

Domyślnie DefaultTaskMax jest ustawione na 15% limitu jądra

$ cat /proc/sys/kernel/pid_max

Możemy zmienić tę ilość zmieniając DefaultTasksMax w pliku

$ mcedit /etc/systemd/system.conf
DefaultTasksMax=8192

Następnie restartujemy system lub przeładowujemy konfigurację.

$ systemctl daemon-reload

Przeładowanie konfiguracji nie spowoduje zerwania połączeń.

Możemy też zwiększyć limit dla konkretnego serwisu kontrolowanego przez systemd. Poniższy przykład pokazuje, jak zwiększyć limit sshd do 8192. Utwórz nowy plik przesłaniający za pomocą:

$ systemctl edit sshd.service
[Service]
TasksMax=8192

Gdy teraz sprawdzimy ilość tasków dla serwisu

$ systemctl status shd.service
Tasks: 1 (limit: 8192)

Domyślny TasksMax limit dla użytkownika

Domyślny limit dla użytkowników powinien być dość wysoki, ponieważ sesje użytkowników wymagają więcej zasobów.
Skąd wiadomo, jakich wartości użyć? Różni się to w zależności od obciążeń zasobów systemowych i innych konfiguracji zasobów. Gdy wartość TasksMax jest zbyt niska, zobaczysz w logach komunikaty o błędach np:

 cgroup: fork rejected by pids controller in /user.slice/user-0.slice/session-1.scope 

Aby sprawdzić ilość tasków dla wszystkich użytkowników

$ systemctl status user.slice | grep -i Tasks:

lub dla konkretnego użytkownika

$ systemctl status user-0.slice | grep -i Tasks:

Można ustawić własne maksymalne ustawienia dla użytkowników, tworząc nowy plik, na przykład /etc/systemd/system/user-.slice.d/user-taskmask.conf. Poniższy przykład ustawia wartość domyślną 16284:

$ mkdir /etc/systemd/system/user-.slice.d
$ mcedit /etc/systemd/system/user-.slice.d/user-taskmask.conf

[Slice]
TasksMax=16284

$ systemctl daemon-reload # przeładowanie systemd

# sprawdzenie nowej wartości
$ systemctl show --property TasksMax user-.slice
TasksMax=16284

Posted in Linux.