Chrome Node在tmp目录创建大量文件夹致Docker内存占用过高,如何解决?
我有一个包含5个Docker容器的多模块项目,在业务流程(非测试场景)中使用Selenium Hub 4.3和Chrome Node 4.3进行截图操作。目前遇到的问题是Chrome Node会在tmp目录创建大量文件夹,导致Docker容器内存过度占用。
Docker容器配置
selenium_hub: image: selenium/hub:4.3 ports: - "4444:4444" networks: - selenium chrome: image: selenium/node-chrome:4.3 shm_size: '2gb' depends_on: - selenium_hub environment: - HUB_HOST=selenium_hub - SE_EVENT_BUS_HOST=selenium_hub - SE_EVENT_BUS_PUBLISH_PORT=4442 - SE_EVENT_BUS_SUBSCRIBE_PORT=4443 - SE_NODE_MAX_SESSIONS=2 networks: - selenium
截图方法精简代码
public ImageDto getScreenshot() { DesiredCapabilities dc = new DesiredCapabilities(); ChromeOptions chromeOptions = new ChromeOptions(); chromeOptions.addArguments("--headless"); chromeOptions.addArguments("--no-sandbox"); chromeOptions.addArguments("--disable-dev-shm-usage"); dc.merge(chromeOptions); if (chromeDriver == null || chromeDriver.getSessionId() == null) chromeDriver = new RemoteWebDriver(new URL(seleniumHubUrl), dc); WebElement widgetElement = chromeDriver.findElement(By.className(widget.getWidgetDivClassname())); File screenshot = ((TakesScreenshot) chromeDriver).getScreenshotAs(OutputType.FILE); BufferedImage f = ImageIO.read(screenshot); if (chromeDriver != null) { chromeDriver.manage().deleteAllCookies(); } } @Scheduled(cron = "0 0 0 * * *", zone = NEW_YORK_ZONE_NAME) public void recreateTwitterLoggersForNewDayScheduledJob() throws IOException { FileUtils.deleteDirectory(new File(folderName)); folderName = createFolderForScreenshots(); if (chromeDriver != null) { chromeDriver.manage().deleteAllCookies(); chromeDriver.close(); chromeDriver.quit(); } }
我尝试过在每次截图后关闭并quit WebDriver,但问题仍未解决。请问如何防止Chrome Node出现内存泄漏?
彻底清理单次会话资源,不复用Driver实例
当前代码仅在每日定时任务中清理Driver,单次截图后的临时文件仍会积累。修改getScreenshot方法,每次截图创建新Driver实例,并在操作完成后立即销毁:public ImageDto getScreenshot() { DesiredCapabilities dc = new DesiredCapabilities(); ChromeOptions chromeOptions = new ChromeOptions(); chromeOptions.addArguments("--headless"); chromeOptions.addArguments("--no-sandbox"); chromeOptions.addArguments("--disable-dev-shm-usage"); dc.merge(chromeOptions); RemoteWebDriver chromeDriver = null; try { chromeDriver = new RemoteWebDriver(new URL(seleniumHubUrl), dc); WebElement widgetElement = chromeDriver.findElement(By.className(widget.getWidgetDivClassname())); File screenshot = ((TakesScreenshot) chromeDriver).getScreenshotAs(OutputType.FILE); BufferedImage f = ImageIO.read(screenshot); // 处理截图并返回ImageDto } finally { if (chromeDriver != null) { chromeDriver.manage().deleteAllCookies(); chromeDriver.quit(); } } }用finally块确保无论操作是否成功,Driver都会被彻底退出,避免会话残留。
为Chrome添加临时文件清理策略
在ChromeOptions中指定临时目录并禁用缓存,减少临时文件生成:chromeOptions.addArguments("--temp-dir=/tmp/chrome-temp"); chromeOptions.addArguments("--disk-cache-size=0"); chromeOptions.addArguments("--media-cache-size=0");同时在Chrome Node容器中添加定时清理任务,在docker-compose配置中修改command:
chrome: # 其他配置不变 command: bash -c "echo '*/30 * * * * rm -rf /tmp/.org.chromium.Chromium*' | crontab - && /opt/bin/start-node.sh"每30分钟清理一次Chrome生成的临时文件夹。
升级Selenium和Chrome版本
4.3版本存在已知的资源泄漏bug,升级到Selenium 4.10+及对应版本的Chrome Node镜像,官方已修复大量内存管理问题。配置容器级资源限制与临时目录优化
在docker-compose中为Chrome Node添加内存限制,并挂载tmpfs作为临时目录,利用内存文件系统自动清理临时文件:chrome: # 其他配置不变 deploy: resources: limits: memory: 3gb tmpfs: - /tmp:rw,noexec,nosuidtmpfs挂载的目录会在容器重启时自动清空,同时减少磁盘IO占用。配置Selenium Hub会话超时
在Selenium Hub的环境变量中添加会话超时设置,自动回收闲置会话:selenium_hub: # 其他配置不变 environment: - SE_SESSION_TIMEOUT=300设置为300秒,即闲置5分钟的会话会被Hub自动清理。
内容的提问来源于stack exchange,提问作者Daryna

