erlang VM 占用大约 600 个 os/windows 机器线程

Posted

技术标签:

【中文标题】erlang VM 占用大约 600 个 os/windows 机器线程【英文标题】:erlang VM occupies around 600 os/windows machine threads 【发布时间】:2020-01-29 00:18:36 【问题描述】:

我只是在 erlang 中实现简单的 tcp 侦听器/服务器应用程序,我使用 40000 个 tcp 连接测试此代码,它在 windows 机器中创建了大约 600 个 os 线程,我关闭了那些 40K tcp 连接,但 erlang VM 没有释放 600 个 os/windows 线程。我如何优化这个,我期待您的回复

【问题讨论】:

【参考方案1】:

erl_poll(负责检查套接字上的新数据的机制)的 Windows 实现使用 WaitForMultipleObjects。此 API 不允许每次调用超过 64 个对象,因此 erl_poll 创建每个侦听 64 个对象的线程。这些是你看到的线程。

没有机制可以在使用这些线程后删除它们,因此它们将一直保留到系统终止。如果您将来再次使用那么多连接,它们当然会被重新使用。

执行此操作的代码位于:https://github.com/erlang/otp/blob/master/erts/emulator/sys/win32/erl_poll.c

【讨论】:

是的,谢谢你的回复我理解这个概念:)

以上是关于erlang VM 占用大约 600 个 os/windows 机器线程的主要内容,如果未能解决你的问题,请参考以下文章

日600亿消息,月4.65亿用户——WhatsApp的Erlang世界

erlang如何使用一个OS线程实现抢占式调度?

在swift中删除viewcontrollers

Erlang VM (BEAM) 如何构建列表?

由于一个简单的 IN 语句,大量的全表扫描(大约 600 次)

在没有 epmd 的情况下启动 erlang VM