SUCC daemon.log 撑爆磁盘崩溃循环
当 embedding 模型下载失败后,watch 模式反复索引、反复写同一条错误,日志本身会触发下一轮索引。结果是 daemon.log 变成几百 GB,SQLite WAL 和锁文件也写不进去,看门狗重启后继续把磁盘打满。
SafeDisk Deep Cleanup
先止血,再决定哪些文件可以删。
如果日志、模型缓存、SQLite WAL 和项目目录混在一起,先保留证据并隔离日志洪水;需要人工判断时再用 $29 Deep Cleanup。
先打断循环,不要先删库
- 先停 SUCC daemon 或 watch 保活进程,避免清理期间继续写入同一个
daemon.log。 - 保存首尾少量日志:最早的 embedding fetch 失败和最近的 ENOSPC/WAL/lock 报错,比整份 281GB 日志更有价值。
- 把超大日志改名或移走,让 daemon 重新创建新日志;不要在进程仍持有文件句柄时直接删除。
- 把日志目录排除在 watch/index 范围之外,否则“写日志 -> 触发索引 -> 写更多日志”还会复发。
- 对 embedding 加熔断:连续失败后冷却 5-15 分钟,只记录一次聚合错误,并暂停索引重试。
- 对日志加硬上限:单文件大小、保留数量、同类错误每分钟最大行数,以及磁盘剩余空间低于阈值时停止写 DEBUG/ERROR 明细。
Windows 现场证据
把 <SUCC_DATA_DIR> 换成实际保存 daemon.log、SQLite 和缓存的目录。先读取元数据和少量首尾内容,避免打开几百 GB 文件。
$root = "<SUCC_DATA_DIR>"
Get-PSDrive -PSProvider FileSystem | Sort-Object Free -Descending
Get-ChildItem $root -Recurse -File -ErrorAction SilentlyContinue |
Sort-Object Length -Descending |
Select-Object -First 30 FullName,Length,LastWriteTime
Get-Content "$root\daemon.log" -Head 80 -ErrorAction SilentlyContinue
Get-Content "$root\daemon.log" -Tail 120 -ErrorAction SilentlyContinue
Get-ChildItem $root -Recurse -File -Include "*.sqlite","*.sqlite-wal","*.db","*.db-wal","*.lock" -ErrorAction SilentlyContinue |
Select-Object FullName,Length,LastWriteTime
修复验收标准
- embedding 模型下载失败被归类为可重试但需要冷却的错误,不会在每个文件变更事件里立刻重新下载。
- 相同错误在 5 分钟内只写一条完整日志,后续只增加计数,例如
repeated=1842。 daemon.log有 max size 和保留数量,轮转发生在下一次写入之前。- 日志目录、SQLite WAL、锁文件和临时模型文件不会被 watch/indexer 当成普通内容再次索引。
- 磁盘剩余空间低于安全阈值时,daemon 进入 degraded 状态:暂停索引和模型下载,只保留一条告警。
- 看门狗区分配置/网络/磁盘类 fatal 状态和可恢复崩溃,避免 1 秒多次重启。
Copy-ready GitHub reply
适合贴到 SUCC daemon.log 撑爆磁盘 issue。
这段回复把问题拆成止血、证据、产品修复和回归测试四块。
我会把这个当成“日志写入触发索引,再由索引失败写更多日志”的递归故障处理。修复点不只是轮转 daemon.log,还要让 embedding 下载失败进入熔断状态。
建议验收标准:
1. SUCC 的日志目录、SQLite WAL、lock、临时模型文件不进入 watch/index 范围。
2. Xenova/all-MiniLM-L6-v2 fetch failed 连续失败后进入冷却,比如 5-15 分钟,只写一条聚合日志 repeated=N。
3. daemon.log 在写入前检查 max size/保留数量,超过阈值先轮转;磁盘低水位时停止写详细 ERROR 明细。
4. 磁盘低水位或 WAL/lock ENOSPC 时 daemon 进入 degraded:暂停索引和模型下载,保留一条告警,不让看门狗马上高频重启。
5. 回归测试覆盖:断网 + watch 模式 + 日志目录在工作区内,运行 10 分钟后 daemon.log 增长量有上限,且不会再触发 SQLite WAL/lock 写失败。
不要先动这些
- 不要在 daemon 运行时删除正在写入的巨型日志;Windows 可能失败,Linux/macOS 还可能留下 deleted-open-inode 占用。
- 不要直接删 SQLite 主库、WAL 或 lock 文件来“释放空间”;先停进程并备份元数据。
- 不要清空整个模型缓存目录,除非确认没有正在下载的 partial 文件和团队共享权重。
- 不要只调高磁盘容量。没有熔断和轮转,281GB 只是下一次会变成更大的数。
Deep Cleanup
需要人帮你判断哪些能删?
提交一次请求。可以贴日志路径、最大文件列表、磁盘剩余空间,或浏览器扫描摘要;我们会区分 safe、review-first 和 do-not-touch。