You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,nosuid
    

    tmpfs挂载的目录会在容器重启时自动清空,同时减少磁盘IO占用。

  • 配置Selenium Hub会话超时
    在Selenium Hub的环境变量中添加会话超时设置,自动回收闲置会话:

    selenium_hub:
      # 其他配置不变
      environment:
        - SE_SESSION_TIMEOUT=300
    

    设置为300秒,即闲置5分钟的会话会被Hub自动清理。


内容的提问来源于stack exchange,提问作者Daryna

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 18:15:49