基于Node.js的ECS服务报错时占满6.8GB磁盘空间求助
解决ECS上Puppeteer触发磁盘暴增占满问题
核心排查方向
- 检查Puppeteer临时文件存储路径:Puppeteer默认会存放Chrome缓存、页面数据,若应用目录被设为临时存储路径,报错时可能未自动清理这些文件。
- 对比两台ECS的存储挂载配置:有问题的ECS可能未给临时目录配置tmpfs(内存挂载,重启自动清理),或应用目录挂载的磁盘分区容量过小;正常ECS可能已配置这类自动清理机制。
- 核查Puppeteer错误处理逻辑:报错时若未执行
browser.close()关闭浏览器实例,会导致Chrome进程残留,持续写入日志或缓存文件。 - 检查容器日志配置:若容器日志(如Docker的json-file日志)存储在应用目录,报错时大量日志输出会快速占满磁盘;正常ECS可能配置了日志轮转或外部存储。
具体解决步骤
强制指定Puppeteer临时目录到系统tmp分区
启动Puppeteer时显式设置缓存和用户数据目录到系统临时分区(通常/tmp会配置自动清理):let browser; try { browser = await puppeteer.launch({ args: [ '--disable-dev-shm-usage', // 规避/dev/shm空间限制,改用临时文件存储 '--disk-cache-dir=/tmp/chrome-cache', '--media-cache-dir=/tmp/chrome-cache' ], userDataDir: '/tmp/chrome-user-data' }); // 业务逻辑代码 } catch (err) { console.error('Puppeteer操作失败:', err); }确保报错时必清理浏览器实例
用try/finally包裹Puppeteer操作,保证无论是否报错都关闭浏览器:let browser; try { browser = await puppeteer.launch(/* 配置参数 */); // 页面操作逻辑 } catch (error) { console.error('页面操作报错:', error); } finally { if (browser) { await browser.close(); } }调整ECS/容器的存储挂载策略
- 给有问题的ECS添加
--tmpfs /tmp或--mount type=tmpfs,destination=/tmp的Docker运行参数,将临时目录挂载为内存文件系统,避免磁盘占用。 - 若应用目录挂载的磁盘容量有限,配置磁盘配额限制应用目录的最大使用空间。
- 给有问题的ECS添加
添加缓存和残留进程清理机制
在应用启动脚本或定时任务中添加清理逻辑:# 清理Chrome缓存和用户数据 rm -rf /tmp/chrome-cache/* /tmp/chrome-user-data/* # 杀死残留的Chrome进程 pkill -f chrome || true配置容器日志轮转
修改Docker的daemon.json文件,启用日志轮转限制:{ "log-driver": "json-file", "log-opts": { "max-size": "10m", "max-file": "3" } }
验证方案
- 在有问题的ECS上部署修改后的代码,触发报错场景,实时监控磁盘使用情况,确认不再出现暴增。
- 统一两台ECS的挂载配置和Docker参数后,重复测试报错场景,验证一致性。
内容的提问来源于stack exchange,提问作者Nayem Ahmed
相关产品推荐
相关产品推荐

