cgroup fork 被 pids 控制器拒绝

cgroup fork 被 pids 控制器拒绝

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

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

在 bash 中:输入任何命令时:

bash: fork: retry: Resource temporarily unavailable

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

Sep  5 09:46:08 ubuntu kernel: [  145.614883] cgroup: fork rejected by pids controller in /user.slice/user-1000.slice/[email protected]

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

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

session required    pam_unix.so 
session optional    pam_systemd.so 

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

*                soft    nofile          350000
*                hard    nofile          350000
*                soft    nproc           100000
*                hard    nproc           100000
*                soft    sigpending      100000
*                hard    sigpending      100000

CGroups/Systemd 配置:

myk@ubuntu:/etc/systemd/system$ systemctl status user.slice 
● user.slice - User and Session Slice
     Loaded: loaded (/lib/systemd/system/user.slice; static; vendor preset: ena>
     Active: active since Sat 2020-09-05 10:47:19 +08; 38min ago
       Docs: man:systemd.special(7)
      Tasks: 1396
     Memory: 1.0G
     CGroup: /user.slice
             └─user-1000.slice
               ├─session-2.scope

myk@ubuntu:~$ systemctl status user-1000.slice 
user-1000.slice - User Slice of UID 1000
     Loaded: loaded
    Drop-In: /usr/lib/systemd/system/user-.slice.d
             └─10-defaults.conf
     Active: active since Sat 2020-09-05 09:44:50 +08; 21min ago
       Docs: man:[email protected](5)
      Tasks: 340 (limit: 15479)
     Memory: 1.6G

cat /proc/sys/kernel/threads-max
46907

cat /sys/fs/cgroup/pids/user.slice/user-1000.slice/pids.max
15479

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

DefaultMemoryAccounting=no
DefaultTasksAccounting=no

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

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

UserTasksMax=infinity

没有成功

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

#DefaultTasksMax=

到:

DefaultTasksMax=infinity

没有成功

Ubuntu 在 MBP 上由 MacOs 托管的 VM-Ware 下运行。Pmstat 显示 MBC 上的热量正常。Ubuntu 20.04;vmware 11.6.5;macOs 10.15.6

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

答案1

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

更改:

任务最大值=33%

读书:

TasksMax=无穷大

答案2

我在使用 Podman 时也遇到了类似的问题。在 中dmesg,我看到

[265142.704655] cgroup: fork rejected by pids controller in /machine.slice/libpod-89834734bc5ab227ef20902dbe60d6082dd95dad81c2a3dd860392316bd58dbb.scope

调查后发现,podman 在我的系统上将默认任务限制设置为 2048

# systemctl status libpod-89834734bc5ab227ef20902dbe60d6082dd95dad81c2a3dd860392316bd58dbb.scope
Warning: The unit file, source configuration file or drop-ins of libpod-89834734bc5ab227ef20902dbe60d6082dd95dad81c2a3dd860392316bd58dbb.scope changed>
● libpod-89834734bc5ab227ef20902dbe60d6082dd95dad81c2a3dd860392316bd58dbb.scope - libcontainer container 89834734bc5ab227ef20902dbe60d6082dd95dad81c2a>
   Loaded: loaded (/run/systemd/transient/libpod-89834734bc5ab227ef20902dbe60d6082dd95dad81c2a3dd860392316bd58dbb.scope; transient)
Transient: yes
  Drop-In: /run/systemd/transient/libpod-89834734bc5ab227ef20902dbe60d6082dd95dad81c2a3dd860392316bd58dbb.scope.d
           └─50-DevicePolicy.conf, 50-DeviceAllow.conf, 50-TasksMax.conf
   Active: active (running) since Mon 2021-11-15 16:33:40 CET; 8min ago
    Tasks: 2048 (limit: 2048)
   Memory: 2.0G
      CPU: 2min 40.949s
   CGroup: /machine.slice/libpod-89834734bc5ab227ef20902dbe60d6082dd95dad81c2a3dd860392316bd58dbb.scope
           ├─418998 /usr/sbin/sshd -D
           ├─421644 sshd: root [priv]
           ├─421647 sshd: root@notty
           ├─422342 java -XX:+PrintClassHistogram -XX:+UseG1GC -Xms512M -Xmx2G -Dhawtio.realm=activemq -Dhawtio.offline=true -Dhawtio.rolePrincipalCla>
           ├─422796 bash -c cd /var/dtests/node_data/reproducers/ENTMQCL-2977/aggregate; mvn camel:run
           └─422812 /usr/lib/jvm/java-11-openjdk-11.0.13.0.8-3.el8_5.x86_64/bin/java -classpath /opt/maven/boot/plexus-classworlds-2.5.2.jar -Dclasswo>

Nov 15 16:33:40 dtests-rhel8x-tcn-base systemd[1]: Started libcontainer container 89834734bc5ab227ef20902dbe60d6082dd95dad81c2a3dd860392316bd58dbb.

可以通过运行 podman 来关闭 podman 默认限制--pids-limit=-1,这就是我现在正在做的事情。

相关内容