docker - 限制 docker 容器中的 MarkLogic 内存消耗
问题描述
我工作的项目开发了一个在后端使用 MarkLogic 9 的 Java 服务。我们正在运行一个 Jenkins 构建服务器,它在用 XQuery 编写的 MarkLogic 中执行(以及其他)几个测试。对于这些测试,MarkLogic 在 Jenkins 主机(运行 Ubuntu Linux)上的 docker 容器中运行。Jenkins 主机配置了 12 GB 的 RAM 和 8 GB 的交换空间。最近我注意到容器中运行的 MarkLogic 实例使用了大量的 RAM(高达 10 GB)。由于经常有其他构建作业并行运行,Jenkins 开始交换,有时甚至耗尽所有交换,因此 MarkLogic 报告它无法获得更多内存。显然,这种情况经常导致构建失败。
为了进一步分析这一点,我在运行 Docker for Windows 的 PC 上进行了一些测试,发现 MarkLogic 测试可以在 5-6 GB RAM 下成功运行。MarkLogic 日志显示它看到了所有主机内存并且想要使用所有内容。但是由于我们在该主机上运行了其他构建进程,因此这种行为是不可取的。
我的问题:有没有可能告诉 MarkLogic 不要使用这么多内存?我们正在构建期间准备 docker 映像,因此我们可以修改一些配置,但必须以某种方式编写脚本。
解决方案
容器未正确检测内存限制的问题已确定,应在即将发布的版本中解决。
同时,您可以通过以下方式缓解该问题:
将组缓存大小从 更改
automatic
为manual
并设置适合分配资源的缓存大小。有多种方法可以设置这些配置,无论是从ml-gradle项目部署和设置配置,还是进行自己的管理 API REST 调用,或者以编程方式:减少内存限制
in memory limit指定内存中的最大片段数。内存支架包含任何新的或更改的片段的最新版本。定期将内存中的立场作为森林中的新立场写入磁盘。此外,如果一个stand 累积的碎片数量超过此限制,它会由后台线程自动保存到磁盘。
推荐阅读
- json - 如何将 PostgREST jasonb 对导出为 CSV 作为 React-Admin 中的列?
- sql - SQL 选择只有唯一值的记录
- mysql - 如何在 SQL Select 语句中编写条件
- android - Android:在 WebViewCient.shouldOverrideUrlLoading 中未找到用于处理查看 HTTPS 网站的意图的活动
- cognos - 我无法获得百分比
- python - 类型错误:+ 不支持的操作数类型:“NoneType”和“float”,同时循环和添加
- javascript - 如何在 React/TS 中设置变量
- python - 鼠标点击事件pygame
- python - 从 csv 读取重复或重复的列并将它们附加到公共列中 -Pandas
- python-3.x - Django中的Redis性能很慢