1

我的 Solr 4 实例很慢,我不知道为什么。我正在尝试修改 JVM、Tomcat6 和 Solr 4 的配置以优化性能,以每秒查询次数作为关键指标。目前我正在small使用 Debian 挤压的 EC2 层上运行,但如果需要,我准备切换到 Ubuntu。

我的用例没有什么特别之处。指数很小。查询确实包括适度数量的联合(例如 10 个)以及分面,但我认为这并不罕见。

我的理解是这些领域可能需要调整:

  • 配置 JVM 垃圾收集计划和内存分配(“GC 调优是一种精确的艺术形式”参考
  • 其他 JVM 设置
  • Solr 的查询结果缓存、过滤器缓存、文档缓存设置
  • Solr 的自动加热设置

有多种方法可以监控 Solr 的性能:

但是这些方法都没有表明需要调整哪些设置,并且没有任何指南可以指导我通过详尽的设置列表了解这些步骤,这些设置可能会提高性能。我已经查看了以下页面(),到目前为止,我经历了几轮试验和错误,没有任何改进。

问题:

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

答案:

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

在此处输入图像描述 在此处输入图像描述

4

1 回答 1

5

首先,您不应该专注于切换您的 linux 发行版。不同的分布可能会带来一些变化,但考虑到您提供的信息,没有任何证据表明这些变化可能很重要。

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

JVM 堆大小

您可以使用该参数-mx1700m为 JVM 提供最多 1.7GB 的 RAM。Hotspot 可能不需要它,因此如果您的堆容量未达到该数字,请不要感到惊讶。

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

垃圾收集器

根据您的说法,您的硬件有限(最大 1.2GHz 的 1 核,请参阅此页面

M1 小实例

  • 1.7 GiB 内存
  • 1 个 EC2 计算单元(1 个虚拟内核和 1 个 EC2 计算单元)
  • ...

一个 EC2 计算单元提供相当于 1.0-1.2 GHz 2007 Opteron 或 2007 Xeon 处理器的 CPU 容量

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

GC真的有问题吗?

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

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

是硬件问题吗?

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

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

是软件问题吗?

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

您应该监控查询执行时间。根据该值,您可能希望增加缓存大小或调整查询以减少它们花费的时间。

更多链接

希望有帮助!

于 2013-05-14T15:10:19.727 回答