增加Solr搜索并发

Increase Solr search concurrency

简短的故事:我无法从同一个客户端进程 运行 对 solr5(与 4.10 相同的故事)进行 2 个以上的同时搜索。我错过了配置文件中的任何标志吗?事实证明,这不是硬件问题或软件(客户端)问题。完整故事见下文。

长话短说:

我需要建立一个基于单词的搜索引擎(字段通常只包含一个 word/value - 即使它是一个多值字段,所有值也只会是一个单词)和 60-70 % 的搜索没有通配符。预期的核心大小约为 50K 个文档,平均有 20 个字段。该集合预计每周更新一次(可能更少)——所以我真的不关心索引时间。我想我们可以安全地假设不会有写,只有读 - 因此,我们可以最大限度地减少锁定和其他并发问题的可能性。此外,我测试中最多的 "expensive" 查询(根据 solr 的 qtime)大约为 150。我有一批 10K 随机生成的搜索,无论我在做什么,我都无法在不到5分钟。无论我在客户端打开多少线程,无论我在配置文件中设置什么值……处理器都在 30-40% 左右,内存只有 30%;

我尝试过的:

  1. 3GB RAM 单核虚拟机上的 solr5 + jetty;
  2. 双核虚拟机上的 solr5 + jetty,内存为 6GB(java 为 4GB);
  3. solr5 + tomcat6 双核虚拟机,6GB内存;

对#1 和#2 使用 netstat -a -n | grep @port 我在任何给定时间只看到 2 个活动连接(已建立)- 但没有更多,对于 #3 我在这 2 个活动连接旁边还有其他 10-15在 TIME_WAIT 模式下(未激活)。

我不知何故迷失在这...我不是 Java 忍者,我不了解 java 相关产品及其配置。我使用了 2 个不同的 servlet-container 来解决几乎相同的问题。 IMO,很明显有人限制了活动连接 - 我不知道该怎么做才能找出谁以及为什么。

作为旁注 - 我不确定它是否重要 - 我在另一台机器上复制了相同的工具,同时在我的机器上开始了 "stress" 测试,我注意到活动连接数增加了一倍(通过 netstat),资源仅比单机测试高一点,两台机器的执行时间相同:5 分钟。

那么,我应该怎么做才能取消此限制 - 或者至少增加它?

和往常一样,问题出在椅子和键盘之间。 :(

客户端是在 C# 中使用普通的旧 WebRequest class 完成的 - 它遵守对同一地址进行的并发 HTTP 调用的系统限制(以避免 DOS)。

看完this篇文章,我明白问题出在哪里了。因此,app.config 中的以下调整解决了问题:

<system.net>
    <connectionManagement>
        <add address = "*" maxconnection = "300" />
    </connectionManagement>
</system.net>

它在大约一分钟内完成了所有这些请求,打开了 16 个线程。在 netstats 中也可以看到活动连接。