我有一个具有 2 个内核和 4GB RAM 的 v-server。系统上运行着不同的应用程序,如 SCM-manager 和其他一些小应用程序。昨天我尝试运行另一个 c++ 程序,但总是出现程序无法创建更多线程的错误。所以我尝试了这个程序(关联),程序告诉我只能创建两个线程。当我关闭 SCM 管理器时,我可以打开 53 个线程。
top -H 告诉我以下内容:
Threads: 147 total, 1 running, 146 sleeping
但我真的不明白这个限制。我以为只有可用的 RAM 才是可能线程数的限制?但是当我在 Raspberry Pi 上运行上面链接中的代码时,我可以创建超过 250 个线程,而 Raspberry Pi 只有 1GB 的 RAM。
有人能解释一下这种现象吗?也许还能修复?
这里是user_beancounters的内容: 用户_beancounters
答案1
您没有实际的“虚拟服务器”。您有一个容器即服务器的一小部分,实际上在所有客户之间共享一个操作系统,并且仅限制每个客户可以看到的文件和进程。(这个特别基于 OpenVZ,通常由托管服务提供商使用,但 LXC 和 Docker 等的工作方式相同。)
由于这些系统不会为每个客户虚拟化整个操作系统(就像“虚拟服务器”那样),而是在所有客户之间共享一个运行内核,因此所需资源较少,成本更低 - 但另一方面,它们会对可运行的进程数、可拥有的文件数等施加人为限制。
(而在您的 Raspberry Pi 系统上,您拥有整个操作系统 - 并且它不会施加任何人为的限制。这就是差异所在。)
在这种情况下,OpenVZ/proc/user_beancounters
会报告您的帐户被限制400 个流程[编辑:我看错了列],我怀疑“进程”实际上是指“任务”,可以是进程也可以是线程。
为了避免将来出现这种情况,请坚持使用完全虚拟化的服务器(通常基于 KVM,偶尔基于 Xen、Hyper-V、VMWare 等)。
答案2
所讨论的机器正在运行systemd
,这可以对每个进程的线程数施加每个线程的限制。
以 root 身份运行以下命令:
# systemctl show --property=DefaultTasksMax
DefaultTasksMax=135
这是 Strato 8 Core/32 GB VPS(德国)的默认配置。
改变:
# mkdir mkdir /etc/systemd/systemd.conf.d
# cd /etc/systemd/systemd.conf.d
# cat << cat << EOF > system.conf
### Override created 2023-02-18
#
[Manager]
DefaultTasksMax=1100
EOF
用 重新加载这些文件systemctl daemon-reexec
。
show
现在通过再次运行上面的命令来再次检查:
# systemctl show --property=DefaultTasksMax
DefaultTasksMax=1100
您可以在 VPS 中创建的线程数有绝对限制。您可以在 中/proc/user_beancounters
查找进行检查numproc
。
# egrep '(held|numproc)' /proc/user_beancounters
uid resource held maxheld barrier limit failcnt
numproc 274 274 1100 1100 0
我在配置中选择了限制 1100,因为这是该服务器的总限制。