java - Solr - 索引的内存要求
问题描述
更新:添加了一些 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。
如果你给 JVM 24G,而你的服务器上分配的总内存是 24G,那么 JVM 会吃掉所有的东西,并在没有更多可用空间时被杀死。在您的笔记本电脑上,此设置是不同的,它不会因为使用太多内存而被杀死。
JVM 认为它至少可以访问你告诉它的内存,然后下面的操作系统会看到“哦,那个 jvm 进程肯定会使用大量内存......而且我的可用内存已经用完了。 . 猜猜我必须杀了它”。发生这种情况时,该进程就会消失并且无法记录任何内容(除了系统日志或取决于您的操作系统,不同的日志会告诉您它被杀死的原因)。
推荐阅读
- php - PHP没有将变量传递给插入?
- azure-devops - 持久化由代理上的任务产生的进程的方法?
- kubernetes - Kube-controller-manager HPA 计算未就绪的 pod 并且不考虑将它们用于所需的副本计算
- javascript - 按钮单击事件后如何正确倒计时秒数
- generics - Kotlin 无法通过方法引用推断 Function 的类型
- java - 使用我的代码中的 2 个变量创建循环(Android)
- python - 创建一列,按条件将一组行的最大值分配给该组中的所有行
- jenkins - Jenkins 在加载插件之前执行 Groovy 脚本
- c - 如何在 C 中打印“整洁”的二维数组
- javascript - 我想用 rxjs observable 替换 addEventListener