AWS ECS Fargate Task中EFS挂载运行数分钟后无响应问题咨询
根因定位
该故障由NFS闲置连接回收导致:Fargate默认挂载EFS时使用NFS 4.1协议,若业务逻辑长时间无EFS读写操作,VPC连接跟踪、安全组或NAT网关会将超过闲置阈值的NFS连接主动回收,而NFS客户端默认启用硬挂载(hard)选项,触发IO操作时会无限重试无报错,加上Node.js同步fsAPI没有内置超时机制,最终表现为fs.existsSync(pathInEfs)永久阻塞。
解决方案
- 调整EFS挂载参数:在ECS任务定义的EFS挂载配置中新增以下挂载选项:
soft,timeo=600,retrans=2,tcp_keepalive_time=300。软挂载(soft)会在IO超时后返回错误而非无限阻塞,timeo=600设置单次IO超时为60秒,TCP保活参数会定期发送心跳避免连接被回收。如果业务需要强数据一致性不允许软挂载,可保留hard选项并添加intr参数允许手动中断阻塞的IO请求。 - 新增EFS保活逻辑:在业务处理(C++计算/休眠)的并行线程中,每隔30秒对EFS路径执行一次轻量操作,比如调用
fs.writeFileSync('/efs/.keepalive', Date.now())后立即删除,主动维持NFS连接活跃。 - 优化IO调用逻辑:将同步IO接口替换为带超时控制的异步实现,比如用
Promise.race封装fs.promises.access,手动设置10秒超时,避免单步IO故障卡住整个业务流程。 - 调整VPC网络配置:确认挂载EFS的Fargate任务所在安全组的出站规则对EFS的2049端口允许所有时段访问,若使用NAT网关访问跨VPC EFS,可将NAT网关的TCP连接跟踪超时阈值调整到3600秒以上。
验证方法
首先修改任务挂载参数后启动测试任务,仅执行30分钟休眠后访问EFS,确认fs.existsSync不会再出现阻塞问题,同时观测EFS监控面板的客户端连接指标,确认任务运行全程连接不会提前中断。
内容的提问来源于stack exchange,提问作者Bapt
相关产品推荐
相关产品推荐

