我们有一个包含4个分片的solr云设置(每个物理机器一个分片),大约有1亿个文档。 Zookeeper就是这4台机器中的一台。我们遇到复杂的查询,包括通配符和邻近搜索,有时需要超过15秒才能获得前100个文档。此时查询流量非常低(每分钟2-3次查询)。 4托管云的服务器具有以下规格: (2台服务器 - > 64 GB RAM,24个CPU核心,2.4 GHz)+(2台服务器 - > 48 GB RAM,24个CPU核心,2.4 GHz)。
我们为每个分片提供8 GB JVM内存。我们在每台机器上使用固态硬盘的510GB索引(总计4 * 510 GB = 2.4TB)映射到每台服务器上剩余RAM上的操作系统磁盘缓存中。所以我认为RAM不是我们的问题。
现在有趣的事情是:当向云启动查询时,只有一个CPU核心被利用到100%而休息都是0%。在所有计算机上复制相同的行为。这些计算机上没有运行其他进程。
不应该使用CPU内核进行某种多线程吗?因为流量不是问题,我能否以任何方式增加每个查询的CPU消耗。如果是这样,怎么样?
答案 0 :(得分:1)
对Solr分片的单个请求主要是单线程处理的(您可以在多个字段上设置分面的线程)。经验法则是将碎片的文档数量保持在不超过几亿的数量。你远远低于25M / shard,但正如你所说,你的查询很复杂。你看到的是单线程处理的简单效果。
您的问题的解决方案是使用更多分片,因为所有分片都是并行查询的。由于您有大量可用的CPU内核和非常少的流量,您可能希望尝试在每台计算机上运行10个分片。 SolrCloud总共使用40个分片并不是一个问题,与重度查询相比,增加的合并开销应该是微不足道的。