Erlang

beam.smp 執行數百(1000+)個執行緒是否正常?

  • March 20, 2022

我最近在 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。

引用自:https://serverfault.com/questions/1096608