You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让rebar3构建的Erlang应用利用全部CPU核心?

嘿,刚好对Erlang的多核心调度这块很熟悉!你的Erlang应用只用单核心,大概率是调度器配置没拉满,或者启动参数没设置对,下面给你一步步解决的办法:

1. 启动时直接指定调度器数量

Erlang的调度器(schedulers)默认应该和CPU核心数匹配,但有时候环境或启动脚本的限制会让它只跑在单核心上。最简单的办法就是启动时显式指定:

  • 用rebar3 shell启动的话,直接加Erlang虚拟机参数:
    rebar3 shell --erl "+S auto"
    
    +S auto会让Erlang自动检测并使用所有可用CPU核心,把在线调度器数量设为核心数。要是你想精确指定(比如8核机器),可以写成+S 8:8,前面的数字是在线调度器数,后面是可用调度器数,两者设成一致就行。
  • 如果是用rebar3生成的release启动,直接在启动脚本里加上这个参数,比如:
    ./_build/default/rel/your_app/bin/your_app start +S auto
    
2. 把配置写到rebar3文件里,一劳永逸

不想每次启动都敲参数?可以把配置固化到项目文件里:

  • 编辑rebar.config,添加Erlang虚拟机的启动参数:
    {erl_opts, ["+S auto"]}.
    
    这样每次用rebar3 shell或者rebar3 compile启动时,都会自动带上这个参数。
  • 要是你用relx生成release,还可以单独配置vm.args文件:
    首先在rebar.config里指定vm.args路径:
    {relx, [{release, {your_app, "1.0.0"}, [{your_app, "1.0.0"}]},
            {vm_args, "./config/vm.args"}]}.
    
    然后在config/vm.args里加上:
    +S auto
    
    生成的release启动时就会自动加载这个配置,不用每次手动加参数。
3. 确保应用本身的并发设计到位

光调虚拟机参数还不够,你的应用代码得真的能把负载分散到多个进程里!比如:

  • 别让单个进程扛下所有CPU密集型任务,把大任务拆成多个小任务,用spawn、spawn_link或者OTP的gen_server、poolboy这类工具创建多个工作进程。
  • 利用Erlang的消息传递机制,让不同进程处理不同的工作单元,这样调度器才能把这些进程分配到不同的CPU核心上运行。
验证是否生效

启动应用后,你可以在Erlang shell里执行这个命令,查看当前在线的调度器数量:

erlang:system_info(schedulers_online).

返回的数字应该和你的CPU核心数一致。另外也可以用htop或者top这类系统工具,看看是不是所有核心的使用率都上来了。

内容的提问来源于stack exchange,提问作者Satya Budumuru

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:26:28