部署在 k8s 集群上的 Qdrant 出现查询超时问题,错误日志如下:
025-11-02T12:20:33.657575Z ERROR qdrant::tonic::logging: gRPC /qdrant.Points/Recommend unexpectedly failed with Internal error "Service internal error: 1 of 1 read operations failed:\n Timeout error: Operation 'retrieve' timed out after 60 seconds" 60.010902
请问如何解决这个问题?
Qdrant 在 k8s 上的 retrieve 超时,根因通常是磁盘 IO 瓶颈导致 HNSW 索引加载过慢。并发量上去之后,多个查询同时触发缺页中断,磁盘跟不上就把 60s 超时撑爆了。
几个方向排查和优化:
1. 确认是不是磁盘问题
看 Pod 所在节点的 PV 类型。如果用的是网络存储(NFS、Ceph RBD),随机读延迟会远高于本地盘。Qdrant 的 HNSW 索引是内存映射文件,冷查询时需要从磁盘 mmap 加载,网络存储的随机读 IOPS 根本扛不住并发。
解决方案:换本地 SSD 存储(local-path 或 local PV),或者给 Qdrant Pod 加 resource limit 保证独占磁盘带宽。
2. 调大内存让索引常驻
如果 collection 数据量没超内存,把 Qdrant 容器的内存 limit 调大到能装下全部索引文件,避免 mmap 缺页。Qdrant 配置里有个 --max-search-threads 参数,默认可能过高导致并发风暴,适当降低反而更稳。
3. 降并发或加副本
临时方案:客户端加连接池限流,控制并发查询数。根本方案:增加 Qdrant replica 分散读压力,k8s 里扩 Qdrant Pod 副本数,配合分片策略。
4. 检查 segment 数量
如果 collection 经常更新,segment 碎片多也会拖慢查询。用 Qdrant API 看一下 segment 数量,过多的话触发 optimize 合并。
先查 PV 类型,大概率是存储拖后腿。