内容提要
Qdrant批量导入后,优化器积压会导致查询延迟飙升。基准测试显示:启用持续索引时,排空阶段p50延迟为780毫秒,优化完成后降至4.3毫秒;禁用索引则稳态延迟高达256毫秒。实验性prevent_unoptimized标志可将排空延迟降至10.2毫秒,但新写入点暂时不可搜索。单段配置稳态最快,但恢复超一小时;限制段大小可加速恢复12.7倍。串行化优化线程可降低p95延迟,但延长排空时间。提高deleted_threshold可避免vacuum干扰搜索。
延伸解读
持续索引的代价与回报
启用持续索引时,批量导入后优化器需要约11分钟排空积压,期间搜索延迟中位数达780毫秒,p95为2秒,个别查询近10秒。但优化完成后,中位延迟降至4.3毫秒,p95为7.6毫秒,比排空阶段快180倍以上。若禁用索引,虽无排空阶段,但稳态搜索因暴力扫描延迟高达256.6毫秒,约为优化后的60倍。因此,除非能接受永久性慢查询,否则应保持持续索引开启。
prevent_unoptimized:用可见性换速度
实验性标志prevent_unoptimized可将排空阶段中位延迟从780毫秒降至10.2毫秒,p95从2秒降至81.3毫秒,优化完成时间也从11分钟缩短至约9分钟。其机制是将新写入点暂存为deferred,待段优化后才可搜索。代价是最近写入的点暂时不可见,查询可能返回较少结果。使用时需确保写入wait=false,并监控deferred_points是否最终排空。
段大小与优化线程的权衡
单段配置稳态搜索最快(中位3.2毫秒),但排空需超过1小时;将段大小限制为100,000 KB可将排空时间缩短至283.9秒,快12.7倍,但稳态延迟升至17.3毫秒。串行化优化线程(设为1)可将排空阶段p95从820.4毫秒降至373.7毫秒,但排空时间延长至3244.1秒,中位延迟也从44毫秒升至138.4毫秒。需根据对延迟平滑度和恢复速度的偏好选择。
删除阈值与延迟索引的注意事项
提高deleted_threshold可避免vacuum在搜索期间触发。测试中,阈值0.2时删除25%数据后触发vacuum,p95从5.0毫秒升至22.7毫秒;阈值0.5时未触发,p95反降至4.3毫秒。若延迟索引,重新启用时积压会一次性释放,未启用prevent_unoptimized时中位延迟可攀升至5.31秒,启用后则保持在4.6毫秒左右。
Q&A
Qdrant批量导入后查询延迟飙升的原因是什么?
批量导入完成后,Qdrant的索引、合并和清理优化器需要处理积压任务,这些后台操作与搜索查询竞争CPU和I/O资源,导致查询延迟升高。
启用持续索引对Qdrant搜索延迟有什么影响?
启用持续索引时,排空阶段p50延迟为780毫秒,p95为2.0秒;优化完成后p50降至4.3毫秒,p95降至7.6毫秒。禁用索引则跳过排空阶段,但稳态延迟高达256.6毫秒(p50),因为退化为暴力扫描。
prevent_unoptimized标志如何优化Qdrant的搜索延迟?
prevent_unoptimized标志将排空阶段p50延迟从780毫秒降至10.2毫秒,p95从2.0秒降至81.3毫秒,优化完成时间从约11分钟缩短到9分钟。但新写入的点会暂时不可搜索,直到所在段完成优化。
Qdrant段大小配置如何影响恢复时间和查询速度?
单段配置稳态查询最快(p50 3.2毫秒),但恢复时间超过一小时(3602.1秒)。限制段大小为100,000 KB可将恢复时间缩短至283.9秒(快12.7倍),但稳态p50延迟升至17.3毫秒。默认每CPU核心一段的恢复时间为1026.9秒,稳态p50为4.1毫秒。
串行化优化器线程对Qdrant查询延迟和排空时间有什么影响?
将max_optimization_threads和max_indexing_threads设为1,排空时间延长至3244.1秒(默认的6.8倍),但排空期间p95延迟从820.4毫秒降至373.7毫秒,查询更平滑可预测。
如何配置deleted_threshold以避免vacuum影响Qdrant搜索延迟?
提高deleted_threshold(如从0.2到0.5)可避免在搜索活跃时触发vacuum。测试中,阈值0.2时vacuum触发,p95延迟从5.0毫秒升至22.7毫秒;阈值0.5时vacuum未运行,p95从5.4毫秒降至4.3毫秒。
延迟启用索引对Qdrant搜索延迟有什么影响?
延迟启用索引会一次性重新打开整个积压,若未启用prevent_unoptimized,搜索延迟会急剧上升(p50达2.7秒,p95达12.1秒)。启用prevent_unoptimized后,新写入点被延迟,查询不扫描积压,延迟快速恢复(p95 621.7毫秒,稳态p95 5.7毫秒)。