Lazy loaded image
Words 0Read Time 1 min
Invalid Date

核心判断

这套配置下,"数据可恢复"和"数据合并进主库"是两个不同的时间点,问"最长落盘时间"必须分清楚问的是哪个。直接给出三层答案:

一、关键参数解读

三个参数决定了三个不同的窗口:
参数
决定的是
影响
isolation_level=None
何时形成一个 commit
autocommit → 每条语句 1 个事务
synchronous=FULL
commit 时是否 fsync WAL
FULL → 每次 commit 都 fsync
wal_autocheckpoint=1000
WAL → 主 DB 何时合并
1000 页(默认 4KB/页 = 4MB)触发

二、三层"落盘时间"分别是多少

第 1 层:数据进入 WAL 文件并 fsync(= 掉电可恢复)

  • synchronous=FULL + autocommit → 每次 execute() 返回前都已经 fsync(WAL)
  • 最长延迟 ≈ 一次 fsync 的耗时
  • eMMC 上典型 fsync 耗时:5~50ms(工业级带 PLP),消费级 SD 可能飙到 100~500ms
  • 掉电安全性在这一层就已经建立:execute 返回 = 数据已在 NAND 上(或至少在 eMMC 的 PLP 受保护 cache 中)
这是 SQLite WAL 的核心承诺:commit 返回那一刻,数据是 durable 的。后续 checkpoint 不影响可恢复性,只影响"在哪里"。

第 2 层:数据从 WAL 合并到主 DB 文件

  • wal_autocheckpoint=1000 触发,默认是 PASSIVE checkpoint
  • 触发时机:WAL 累计写满 1000 帧时,下一次 commit 在 fsync 后顺手做一次 checkpoint
  • 时间上界:取决于写入速率
    • 写 1KB/次 × 4 帧/KB(取决于 page size)→ 大约几千次 commit 才触发
    • 慢速写入(比如 1 次/min)可能 几小时甚至几天都不 checkpoint
  • 这不是问题:WAL 在 commit 时已 fsync,checkpoint 只是"整理",不是"持久化"

第 3 层:eMMC 内部 cache → NAND cell

  • 即便 fsync 返回,数据 不一定真在 NAND cell 上,可能在 eMMC 控制器的 DRAM cache 里
  • 工业级 eMMC 带 PLP(Power Loss Protection) = 内部超级电容,掉电时把 cache flush 到 NAND,100~500μs 级
  • 消费级 eMMC / SD 卡 没有 PLP = fsync 返回但 cache 数据仍可能在掉电时丢
  • 这一层是硬件层,SQLite 管不到

三、最长不落盘时间的具体上界

场景
"落盘"定义
最长延迟
关键依赖
autocommit 单语句
WAL fsync 完成
5~50ms (工业 eMMC)
fsync 性能
显式事务(BEGINCOMMIT)
WAL fsync 完成
事务持续时间 + 一次 fsync
事务多长就多长
WAL → 主 DB 文件
主 .db 文件被更新
几分钟到几小时(取决于写入速率)
autocheckpoint 阈值
NAND cell 真落地
断电不丢
100μs~∞
是否有 PLP

四、实战中真正要担心的不是"延迟",而是这两个坑


五、一句话总结

这套配置下,单条 execute 的"最长不落盘时间"≈ 一次 fsync 耗时(工业 eMMC 约 5~50ms);WAL 合并回主库的延迟可达数小时,但与可恢复性无关;真正的"硬不可控延迟"在 eMMC 内部 cache,靠 PLP 解决,SQLite 管不到
如果场景是"必须 100ms 内绝对落到 NAND",答案是:单靠这套 SQLite 配置不够,必须叠加 工业级 eMMC + PLP + 文件系统 commit 间隔调小

上一篇
Data Structure and Algorithm
下一篇
用面试拷问嵌入式技术栈

Comments
Loading...