参数 num_threads 是用来控制 HNSW 内部计算(后台建图 + query 向量检索)使用的线程数,是 HNSW 算法本身的并行线程池,不是 Python 客户端并发请求线程、不是 SQLite 线程、不是 embedding 推理线程。
默认等于 CPU 核数,一般不用动。只有在容器里被限制了 CPU、但 cpu_count() 拿到的是宿主机核数时,才会开太多线程,这时候显式设一下:
col.modify(configuration={
"hnsw": {
"num_threads": 4
}
})注意,下面两个场景都会吃这个线程池:
写入侧:后台消费 embeddings_queue、逐条执行 ef_construction HNSW 插入建图(距离计算、邻居搜索)
查询侧:执行 query(),HNSW 搜索、距离计算(多 query 向量批量检索时并行收益最明显)
收益:
大批量建索引、批量 query(一次 query 传入很多 embedding)时,CPU 并行拉高,吞吐提升。
高维向量(1024/1536)距离计算开销大,并行收益非常明显。
代价:
CPU 争抢;如果机器同时跑 Ollama、LLM、其他服务,直接把 CPU 打满,全体延迟飙升。
超配(设置远超物理核心):线程上下文切换开销变大,性能反而下跌,没有收益。
收益:
限制 Chroma HNSW 的 CPU 占用,给同机的 embedding/LLM 预留 CPU 资源。
在线服务、少量 query、低并发写入场景,CPU 更平稳,不会毛刺 。
代价:
批量导入、大批量检索速度变慢,并行能力受限。