{
title: "Codex日志Bug一年写穿1TB固态硬盘",
summary: "OpenAI的编程工具Codex因一个默认日志配置bug,导致SQLite数据库在21天内写入37TB数据,预计一年可达640TB,足以耗尽主流消费级固态硬盘的寿命。问题根源在于一行Level::TRACE默认配置,将调试日志无限制写入,且用户无法通过环境变量关闭。该bug在GitHub上被标记为‘劣质软件’,引发开发者对闭源工具透明度的担忧。",
content: "你的固态硬盘可能在不知不觉中被你的AI编程助手‘吃掉’。OpenAI的旗舰工具Codex因一个SQLite日志bug,能在一年内写入640TB数据,直接烧穿一块总写入量600TB的消费级固态硬盘。这不是理论推演,而是一位开发者实测的结果:他的机器连续开机21天,主硬盘被写掉37TB,照此推算,一年就是640TB。这个在GitHub上编号#28224的issue,被Hacker News高赞评论定性为‘劣质软件(slopware)最臭名昭著的例子之一’。\n\n问题出在Codex本地维护的一个SQLite数据库logs_2.sqlite,专门记录反馈日志。开发者抓取15秒的数据发现,数据库被插入36211行,但保留的总行数始终是681774,一个没多。每插入一行,就有一行被删除,行数不变,磁盘却被反复擦写数万次。这种‘insert-and-prune’机制导致日志里的自增ID超过55亿,而真正留存的行只有约50万,两者差了一万倍。更荒诞的是,记录的日志内容多是文件系统的inotify事件,比如ld.so.cache被记了128764次,locale.alias被记37982次,同一个文件反复记录十几万遍。\n\n根因是Codex源码中的一行配置:SQLite反馈日志的sink初始化时用了Targets::new().with_default(Level::TRACE),将日志默认开到最高级别TRACE。用户尝试通过RUST_LOG环境变量调低日志级别,但无效,因为with_default(Level::TRACE)覆盖了全局默认。这个bug从今年4月起就有零星反馈,拖了两个多月才被重视,直到用户自行测算并提交报告登上Hacker News头条。即便修复后,也只砍掉了约85%的日志写入。\n\n这个事件暴露了闭源工具的一个深层问题:用户无法自行修改或审查代码。有开发者想自己动手修复,却发现桌面端是闭源的,无从下手。Hacker News评论区有人讽刺道:‘审查流程怎么没拦住这么明显的错误?哦对了……审查一下这个。’对于AI从业者来说,这是一个警示:在使用闭源AI工具时,需关注其对本地资源的消耗,尤其是固态硬盘这类有寿命限制的硬件。定期检查SMART健康计数,或许是避免硬盘被‘静默吃掉’的唯一办法。"