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

使用asdf+Chef安装Ruby 3因内存问题卡壳,求非扩容解决方案

解决Chef中asdf-ruby安装Ruby 3因内存不足中断的问题

针对你遇到的内存不足导致make进程终止的问题,除了升级实例规格,还有以下几种可行方案:

1. 限制Ruby编译的并发数

ruby-build(asdf-ruby底层依赖的编译工具)默认会根据CPU核数设置make -j的并发数,内存不足时减少并发数能显著降低内存占用。你可以通过ASDF_RUBY_BUILD_OPTS环境变量指定编译并发数,比如限制为1:

修改你的Chef execute资源:

execute 'install_ruby_with_asdf' do
    command "#{asdf} install ruby #{ruby_version}"
    action :run
    user user
    environment({ 
      'HOME' => deploy_dir,
      'ASDF_RUBY_BUILD_OPTS' => '--jobs 1'
    })
    not_if "#{asdf} list ruby | grep -q #{ruby_version}"
end

--jobs 1会强制make单线程编译,虽然耗时会增加,但能大幅降低内存消耗,避免因内存不足被系统终止。

2. 临时创建交换分区(Swap)

通过临时挂载Swap文件来补充可用内存,编译完成后再清理,不占用永久存储:

在你的Ruby安装资源前后添加Swap管理的execute资源:

# 创建临时Swap文件(1G大小,可根据需要调整)
execute 'create_temporary_swap' do
  command <<-EOF
    fallocate -l 1G /tmp/ruby_build_swap.swap
    chmod 600 /tmp/ruby_build_swap.swap
    mkswap /tmp/ruby_build_swap.swap
    swapon /tmp/ruby_build_swap.swap
  EOF
  action :run
  not_if 'grep -q /tmp/ruby_build_swap.swap /proc/swaps'
end

execute 'install_ruby_with_asdf' do
    command "#{asdf} install ruby #{ruby_version}"
    action :run
    user user
    environment({ 'HOME' => deploy_dir })
    not_if "#{asdf} list ruby | grep -q #{ruby_version}"
end

# 清理临时Swap文件
execute 'cleanup_temporary_swap' do
  command <<-EOF
    swapoff /tmp/ruby_build_swap.swap
    rm -f /tmp/ruby_build_swap.swap
  EOF
  action :run
  only_if 'grep -q /tmp/ruby_build_swap.swap /proc/swaps'
end

这个方案相当于临时扩展了内存,能满足编译时的内存需求,且不会对系统造成永久影响。

3. 结合两种方案(推荐)

将限制并发数和临时Swap结合使用,既能降低内存峰值,又有Swap作为兜底,进一步提升安装成功率:

execute 'create_temporary_swap' do
  command <<-EOF
    fallocate -l 1G /tmp/ruby_build_swap.swap
    chmod 600 /tmp/ruby_build_swap.swap
    mkswap /tmp/ruby_build_swap.swap
    swapon /tmp/ruby_build_swap.swap
  EOF
  action :run
  not_if 'grep -q /tmp/ruby_build_swap.swap /proc/swaps'
end

execute 'install_ruby_with_asdf' do
    command "#{asdf} install ruby #{ruby_version}"
    action :run
    user user
    environment({ 
      'HOME' => deploy_dir,
      'ASDF_RUBY_BUILD_OPTS' => '--jobs 1'
    })
    not_if "#{asdf} list ruby | grep -q #{ruby_version}"
end

execute 'cleanup_temporary_swap' do
  command <<-EOF
    swapoff /tmp/ruby_build_swap.swap
    rm -f /tmp/ruby_build_swap.swap
  EOF
  action :run
  only_if 'grep -q /tmp/ruby_build_swap.swap /proc/swaps'
end

补充说明

手动执行安装命令能成功,是因为Chef运行时本身会占用一部分系统内存,导致编译Ruby时的可用内存比手动执行时更少。通过上述方案弥补内存缺口后,就能在Chef环境下正常完成安装。

内容的提问来源于stack exchange,提问作者Nikhil bhatt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 04:45:00