为什么 Immich 将 OCR 并发设为 2 也会崩?低性能 CPU 的救命稻草。
很多开发者在配置 Immich 的机器学习功能时,看到官方默认的 OCR_CONCURRENCY(文字识别并发数)只有 2,心里难免会想:我的 NAS 好歹也是个四核,区区 2 个并发难道还跑不动?于是直接维持原样甚至调高。
结果,当系统扫描到包含大量文字的照片(如笔记、书稿)时,你会发现 immich_machine_learning 容器的内存占用曲线像火箭一样直插云霄,紧接着就是整个系统的死机。作为一名处理过海量多媒体数据的架构师,我必须告诉你:在 OCR 面前,“并发 2”并不代表轻量,它极可能是压死你低功耗 CPU 的最后一根稻草。
💡 报错现象总结:当 OCR 任务开启后,后台日志显示
[Nest] 7 - DEBUG [Microservices:QueueService] 设置 OCR 并发数为 2。随后 CPU 占用率瞬间锁定在 100%,系统内存耗尽(OOM),后台抛出worker pool error: process exited with code 137(典型的内存溢出退出)。
OCR 的算力黑洞:为什么 2 个并发能吃掉所有内存?
Immich 的 OCR 功能底层依赖于 Tesseract 或类似的深度学习库。与简单的图片缩略图生成不同,OCR 需要将图片转换成高维张量(Tensor),并调用 CPU 的神经网络指令集进行高密度的矩阵运算。
根据社区高赞 Issue 的技术复盘,每一路 OCR 并发不仅会占用一个物理核心,还会根据图片分辨率申请巨大的内存缓冲区。如果你在只有 4G 或 8G 内存的 NAS 上运行,两个并发的 OCR 任务再加上系统本身的微服务开销,足以触发 OOM 机制。
# 案发现场:典型的内存溢出崩溃日志
immich_machine_learning | [04/28 11:47:39] INFO: Loading OCR engine...
immich_machine_learning | [04/28 11:47:45] ERROR: Memory allocation failed for tensor processing.
immich_machine_learning | [04/28 11:47:46] CRITICAL: Worker lost! (OOM Killer triggered)
在不同档位的硬件上,OCR 并发的稳定性反馈如下:
| CPU 类型 | 推荐并发数 | 预期表现 | 架构师底层诊断 |
|---|---|---|---|
| ARM (树莓派/RK3588) | 0 或外部调用 | 极易导致核心过热死机 | 浮点运算能力不足以支撑本地 OCR 并发 |
| J4125 / N100 | 1 | 稳定但缓慢 | 缓存(L3 Cache)太小,双并发会产生严重的内存竞争 |
| Intel i5 / i7 (12代后) | 2 | 流畅 | 拥有足够的指令集带宽和多通道内存支持 |
| 企业级 Xeon / EPYC | 5+ | 飞速 | I/O 和算力完全匹配,适合百万级图库 |
给低功耗 CPU 降压的“原生态”方案
如果你手头是 N5105 或 J4125 这类常见的 NAS 神机,面对 OCR 导致的崩溃,你不得不进行以下手动干预:
- 强行限制单并发:在
.env中明确设置IMMICH_OCR_CONCURRENCY=1。虽然速度减半,但至少系统不会在深夜悄悄重启。 - 设置 Swap 交换分区:对于内存小于 8G 的设备,你需要手动给 Linux 挂载一个 4G 以上的 Swap 文件。这能作为 OCR 处理超大图片的“避风港”,防止应用直接被杀掉。
- 禁用大图识别:如果你不依赖搜索照片里的文字,直接在管理后台的“机器学习设置”中关闭 OCR 选项。这能为相册浏览释放出大量的 CPU 余量。
这种“笨办法”虽然让 AI 功能看起来不再那么“全能”,但在硬件资源极其有限的 NAS 环境下,生存远比炫技重要。
获取“低功耗设备专用 OCR 配置文件”
与其让你的 NAS 在不断的崩溃与重启中折磨硬盘,不如直接接入社区优化后的“轻量级”配置。
我已经针对低功耗设备,在 GitCode 维护了一套**《Immich 低功耗硬件 OCR 专项优化包》**。这套配置包含了一组预设的内存限制参数和专门调优过的 Tesseract 运行时配置,能显著降低 OCR 过程中的峰值内存占用。
直接前往 GitCode 访问这个优化包。别让一个默认的“并发 2”参数毁了你的私有云体验,用最克制的配置,换取最稳健的服务。
[获取 GitCode 优化的低功耗设备专用 OCR 配置文件]
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust088- DDeepSeek-V4-ProDeepSeek-V4-Pro(总参数 1.6 万亿,激活 49B)面向复杂推理和高级编程任务,在代码竞赛、数学推理、Agent 工作流等场景表现优异,性能接近国际前沿闭源模型。Python00
MiniMax-M2.7MiniMax-M2.7 是我们首个深度参与自身进化过程的模型。M2.7 具备构建复杂智能体应用框架的能力,能够借助智能体团队、复杂技能以及动态工具搜索,完成高度精细的生产力任务。Python00
GLM-5.1GLM-5.1是智谱迄今最智能的旗舰模型,也是目前全球最强的开源模型。GLM-5.1大大提高了代码能力,在完成长程任务方面提升尤为显著。和此前分钟级交互的模型不同,它能够在一次任务中独立、持续工作超过8小时,期间自主规划、执行、自我进化,最终交付完整的工程级成果。Jinja00
Kimi-K2.6Kimi K2.6 是一款开源的原生多模态智能体模型,在长程编码、编码驱动设计、主动自主执行以及群体任务编排等实用能力方面实现了显著提升。Python00
Hy3-previewHy3 preview 是由腾讯混元团队研发的2950亿参数混合专家(Mixture-of-Experts, MoE)模型,包含210亿激活参数和38亿MTP层参数。Hy3 preview是在我们重构的基础设施上训练的首款模型,也是目前发布的性能最强的模型。该模型在复杂推理、指令遵循、上下文学习、代码生成及智能体任务等方面均实现了显著提升。Python00