AWS EC2(Elastic Beanstalk)上Ethers.js tx.wait()几小时后阻塞问题
排查思路与解决方案
1. 优化Ethers.js Provider的连接策略
- 长时间运行后,默认Provider可能因连接超时、重连机制缺失导致半开连接,无法接收链上回执。手动配置Provider的超时与重连参数:
const provider = new ethers.providers.JsonRpcProvider(YOUR_RPC_URL, { timeout: 30000, // 设置30秒超时 retryCount: 5, retryDelay: 1000 }); - 监听Provider的
error事件,出现异常时自动重建连接;或定期重置Provider实例(比如每2小时),避免长期复用单一连接。
2. 排查EC2实例的网络资源限制
- 用
netstat -an | grep ESTABLISHED | wc -l命令查看当前TCP连接数,对比t3.medium实例的连接数上限,避免耗尽出站连接导致无法与RPC节点通信。 - 检查EB负载均衡(ELB)的空闲连接超时配置(默认60秒),若Provider长连接超过该时长会被强制断开,需调整ELB超时或在代码中设置连接保活机制。
3. 监控实例资源占用情况
- 用
top或htop定期查看CPU、内存占用,排查Node.js内存泄漏问题(可配合node --inspect和Chrome DevTools分析)。 - 检查系统日志
/var/log/messages和应用日志/var/log/nodejs/nodejs.log,确认是否有OOM killer触发、内存不足的记录。
4. 增强RPC节点的可靠性
- 切换到备用RPC节点测试,或配置多节点轮询机制,避免单一节点限流/故障导致
tx.wait()停滞。 - 为
tx.wait()添加超时包装,防止无限等待:const waitWithTimeout = (promise, timeoutMs) => { return Promise.race([ promise, new Promise((_, reject) => setTimeout(() => reject(new Error('Wait timeout')), timeoutMs)) ]); }; // 调用示例 try { receipt = await waitWithTimeout(tx.wait(), 60000); // 60秒超时 } catch (err) { console.error('交易回执等待超时:', err); // 可在此处补充重新查询交易状态的逻辑 }
5. 调整EB应用服务器配置
- 若使用PM2等进程管理器,配置内存阈值触发自动重启,避免内存泄漏积累导致事件循环阻塞。
- 检查EB环境变量,确认
NODE_ENV等参数是否影响Node.js的网络或运行机制,比如production环境下的默认连接池配置差异。
内容的提问来源于stack exchange,提问作者toofun
相关产品推荐
相关产品推荐

