Ubuntu虚拟机重复运行h2o.automl触发getaddrinfo CURL连接错误求助
报错原因排查与修复方案
关于是否为VirtualBox拦截的验证
该问题有小概率由VirtualBox的网络限制触发,可通过以下步骤排除:
- 报错发生时,直接在虚拟机终端执行
curl http://localhost:54321,如果也返回相同的getaddrinfo()相关错误,说明问题出在虚拟机内部的系统资源限制,和VirtualBox拦截无关;如果只有R调用H2O时报错、直接访问端口正常,再排查VirtualBox配置。 - 检查VirtualBox的虚拟机网卡设置:如果H2O绑定的是非localhost的公网/宿主机网段IP,查看是否开启了端口拦截、流量限制类的增强功能,临时关闭后测试是否还能复现报错。
高概率根因及修复方案
你遇到的getaddrinfo() thread failed to start报错本质是H2O运行过程中耗尽了虚拟机进程可申请的系统资源(线程数、文件句柄数),和内存占用无关,是Ubuntu 20.04默认资源限制偏低导致的常见问题,可按以下步骤修复:
1. 调高系统资源限制
Ubuntu默认的单进程最大文件打开数、最大线程数配置仅为1024,H2O多次运行AutoML后会占满资源,无法启动新的域名解析线程:
- 编辑
/etc/security/limits.conf,末尾添加以下配置:
* soft nofile 65535 * hard nofile 65535 * soft nproc 65535 * hard nproc 65535
- 分别编辑
/etc/systemd/user.conf和/etc/systemd/system.conf,修改或添加以下两行:
DefaultLimitNOFILE=65535 DefaultLimitNPROC=65535
- 重启虚拟机后执行
ulimit -n和ulimit -u,确认返回值为65535即生效。
2. 调整H2O调用配置
- 启动H2O时指定绑定IP为
127.0.0.1,跳过localhost的域名解析步骤:
h2o.init(ip = "127.0.0.1", port = 54321)
- 每次执行完
h2o.automl后,除了已有h2o.removeAll()和gc(),额外添加一行清空H2O内部缓存连接的语句:
h2o.api("GET /3/NodePersistentCache/clear")
3. 修复libcurl版本兼容问题
Ubuntu 20.04自带的libcurl版本存在并发请求下的线程泄漏bug,会加剧资源消耗,可升级修复:
- 执行系统命令升级libcurl:
sudo apt update && sudo apt install -y libcurl4 libcurl4-openssl-dev
- 重启R后重新编译安装curl包:
install.packages("curl", type = "source")
效果验证
调整完成后连续运行20次以上h2o.automl,如果不再触发报错说明问题解决。如果仍有异常,可查看h2o.init()输出的临时日志目录中的JVM运行日志,进一步定位具体崩溃原因。
内容的提问来源于stack exchange,提问作者jjhold
相关产品推荐
相关产品推荐

