首页 > 解决方案 > Solr - 索引的内存要求

问题描述

更新:添加了一些 java 代码以及用于启动作业的命令

我在为作业分配内存的 HPC 服务器上运行索引进程作为作业。我在索引过程中达到了内存上限,我想询问我的数据一个使用场景,1)索引和 2)稍后查询索引的最小内存是多少。

设想:

下面的 Java 代码用于以“嵌入式”模式启动服务器:

    CoreContainer prodNCContainer = new CoreContainer(args[1]);
    prodNCContainer.load();
    SolrClient prodNameCatDescIndex = new EmbeddedSolrServer(prodNCContainer.getCore("prodcatdesc"));

我用来启动作业的命令如下:

#$ -l h_rt=168:00:00 -l rmem=24G -m bea -M ... 
java -Xmx23000m -cp '........ 1.0-SNAPSHOT-jar-with-dependencies.jar' x.y.z.ProdCatDescIndexCreator ....

第一行要求服务器为我的工作分配 24G 内存。

正如我提到的,作业失败是因为服务器在超过分配的 24GB 内存时终止了作业。这告诉我,对于这个索引过程来说,这还不够。那么在索引过程中配置内存的经验法则是什么?那么稍后使用索引呢?

我记得你不需要比预期的索引大小更大的内存......这在 IMO 也是不现实的。过去,我设法在我的笔记本电脑上加载和查询一个 43G 的 solr 索引,它的内存最大只有 16GB。我很困惑。

solrconfig.xml 文件中是否有任何配置来处理这个问题,例如,可能配置段数?我不知道该怎么做......

标签: javasolr

解决方案


如果服务器正在终止作业,则您的内存设置可能太高 - 因为它是操作系统杀死它,而不是 JVM 创建内存不足异常。实际上,您是在告诉 JVM 使用比操作系统允许的更多的内存;减少 JVM 可用的内存,让它运行它的 GC。

如果你给 JVM 24G,而你的服务器上分配的总内存是 24G,那么 JVM 会吃掉所有的东西,并在没有更多可用空间时被杀死。在您的笔记本电脑上,此设置是不同的,它不会因为使用太多内存而被杀死。

JVM 认为它至少可以访问你告诉它的内存,然后下面的操作系统会看到“哦,那个 jvm 进程肯定会使用大量内存......而且我的可用内存已经用完了。 . 猜猜我必须杀了它”。发生这种情况时,该进程就会消失并且无法记录任何内容(除了系统日志或取决于您的操作系统,不同的日志会告诉您它被杀死的原因)。


推荐阅读