【发布时间】:2019-12-11 08:08:05
【问题描述】:
更新:添加了一些 java 代码以及用于启动作业的命令
我正在将内存分配给作业的 HPC 服务器上作为作业运行索引进程。我在索引过程中遇到了内存上限,我想询问我的数据使用场景,1)索引和 2)稍后查询索引的最小内存是多少。
场景:
- 预计索引大小约为 70GB
- 预计创纪录的人数将达到 1.5 亿左右
- 我使用 Java solr 客户端,solr = 7.1.0
- 在索引期间,我每 10k 条记录提交一次
- 我在索引期间使用 24GB 分配的内存运行该作业,但它在大约一半时崩溃了,即索引了 7500 万条记录
- 查询用法:很轻,索引仅供我自己(一个人)使用,方便访问数据,查询只会是顺序的,而且大多是基于一个字段的
下面的 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 文件中是否有任何配置来处理这个问题,例如,可能配置段数?我不知道该怎么做...
【问题讨论】:
-
如果服务器正在终止作业,则您的内存设置可能太高 - 因为它是操作系统杀死它,而不是 JVM 创建内存不足异常。实际上,您是在告诉 JVM 使用比操作系统允许的更多的内存;我会尝试减少 JVM 可用的内存并让它运行它的 GC。
-
谢谢。我想我明白你在说什么......我已经更新了我的问题,添加了我用来开始工作的命令。您的意思是,例如,将“java -Xmx ...”编辑为较小的值,例如“java -Xmx12000m ...”,这样它就不会占用分配给我的节点的所有 24G?谢谢
-
正确。如果你给 JVM 24G,而你的服务器上分配的总内存是 24G,那么 JVM 会吃掉所有东西,当没有更多可用空间时被杀死。在你的笔记本电脑上,这个设置是不同的,它不会因为占用太多内存而被杀死。
-
感谢它有效,如果您喜欢将此作为答案发布,我会勾选并投票