使用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
相关产品推荐
相关产品推荐

