Meilisearch 速度太慢

这篇文章主要讨论了 Meilisearch 文档索引器的优缺点及解决方案,包含以下主要内容:

  • 当前情况:Meilisearch 是 GitHub 上第二受关注的搜索引擎,具有高效的当前索引引擎,能在约 20 小时内为高 CPU 机器索引 2.5 亿个文档,但仍有改进空间,客户常需索引数亿文档并频繁更新,如一个客户有超 3.11 亿文档且每周增长约 1000 万。

    • 历史回顾:不到一年前引入差异索引,1.6 版本后索引管道更高效,减少了 LMDB 中的操作次数,但仍存在一些问题,如 LMDB 存在可见碎片、单次写事务、非对齐值字节等缺点。
    • 应对 OOM 的磁盘索引器:将索引系统改为基于块的,减少内存使用,但存在提取器依赖导致的临时文件过多和文件系统缓存压力等问题。
  • 新技术与技巧

    • 并行读写:LMDB 允许在写事务时并行读,可用于并行执行合并操作,提升性能,但要注意对写吞吐量的影响。
    • 停止重排序设置更新与文档更新:当前引擎处理设置和文档更新的顺序影响性能,应在单个写事务中处理。
    • 并行读取未提交更改:利用 LMDB 的读-写特性和零拷贝内存映射原理,并行读取未提交的更改。
    • 减少通信开销:将位图序列化为内存缓冲区,减少分配和数据传输,使用 wait-free 数据结构和热读取循环。
    • 文件流处理: grenad 的早期版本支持在去分配读取部分时进行文件流处理,可减少写放大。
  • 要支持的功能集

    • 文档插入:优化文档插入流程,避免数据重复和性能下降,如合并文档、使用并行迭代器等。
    • 加载转储:处理包含数亿文档的转储时,避免“MDB_TXN_FULL”错误,可分块处理并使用“MDB_APPEND”选项。
    • 设置更改:仅提供必要的文档字段给提取器,跳过文档写入循环,减少磁盘操作。
    • 编辑文档:流式处理新编辑的文档,避免空间问题,生成不同的倒排索引并写入 LMDB。
    • 文档压缩:使用 zstd 进行字典压缩,在索引时并行压缩和流式传输文档。
    • 缓存优化:为每个索引线程添加缓存,先在内存中处理条目,减少磁盘写入。
    • 工作分配优化:使用 Rayon 的工作窃取功能,更高效地分配文档处理工作。
    • 语言检测优化:考虑从 Whatlang 库切换到 Whichlang 以提升语言检测速度,加快整个提取过程。
    • 任务调度调整:根据文档负载大小调整任务调度,支持实时和大规模插入索引。
  • 未来改进方向

    • 避免非主要更新的转储,实现内部数据库和结构的版本化,使引擎更具资源性。
    • 测量磁盘速度,决定如何处理倒排索引内容,以提高性能。
    • 通过多个加载条显示索引管道的进度,提高用户体验和调试效率。
  • 总结:目标是创建高效的键值存储,利用 RAM 减少磁盘写入,并行计算倒排索引,提高索引器性能,并期待在后续实施和基准测试中取得良好效果。

总体而言,文章详细探讨了 Meilisearch 文档索引器的现状及改进方向,涵盖了多个技术方面的改进和功能增强措施。

阅读 12
0 条评论