【免费下载链接】endee
Endee.io – A high-performance vector database, designed to handle up to 1B vectors on a single node, delivering significant performance gains through optimized indexing and execution. Also available in the cloud at https://endee.io and under the Endee Enterprise license. Free 30-day evaluation: https://docs.endee.io/v2/quick-start/enterprise
Endee 是一款高性能开源向量数据库,专为 AI 搜索、RAG 和混合检索设计,可在单节点处理最高 10 亿向量。当检索变慢或写入阻塞时,如何快速定位瓶颈?本文给你一套组合拳:读懂 Endee 的结构化日志规范+开启 MDBX 毫秒级计时插桩,两步就能把性能问题锁定到具体函数。🎯
一、Endee 日志规范:一眼定位问题源头
生产环境的所有日志都必须通过LOG_INFO、LOG_WARN、LOG_ERROR三个宏输出,统一格式如下:
LEVEL_code: username/index_name: message其中:
- LEVEL:
INFO/WARN/ERROR三级 - code:显式数字编号,例如
INFO_2023 - username/index_name:事件所属的用户和索引;无索引上下文时用占位符
-/-(全局)或username/-(仅用户)
实际日志长这样:
INFO_2023: alice/catalog: Starting reload WARN_1035: alice/catalog: Invalid k: 0 ERROR_1502: alice/catalog: Failed to store metadata: MDBX_MAP_FULL INFO: -/-: Starting the server💡排查技巧:看到
ERROR_1502这类带MDBX_MAP_FULL的日志,基本可以断定是底层存储(MDBX)写入失败,而不是检索算法的问题。
完整规范见 docs/logs.md,宏的分发与格式化实现在 src/utils/log.hpp,请求级校验和 500 日志在 src/main.cpp。
按错误码区间锁定子系统 🧭
Endee 的日志编号按子系统分段,这是排障时最快的"地图":
| 编号区间 | 子系统 |
|---|---|
1000s | 请求 / 服务器日志 |
1200s | 过滤器日志 |
1300s | 备份存储日志 |
1400s | WAL 日志 |
1500s | 元数据日志 |
1600s | 向量存储日志 |
1700s | 系统健康检查(CPU 兼容性、磁盘、内存、ulimits) |
1800s | 重建子系统日志 |
2000s | 索引管理器日志 |
2100s | HNSW 加载 / 缓存日志 |
例如服务启动阶段出现ERROR_1717: AVX2 is supported by the CPU but not enabled by the OS,就是 CPU 指令集问题而非负载问题。相关检查代码在 src/utils/cpu_compat_check/check_avx_compat.hpp 和 src/utils/system_sanity/system_sanity.cpp。
二、启用 MDBX 毫秒级计时插桩:给每次存储调用装上秒表
Endee 的向量、元数据、过滤器全部落盘在 MDBX(LMDB 的活跃分支)上。检索慢的常见根因是key 查找、游标读写、事务提交拖了后腿。Endee 内置了对全部 15 个 MDBX API 的计时能力,开箱即用。
最快配置方法:一个 CMake 选项开启
cmake -S . -B build -DUSE_AVX2=ON -DND_MDBX_INSTRUMENT=ON cmake --build build关键规则:
- 选项默认 OFF,此时所有插桩宏编译为空操作,生产构建零开销
- 开启后定义
ND_MDBX_INSTRUMENT预处理宏,激活 third_party/mdbx/mdbx.c 内的计时代码 - 插桩原理:每个被计时函数入口用
MDBX_DEBUG_STATS_SCOPE(cmd)记录单调时钟起点,返回时用MDBX_DEBUG_STATS_RETURN(cmd, value)计算耗时并写入线程安全的全局统计表
被计时的操作覆盖:环境创建/打开/关闭、事务 begin/commit/abort、键值get/put/del、游标 open/close/get/put/del。详细说明见 docs/mdbx-instrumentation.md 与 docs/cmake-options.md。
三、读取计时数据:调一次健康检查接口即可
统计通过print_mdbx_stats()输出到stderr并自动清零,每次调用展示的是自上次调用以来的增量。内置的健康检查接口已经接好了它:
curl http://localhost:8080/api/v1/health该接口的注册逻辑在 src/main.cpp(第 283 行调用print_mdbx_stats(),同时还会输出稀疏索引搜索/更新计时)。输出示例:
[MDBX_STATS] mdbx_get count=4821 total_ms=12.345 avg_us=2.561三个字段这样读:
| 字段 | 含义 | 排查意义 |
|---|---|---|
count | 自上次输出以来的调用次数 | 判断该操作是否是高频热点 |
total_ms | 累计耗时(毫秒) | 占总时间的比重 |
avg_us | 单次平均耗时(微秒) | 单次变慢的敏感指标 |
若两次调用之间没有任何 MDBX 活动,则输出[MDBX_STATS] no recorded commands。
四、实战排障流程:先日志、后插桩 🔍
- 先扫日志:按上文编号区间判断问题落在哪一层(请求、过滤、WAL、元数据、HNSW 缓存……)
- 若怀疑存储层:用
-DND_MDBX_INSTRUMENT=ON重新构建,跑一段真实负载 - 周期性调健康接口:
curl http://localhost:8080/api/v1/health,观察stderr里的[MDBX_STATS]增量 - 锁定瓶颈模式:
mdbx_get的avg_us明显偏高 → 热向量未命中内存缓存,考虑调大缓存比例(参考 docs/memory_management.md 的VECTOR_CACHE_PERCENTAGE)mdbx_txn_commit耗时占比高 → 写入事务过重,检查批量写入策略mdbx_cursor_get次数激增 → 范围扫描过多,检查过滤器是否命中了低选择性条件(过滤器索引见 src/filter/)
- 补充维度:稀疏向量场景可再加
-DND_SPARSE_INSTRUMENT=ON,健康接口会同步输出printSparseSearchDebugStats()/printSparseUpdateDebugStats();开发调试还可开-DND_DEBUG=ON启用LOG_TIME函数级计时(Release 构建下均为空操作,见 src/utils/log.hpp)
五、小结
| 手段 | 开启方式 | 看到什么 |
|---|---|---|
| 结构化日志 | 默认开启 | LEVEL_code: 用户/索引: 消息,按编号区间定位子系统 |
| MDBX 插桩 | -DND_MDBX_INSTRUMENT=ON | 15 个 MDBX API 的调用次数 / 累计毫秒 / 平均微秒 |
| 稀疏插桩 | -DND_SPARSE_INSTRUMENT=ON | 稀疏搜索/更新的阶段计时 |
| 函数计时 | -DND_DEBUG=ON | 按耗时排序的函数级统计表 |
日志回答"哪里出事了",MDBX 插桩回答"慢在哪一步"。两条线索交叉验证,绝大多数 Endee 性能瓶颈都能在十几分钟内定位到具体函数。🚀
【免费下载链接】endee
Endee.io – A high-performance vector database, designed to handle up to 1B vectors on a single node, delivering significant performance gains through optimized indexing and execution. Also available in the cloud at https://endee.io and under the Endee Enterprise license. Free 30-day evaluation: https://docs.endee.io/v2/quick-start/enterprise
相关推荐
向量数据库性能优化实战:从高并发瓶颈到毫秒级响应的完整解决方案
向量数据库性能优化实战:从高并发瓶颈到毫秒级响应的完整解决方案 在AI应用爆发式增长的今天,你是否正面临这样的困境:随着用户量激增,向量数据库查询延迟不断攀升,
数据库向量数据库全文检索人工智能ParlAI日志分析终极指南:如何快速监控训练过程与定位性能瓶颈
ParlAI日志分析终极指南:如何快速监控训练过程与定位性能瓶颈 ParlAI是一个强大的对话AI训练框架,但在实际使用过程中,训练过程的监控和性能瓶颈的定位往
NLP人工智能深度学习SequencePlugin插件开发指南:如何为IntelliJ IDEA贡献功能
SequencePlugin插件开发指南:如何为IntelliJ IDEA贡献功能 SequencePlugin是一款专为IntelliJ IDEA设计的序列图
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考