Skip to content

nodriver 模式浏览器启动重试导致 Chrome 进程堆积与临时 profile 泄漏 #157

Description

@Leslielu

问题描述

使用 captcha_method = "personal"(nodriver 模式)时,浏览器启动失败后的重试机制会不断创建新的 Chrome 进程和临时 profile 目录,但旧进程不会被清理,导致进程和磁盘空间持续增长。

复现场景

远端 Mac 上观察到:

  • 11 个不同的 Chrome profile 同时运行(launch_retry_profile_*fresh_browser_profile_*
  • 每个 profile 约 6 个进程,共 66 个 Chrome 进程
  • src/tmp/ 目录下累积了 28,931 个临时 profile 目录,占用 167MB
  • 正常应该只有 1 个 browser_data_nodriver 主 profile

日志证据

浏览器启动不断重试,每次失败都创建新 profile:

09:10 - launch_retry_profile_b929umsk → 失败 → 创建 launch_retry_profile_ukiz78yr
10:00 - launch_retry_profile_ukiz78yr → 失败 → 创建 launch_retry_profile_3jwj2a7n
11:10 - launch_retry_profile_3jwj2a7n → 失败 → 创建 launch_retry_profile_z4k6pgfh

每次重试都 spawn 新 Chrome 进程,旧的未被杀掉,形成进程堆积。

根因分析

  1. _is_retryable_browser_launch_error() 检测到启动失败后,创建新 launch_retry_profile_* 目录重试
  2. 重试时没有杀掉上一次的 Chrome 进程,旧进程继续运行
  3. 临时 profile 清理依赖 6 小时 TTL(PERSONAL_RUNTIME_PROFILE_STALE_TTL_SECONDS),清理不及时
  4. 形成雪球效应:越多失败 → 越多进程 → 资源越紧张 → 更多失败

建议修复

  1. 在创建新 retry profile 前,先杀掉当前 browser 对象关联的 Chrome 进程
  2. 降低临时 profile 清理 TTL,或在重试时同步清理上一次的 profile
  3. 限制最大重试次数或最大并发 Chrome 实例数

环境

  • macOS (远端 Mac mini, headed 模式)
  • captcha_method = "personal"
  • nodriver 模式
  • Chrome 148.0.7778.x

临时解决方案

手动清理:

# 清理残留 Chrome 进程
pkill -9 -f 'Google Chrome'

# 清理临时 profile 目录
rm -rf ~/Prog/flow2api/src/tmp/launch_retry_* ~/Prog/flow2api/src/tmp/fresh_browser_*

# 重启服务

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions