Solr - 索引的内存要求
Solr - memory requirement for indexing
更新:添加了一些 java 代码以及用于启动作业的命令
我是 运行 一个索引进程,作为 HPC 服务器上的一个作业,它为作业分配内存。我在索引过程中遇到了内存上限,我想问我的数据一个使用场景,1) 索引和 2) 稍后查询索引的最小内存是多少。
场景:
- 预计索引大小约为 70GB
- 预计记录数约为 1.5 亿
- 我用的是Javasolr客户端,solr = 7.1.0
- 在索引期间,我每 10k 条记录提交一次
- 我 运行 在索引期间分配了 24GB 内存的作业,但它崩溃了大约一半,即索引了 7500 万条记录
- 查询使用:非常轻,索引仅供我自己(一个人)使用以方便地访问数据并且查询将仅是顺序的并且主要基于一个字段
下面的Java代码用于以'embedded'模式启动服务器:
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 文件中是否有任何配置来处理这个问题,例如,配置段数?我不知道该怎么做...
如果服务器正在终止作业,您的内存设置可能太高了 - 因为它是 OS 终止它,而不是 JVM 创建内存不足异常。实际上,您是在告诉 JVM 使用比 OS 允许的更多的内存;减少 JVM 可用的内存,并让它 运行 由 GC 代替。
如果你给 JVM 24G,而你的服务器上分配的总内存是 24G,JVM 会吃掉所有东西,当没有更多可用空间时被杀死。在你的笔记本电脑上这个设置是不同的,它不会因为使用太多内存而被杀死。
JVM 认为它至少可以访问与您告诉它一样多的内存,然后下面的 OS 会看到 "oh, that jvm process is sure using a lot of memory .. and I'm all out of available memory .. guess I'll have to kill it"。发生这种情况时,该进程就会消失并且无法记录任何内容(除了系统日志或根据您的操作系统,不同的日志会告诉您它被杀死的原因)。
更新:添加了一些 java 代码以及用于启动作业的命令
我是 运行 一个索引进程,作为 HPC 服务器上的一个作业,它为作业分配内存。我在索引过程中遇到了内存上限,我想问我的数据一个使用场景,1) 索引和 2) 稍后查询索引的最小内存是多少。
场景:
- 预计索引大小约为 70GB
- 预计记录数约为 1.5 亿
- 我用的是Javasolr客户端,solr = 7.1.0
- 在索引期间,我每 10k 条记录提交一次
- 我 运行 在索引期间分配了 24GB 内存的作业,但它崩溃了大约一半,即索引了 7500 万条记录
- 查询使用:非常轻,索引仅供我自己(一个人)使用以方便地访问数据并且查询将仅是顺序的并且主要基于一个字段
下面的Java代码用于以'embedded'模式启动服务器:
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 文件中是否有任何配置来处理这个问题,例如,配置段数?我不知道该怎么做...
如果服务器正在终止作业,您的内存设置可能太高了 - 因为它是 OS 终止它,而不是 JVM 创建内存不足异常。实际上,您是在告诉 JVM 使用比 OS 允许的更多的内存;减少 JVM 可用的内存,并让它 运行 由 GC 代替。
如果你给 JVM 24G,而你的服务器上分配的总内存是 24G,JVM 会吃掉所有东西,当没有更多可用空间时被杀死。在你的笔记本电脑上这个设置是不同的,它不会因为使用太多内存而被杀死。
JVM 认为它至少可以访问与您告诉它一样多的内存,然后下面的 OS 会看到 "oh, that jvm process is sure using a lot of memory .. and I'm all out of available memory .. guess I'll have to kill it"。发生这种情况时,该进程就会消失并且无法记录任何内容(除了系统日志或根据您的操作系统,不同的日志会告诉您它被杀死的原因)。