在solr云上加载文档所需的最佳actor实例(线程)数

时间:2014-01-02 18:17:32

标签: multithreading solr akka apache-zookeeper solrcloud

我的情况是我需要将应用程序(以百万为单位)的文档加载到带有zookeeper的* solr云作为配置同步服务* 。由于大量的文件流量,我对性能问题感到困惑。让我们说我有两个solr运行的分片和两个每个分片的zookeeper主机实例。所以我的方法是这样的:

  var rtr = system.actorOf(Props(new solrCloudActor(zkHost,core)).withRouter(SmallestMailboxRouter(nrOfInstances = 8)))
  //router vector created globally with 8 instances based on some black box tests that single solr instance can utilize 8 threads in parallel for loading.
  .
  ..
  ... 
  val doc:SolrInputDocument = new SolrInputDocument() //repeated million times depending on number of documents and creating docs here
  doc.addfield("key","value")
  .
  ...
  rtr ! loadDoc(doc) // broadcasting the doc here 

class solrCloudActor(zkHost:String,solrCoreName:String) extends Actor{
  val server:CloudSolrServer  = new CloudSolrServer(zkHost)
  server.setDefaultCollection(solrCoreName)
  def recieve{
    case loadDoc(d:SolrInputDocument) => server.add(d)
  }
}

我在这里担心的一些问题:

  1. 这种方法是否正确。实际上,当我有单个solr实例并创建了8个路由器矢量实例的httpclient actor 而不是 solrcloud与zookeeper 时,这是有意义的。

  2. 当我在队列中有数百万个文档时,使solr加载到峰值所需的最佳线程数是多少。是numofshards x some_optimal_number还是线程数取决于每个核心每个分片的数量或者是平均值:(numofshards x some_optimal_number + numberofcore)/ numberofcore ..

  3. 我甚至需要担心并行性吗?我通过提供所有逗号分隔的zookeeper主机来启动的单个solrcloud服务器实例可以负责文档的分发。

  4. 如果我完全走错了方向,请提出一个更好的方法来改善表现。

1 个答案:

答案 0 :(得分:1)

演员数量和线程数相同。演员在工作时使用来自池中的线程。

可以并发运行的线程数限制为池大小(除非另有特别配置)是动态的,但通常与核心数相匹配。

因此,合理参与者的理想数量与合并线程的数量大致相同。

在理想情况下,池化线程的数量是核心数量。

但是......我们不是生活在一个理想的世界里。一个理想的世界没有阻塞操作,没有网络或其他IO延迟,没有其他进程在机器上竞争资源等等。

在一个非理想的(a.k.a真实)世界。最佳数量取决于您的代码库和您的特定环境。只有你和你的探查者可以回答那个。