2013-05-13 70 views
1

我的Solr 4实例很慢,我不知道为什么。 我试图修改JVM,Tomcat6和Solr 4的配置,按照 的顺序来优化性能,每秒查询作为关键指标。 目前我正在使用Debian squeeze在EC2 small层上运行,但如果需要的话可以准备切换到Ubuntu。在EC2 debian实例上优化Solr 4

我的用例没有什么特别之处。指数很小。查询包括适量的工会(例如10个),加上面子,但我不认为这很不寻常。

我的理解是,这些地区可能需要的调整:

  • 配置JVM垃圾回收进度和内存分配(“GC调优是一个精确的艺术形式”ref
  • 其他JVM设置
  • Solr的查询结果缓存,过滤器高速缓存,文件缓存设置
  • Solr的自动预热设置

有许多的方法来监测Solr的表现:

但是这些方法都没有说明哪些设置需要调整,并且我没有通过详尽的设置列表来了解这些步骤的指南,这些设置可能会提高性能。我回顾了以下几页(one,two,three,four),并且迄今为止经历了几轮试验和错误而没有改进。

问题:

  • 如何告诉JVM使用所有的2 GB内存上的小EC2实例?
  • 如何调试和优化JVM垃圾收集?
  • 我如何知道何时I/O限制(如新的EBS IOPS定价)是问题?
  • 使用下面的NewRelic示例等数字,如何检测问题行为以及如何处理解决方案。

答案:

  • 我找链接,良好的文档建立和优化的Solr 4,从DevOps的或服务器管理员的角度(没有索引或应用程序设计)。
  • 我正在寻找最可能导致问题的catalina.sh,solrconfig.xml,solr.xml(其他?)中的顶级故障点。
  • 或者您认为解决问题的任何提示。

enter image description here enter image description here

+0

相关:http://stackoverflow.com/questions/12079269/speeding-up-solr-search?rq=1 – 2013-05-13 20:13:42

回答

5

首先,你不应该集中在开关你的Linux版本。不同的分布可能会带来一些变化,但考虑到您提供的信息,没有任何证据表明这些变化可能很重要。

您提到了很多优化的可能性,这可能是压倒性的。只有当你证明问题在于你的堆栈的特定部分时,你才应该考虑调整区域。

JVM堆大小调整

可以使用参数-mx1700m给予的RAM的JVM最大1.7GB的。热点可能不需要它,所以如果你的堆容量没有达到那个数量,不要感到惊讶。

您应该将最小堆大小设置为较小值,以便Hotspot可以优化其内存使用量。例如,要将最小堆大小设置为128MB,请使用-mx128m

垃圾收集

从你说的话,你有有限的硬件(1核心为1.2GHz最大值,见this page

M1小型实例

  • 1.7吉布内存
  • 1 EC2计算单元(1个虚拟核心,带1个EC2计算单元)
  • ...

一个EC2计算单元提供1.0-1.2 GHz的2007的Opteron或2007至强处理器的等效CPU容量

因此,使用低延迟GC(CMS)不会有任何好处。由于您只有一个内核,因此无法与您的应用程序同时运行。您应该使用-XX:+UseParallelGC -XX:+UseParallelOldGC切换到吞吐量GC。

GC真的有问题吗?

要回答这个问题,您需要打开GC日志记录。这是查看GC暂停是否对您的应用程序响应时间负责的唯一方法。你应该打开-Xloggc:gc.log -XX:+PrintGCDetails

但我不认为问题出在这里。

这是硬件问题吗?

要回答这个问题,您需要监视资源利用率(磁盘I/O,网络I/O,内存使用率,CPU使用率)。你有很多工具可以做到这一点,包括topfree,vmstat, iostat,mpstat,ifstat,...

如果您发现其中一些资源饱和,那么您需要一个更大的EC2实例。

它是软件问题吗?

在你的统计中,文档缓存命中率和过滤器缓存命中率是健康的。但是,我认为查询结果缓存命中率非常低。这意味着很多查询操作。

您应该监视查询执行时间。根据该值,您可能需要增加缓存大小或调整查询,以便减少时间。

更多链接

希望帮助!

+0

非常感谢! – 2013-05-15 12:34:55