Multithreading 使用solr搜索时的CPU使用率

Multithreading 使用solr搜索时的CPU使用率,multithreading,performance,solr,cloud,cpu,Multithreading,Performance,Solr,Cloud,Cpu,我们的solr云设置为4个碎片(每台物理机器一个碎片),拥有约1亿个文档。动物园管理员在这四台机器中的一台上。我们会遇到复杂的查询,将通配符和邻近搜索放在一起,有时需要超过15秒才能获得前100个文档。目前查询流量非常低(每分钟2-3次查询)。托管云的4台服务器具有以下规格: (2台服务器->64 GB RAM,24个CPU核心,2.4 GHz)+(2台服务器->48 GB RAM,24个CPU核心,2.4GHz) 我们为每个碎片提供8GB JVM内存。每台机器上SSD上的510GB索引(总计4

我们的solr云设置为4个碎片(每台物理机器一个碎片),拥有约1亿个文档。动物园管理员在这四台机器中的一台上。我们会遇到复杂的查询,将通配符和邻近搜索放在一起,有时需要超过15秒才能获得前100个文档。目前查询流量非常低(每分钟2-3次查询)。托管云的4台服务器具有以下规格: (2台服务器->64 GB RAM,24个CPU核心,2.4 GHz)+(2台服务器->48 GB RAM,24个CPU核心,2.4GHz)

我们为每个碎片提供8GB JVM内存。每台机器上SSD上的510GB索引(总计4*510GB=2.4TB)映射到每台服务器上剩余RAM上的OS磁盘缓存中。所以我想RAM不是我们的问题

现在需要注意的一件有趣的事情是:当向云启动查询时,只有一个CPU核心的利用率达到100%,其余的都为0%。所有机器上都复制了相同的行为。这些计算机上没有运行其他进程


solr不应该做某种多线程来利用CPU内核吗?我是否可以增加每个查询的CPU消耗,因为流量不是问题。如果是,如何处理?

对Solr shard的单个请求基本上是单线程处理的(您可以为多个字段上的镶嵌面设置线程)。经验法则是将碎片的文档计数保持在不超过几亿。对于2500万/分片,您的查询远远低于此值,但正如您所说,您的查询非常复杂。您看到的是单线程处理的简单效果


问题的解决方案是使用更多的碎片,因为所有碎片都是并行查询的。由于您有大量的空闲CPU内核和很少的通信量,您可能希望尝试在每台机器上运行10个碎片。SolrCloud总共使用40个碎片不是问题,与繁重的查询相比,增加的合并开销应该微不足道。

在这里解决性能问题非常困难。有很多事情你可以看一看,微调,做错,修正。当您提到CPU时,很可能您已经准备好了功能或执行了排序。但这只是一个胡乱猜测和基于观点的猜测。我明白了。我脑子里又有一个问题。Solr是基于Java的,Java可以轻松地进行多线程处理。因此,Solr不能配置为每个碎片使用多个线程吗?如果您的问题是多个方面,您可以使用facet.threads,但是搜索本身,我不知道有任何选项(从技术上讲,每个片段使用一个线程是可能的,但据我所知,这尚未实现)。