我最近在 Debian 11 服务器上安装了 RabbitMQ,并注意到现在绝大多数线程都属于同一个进程——beam.smp。从网上查到,这个进程是Erlang的runtime或者VM,是RabbitMQ的一个依赖。的输出ps
表明它是具有 1200 个线程的单个进程。
$ ps -e | grep beam.smp | wc -l
1
$ ps -eLF | grep beam.smp | wc -l
1200
CPU 使用率非常低,因此所有这些线程都必须处于睡眠状态。但是,我发现单个进程拥有这么多线程非常奇怪。
这是正常现象还是配置错误的迹象?或者它可能是一个错误?它似乎不会立即引起任何问题,但它会在以后导致问题吗?
通常我会提供配置文件的内容,但在这种情况下,我找不到负责 beam.smp 的配置文件。
使用 Erlang 可以轻松实现数千个线程。您可能可以按原样使用该调优,尤其是在资源使用可控的情况下。
BEAM 是参考 Erlang VM,它是构建RabbitMQ的基础。Erlang 具有本机并发性,轻量级进程进行消息传递。因此,轻量级 RabbitMQ 文档讨论了 200 万个进程用于大量并发连接。其他资源限制限制了系统在实践中的规模。
在 Linux 上,线程恰好是运行时运行的实现。这意味着许多任务共享相同的组 ID,并且它们显示为相同的进程 ID(与 Erlang 进程的含义不同)。
在 POSIX 系统上,很多线程在应用程序中并不常见。理解 PID 是计算任务的唯一方法。例如,使用 SMP,一个多线程 PID 可以超过 100% 的 CPU。