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字)