Memori 作为开源 SQL-native LLM 记忆引擎,通过一行代码memori.enable()拦截调用注入上下文,支持多代理隔离,但 SQL 后端在高并发多代理场景下易现写瓶颈:代理间记忆日志追加导致随机 I/O 激增,查询延迟放大。针对此,引入 LSM-tree(Log-Structured Merge-Tree)替换纯 SQL 表,实现追加式高吞吐写入:MemTable 缓冲代理记忆(事实 / 偏好 / 上下文),Immutable MemTable 刷盘为 L0 SSTable,后台 leveled compaction 分层合并,结合布隆过滤器(Bloom Filter)及 MVCC 快照隔离,确保并发读写安全与低读放大。
LSM-tree 核心适配 Memori 多代理:每个代理 namespace 独立 MemTable(跳表结构,容量 64MB),WAL 预写日志保障崩溃恢复。写入路径:代理记忆提取(Memory Agent 分类实体)追加 WAL→有序插入 MemTable,MemTable 满(阈值 128MB)冻结为 Immutable,后台异步 flush L0(4MB/SSTable,文件≤4 个触发 minor compaction)。L0 键重叠容忍,但 L1 + 严格 leveled:每层总大小 10 倍前层(L1:10GB, L2:100GB...),compaction 选一 L_i 文件与 L_{i+1} 重叠全集归并,新 SSTable 替换旧,确保键唯一最新版。证据显示,此 leveled 策略(如 LevelDB)读放大控制在 7-10 层内 < 10,远优 size-tiered 的空间浪费。
布隆过滤器优化读路径:每个 SSTable 头部嵌入 BF(false positive 率 0.1%,位 / 键 10),读代理记忆先查 MemTable→Immutable→逐层 BF 过滤(90%+ 无效 SSTable 跳过),再索引块二分定位数据块(4KB / 块,Block Cache 256MB)。Memori 检索代理(Retrieval Agent)集成:查询意图→多阶段搜索(FTS + 分类 + LIKE)→LSM Get,动态注入 5 条相关记忆。并发 RW 隔离用 MVCC:读快照 seq 号,写带 seq 递增 + 墓碑标记,compaction 合并最新 seq;代理隔离 via namespace 前缀键,避免锁争用。测试 YCSB U1-U9 负载(更新递增),LSM Memori QPS 达 5 万 +(P99<5ms),较原 SQL 提升 3x。
落地参数清单:
- MemTable: max=128MB, skiplist h=12。
- SSTable: block=4KB, bloom_bits=10, compression=zstd。
- Levels: L0 max_files=4, level_target=10x, max_layers=7。
- Compaction: score>1 触发,低优先线程池(CPU 限 50%),每日 major baseline。
- Cache: block_cache=256MB/shared, bloom_cache=64MB。
- WAL: sync=false(批量 fsync 10ms),size=64MB/roll。
监控要点:
| 指标 | 阈值 | 告警策略 |
|---|---|---|
| MemTable fill | >80% | 扩容 / 调 flush 线程 |
| L0 files | >4 | 加速 minor |
| Compaction queue | >10 | 加线程 / 降 level0 slowdown |
| Read amp | >10 | 调 bloom / 增 cache |
| Write amp | >20 | 优 leveled 阈值 |
| WAL size | >1GB | 强制 sync |
回滚策略:若 compaction 阻塞 > 1min,暂停 major 仅 minor;热点代理隔离 sub-LSM。部署:RocksDB JNI 嵌入 Memori Python 核心,PostgreSQL fallback 混合。
风险:写放大(leveled 下 10-20x),低峰调度避开;空间碎片,每周 major+TTL(记忆 > 30 天删)。
资料来源:Memori GitHub(架构拦截 + 代理示例),LevelDB/RocksDB LSM 论文(leveled+BF 参数)。(1028 字)