如何让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里加上:
生成的release启动时就会自动加载这个配置,不用每次手动加参数。+S auto
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
相关产品推荐
相关产品推荐

