腾讯云Elasticsearch 优化Lucene性能:高性能缓存的读写锁解决方案
Apache Lucene是一款广泛使用的开源搜索库,擅长提供快速且精确的搜索能力,特别是在像Elasticsearch这样的项目中表现尤为出色。然而,Lucene在高负载情况下也会面临性能挑战,其中一个显著的问题就是缓存系统中的锁争用(lock contention)。当查询量增加时,这个问题可能会变得尤为严重。
近期,作为Elastic的重要合作伙伴和社区成员,腾讯云 Elasticsearch 针对Lucene中的缓存系统锁争用问题提出了优化方案——读写锁(RWLock)。腾讯云的贡献不仅提升了Lucene的性能,也展示了Elastic社区的强大协作精神。
我们非常感谢社区对Elasticsearch和Lucene的贡献,尤其是腾讯云在中国社区中扮演着非常重要的角色。随着搜索技术进入AI新时代,我们非常高兴看到我们的社区、合作伙伴继续与我们携手前行。
Shay Banon, Elastic首席技术官
锁争用的挑战
在Lucene中,缓存是几乎所有查询都会使用的关键功能,通过存储经常执行的查询结果来提高性能,减少重复处理同样数据的需求。然而,在高查询量的情况下,传统的独占锁机制在管理缓存访问时可能会成为瓶颈。虽然这种机制能确保数据的完整性,但当多个查询同时尝试访问缓存时,就会引发显著的锁争用问题。这会导致查询响应速度变慢,降低搜索效率。
详细分析
Elasticsearch基于Lucene构建,能够通过动态映射功能为用户自动检测和映射新字段。当用户索引低基数(low cardinality)字段,如身高和年龄时,通常会使用数字来表示这些值。Elasticsearch会将这些字段推断为“long”数据类型,并使用BKD树作为这些long字段的索引。随着数据量的增长,为这些低基数字段构建结果集可能会导致CPU使用率高并增加系统负载。
当CPU在批量数据操作中负载过重时,这一问题会更加明显。在重新索引过程中,将“long”字段转换为“keyword”字段可以显著降低集群负载和查询延迟,但这一过程可能耗时较长。Elastic建议在执行term/terms查询时使用“keyword”字段,而在执行范围查询时使用“long”字段。然而,用户通常未能意识到在低基数字段上使用“long”字段的性能影响,依赖动态映射自动选择的数据类型。优化BKD树是解决低/中基数字段问题的方案之一,这对于减少CPU负载和查询延迟具有重要意义。
通过解决这些底层问题,特别是在Elasticsearch的动态映射和低基数数据的“long”字段使用方面,我们可以更好地理解锁争用的根本原因,并开发出更有效的解决方案。
实施读写锁
为了解决这个性能瓶颈,腾讯提出了使用读写锁的解决方案。RWLock提供了一种更灵活且高效的方式来处理共享资源的并发访问。它允许多个线程同时从缓存中读取数据,同时确保写操作的独占性。
读写锁的主要优势:
- 并发读访问:多个查询可以同时从缓存中读取数据,减少等待时间并提高整体吞吐量。
- 控制写访问:写操作仍需独占锁,以确保在更新时的数据完整性。
- 减少锁争用:通过允许同时读取,显著降低锁争用的频率和严重程度。
- 这种改进不仅解决了锁争用问题,还根据查询的复杂程度,将性能提高了50%到200%。对于简单的查询,性能提升接近50%,而对于复杂查询,性能提升则可达200%。
文档数量 | 字段基数 | 查询点 | 基线QPS | 改进后QPS | 差异百分比 | 差异 |
30000000 | 10 | 1 | 2481 | 4408 | 78% | 使用LongAdder。uniqueQueries改为Collections.synchronizedMap。缓存改为IdentityHashMap |
这些改进已被接受并合并到Lucene的主分支中。有关实现的详细信息可以在此找到:Lucene PR #13306。这一整合标志着Lucene在性能和可扩展性方面的重大进步。
未来影响
在Lucene的缓存系统中引入读写锁预计将在多个场景中对查询性能产生深远影响。以下是该优化将在这些场景中带来的显著改进:
向量检索:作为向量数据库的Elasticsearch在执行相似性搜索等任务时,将更高效地处理复杂操作。
BM25评分:作为信息检索中的流行排序函数,BM25将受益于降低的延迟和提高的吞吐量,增强搜索结果的相关性和速度。
范围查询:涉及扫描索引大部分的范围查询将获得显著的性能提升,使其在实时应用中更具可行性。
鉴于大多数在线服务中的查询条件大多保持不变,仅少数条件发生变化,改进后的缓存可以显著提升查询性能。通过利用优化后的缓存,服务可以处理更多复杂查询,而不会影响速度或准确性。
感谢腾讯云宝贵贡献,推动Elastic中国社区优化创新
我们要特别感谢腾讯云,这位重要的合作伙伴和社区成员,为此次优化做出的宝贵贡献。腾讯在实施RWLock上的努力显著提高了性能,展示了Elastic社区的强大协作精神。像腾讯这样的合作伙伴的贡献对推动创新和改进我们依赖的工具至关重要。他们的奉献精神展现了我们社区共同努力所能达到的最高成就。
腾讯云ES服务认为,Elasticsearch是开发者的首选向量数据库,这也彰显了他们在Lucene和Elasticsearch中的贡献。在生成式AI场景中,腾讯云推荐Elasticsearch作为开发者的理想向量数据库。腾讯云ES服务已成为中国信息通信研究院(CAICT)制定的检索增强生成(RAG)标准的关键参与者,并成为首个通过该标准的产品。这进一步凸显了Elasticsearch开发生态系统在中国开发者中成为RAG应用开发首选的趋势。
通过引入读写锁优化Lucene的缓存系统,解决了锁争用这一关键问题。通过允许多个读操作同时进行,并确保写操作的独占性,Lucene的性能显著提升。这一优化已成为Lucene主分支的一部分,承诺为广泛应用场景提供更快、更高效的搜索能力。