为什么虚拟服务器上的线程这​​么少?

为什么虚拟服务器上的线程这​​么少?

我有一个具有 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,因为这是该服务器的总限制。

相关内容