cgroup fork 被 pids 控制器拒绝

myk*_*myk 5 pam cgroup systemd ubuntu-20.04

有一个用 C/C++ 编写的小型服务器程序,使用 nginx 和 Postgres,目前都托管在同一个 ubuntu 系统上。我通常从 bash 命令行运行服务器程序。

\n

最近在较新版本的 Ubuntu 上,当服务器程序运行时,大约半分钟后我无法执行任何其他命令;如果屏幕保存,则我无法重新登录。终止我的服务器程序将恢复正常行为。

\n

在 bash 中:按 ENTER 键输入任意命令:

\n
bash: fork: retry: Resource temporarily unavailable\n
Run Code Online (Sandbox Code Playgroud)\n

并将以下内容写入 /var/log/syslog:

\n
Sep  5 09:46:08 ubuntu kernel: [  145.614883] cgroup: fork rejected by pids controller in /user.slice/user-1000.slice/user@1000.service\n
Run Code Online (Sandbox Code Playgroud)\n

系统重新启动后启动服务器程序与系统运行一段时间后启动服务器程序的体验是不同的。具体来说,重新启动后,服务器程序将正常运行。如果服务器程序重新启动,它将以 60% 的利用率运行半分钟,然后跳至 80% 约 5 秒,然后降至 20% 的利用率。看起来好像有什么东西直接限制了应用程序。C组?

\n

PAM 配置: \n在 /etc/pam.d/common-session 中有以下行:

\n
session required    pam_unix.so \nsession optional    pam_systemd.so \n
Run Code Online (Sandbox Code Playgroud)\n

我不认为这有什么区别,但在 /etc/security/limits.d/91-nofile.conf 中我设置了以下 PAM 设置:

\n
*                soft    nofile          350000\n*                hard    nofile          350000\n*                soft    nproc           100000\n*                hard    nproc           100000\n*                soft    sigpending      100000\n*                hard    sigpending      100000\n
Run Code Online (Sandbox Code Playgroud)\n

CGroups/Systemd 配置:

\n
myk@ubuntu:/etc/systemd/system$ systemctl status user.slice \n\xe2\x97\x8f user.slice - User and Session Slice\n     Loaded: loaded (/lib/systemd/system/user.slice; static; vendor preset: ena>\n     Active: active since Sat 2020-09-05 10:47:19 +08; 38min ago\n       Docs: man:systemd.special(7)\n      Tasks: 1396\n     Memory: 1.0G\n     CGroup: /user.slice\n             \xe2\x94\x94\xe2\x94\x80user-1000.slice\n               \xe2\x94\x9c\xe2\x94\x80session-2.scope\n\nmyk@ubuntu:~$ systemctl status user-1000.slice \nuser-1000.slice - User Slice of UID 1000\n     Loaded: loaded\n    Drop-In: /usr/lib/systemd/system/user-.slice.d\n             \xe2\x94\x94\xe2\x94\x8010-defaults.conf\n     Active: active since Sat 2020-09-05 09:44:50 +08; 21min ago\n       Docs: man:user@.service(5)\n      Tasks: 340 (limit: 15479)\n     Memory: 1.6G\n\ncat /proc/sys/kernel/threads-max\n46907\n\ncat /sys/fs/cgroup/pids/user.slice/user-1000.slice/pids.max\n15479\n
Run Code Online (Sandbox Code Playgroud)\n

在 /etc/systemd/system.conf 中尝试添加:

\n
DefaultMemoryAccounting=no\nDefaultTasksAccounting=no\n
Run Code Online (Sandbox Code Playgroud)\n

没有成功。这确实导致“systemctl status user-1000.slice”不再显示任务限制

\n

在 /etc/systemd/logind.conf 中尝试添加:

\n
UserTasksMax=infinity\n
Run Code Online (Sandbox Code Playgroud)\n

没有成功

\n

在 /etc/systemd/system.conf\n中更改:

\n
#DefaultTasksMax=\n
Run Code Online (Sandbox Code Playgroud)\n

到:

\n
DefaultTasksMax=infinity\n
Run Code Online (Sandbox Code Playgroud)\n

没有成功

\n

Ubuntu 在 MBP 上的 MacO 托管的 VM-Ware 下运行。Pmstat 显示 MBC 上的热量正常。乌班图20.04;虚拟机 11.6.5;MacOS 10.15.6

\n

问题: \n是否有某种方法可以配置 cgroups / pam / systemd / etc 以便在服务器程序运行时能够继续使用命令行/能够在屏幕保存时重新登录?

\n

myk*_*myk 3

通过更改 /usr/lib/systemd/system/user-.slice.d/10-defaults.conf 解决了此问题

改变:

最大任务数=33%

读书:

任务最大=无穷大