当前位置: 首页 > 面试题库 >

-XX:MaxRAMFraction = 1在容器环境中生产是否安全?

皇甫俊雅
2023-03-14
问题内容

Java
8/9带来了对-XX:+UseCGroupMemoryLimitForHeap(带有-XX:+UnlockExperimentalVMOptions)的支持。这设置-XX:MaxRAM为cgroup内存限制。默认情况下,JVM会分配大约25%的最大RAM,因为-XX:MaxRAMFraction默认值为4。

例:

MaxRAM = 1g
MaxRAMFraction = 4
JVM is allowed to allocate: MaxRAM / MaxRAMFraction = 1g / 4 = 256m

对于仅由单个JVM进程组成的部署,仅使用配额的25%似乎是浪费。因此,现在人们开始设置-XX:MaxRAMFraction=1,因此从理论上讲,JVM可以使用MaxRAM的100%。

对于1g的示例,这通常导致堆大小约为900m。这似乎有点高-JVM或其他东西(如远程Shell或进程外任务)没有太多可用空间。

那么,此配置(-XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -XX:MaxRAMFraction=1)是否对产品甚至最佳实践来说都是安全的?或者我应该还是手拿起-Xmx-Xms-Xss等?


问题答案:

我们进行了一些简单的测试,结果表明该设置-XX:MaxRAM=$QUOTA-XX:MaxRAMFraction=1导致在负载下被杀死的容器。JVM分配了超过900M的堆,这太多了。-XX:MaxRAMFraction=2似乎很安全。

请记住,您可能希望为其他过程留出空间,例如docker exec在容器中获取调试shell()或诊断信息。

编辑:我们已经在一篇文章中写下了我们所学的内容。货币报价:

TL’DR: Java内存管理和配置仍然很复杂。尽管从Java 9 /
8u131开始,JVM可以读取cgroup内存限制并相应地调整内存使用量,但这并不是万灵药。您需要知道-XX:+UseCGroupMemoryLimitForHeap它的作用,并且需要为每个部署微调一些参数。否则,您可能会浪费资源和金钱,或者在最坏的时间杀死集装箱。-XX:MaxRAMFraction=1尤其危险。Java
10+带来了许多改进,但仍需要手动配置。为了安全起见,请对您的东西进行负载测试。

最优雅的解决方案是升级到Java 10+。Java
10弃用-XX:+UseCGroupMemoryLimitForHeap(11)并引入-XX:+UseContainerSupport(12),以取代它。它还引入了-XX:MaxRAMPercentage(13),其值在0到100之间。这允许对允许JVM分配的RAM数量进行精细控制。由于+UseContainerSupport默认情况下处于启用状态,因此所有操作均应立即可用。

编辑#2:我们写了更多有关-XX:+UseContainerSupport

引入了Java 10
+UseContainerSupport(默认情况下启用),它使JVM在容器环境中使用合理的默认值。自8u191以来,此功能已反向移植到Java
8,这可能允许大量野生Java部署正确配置其内存。



 类似资料:
  • Java 8/9带来了对堆的支持(使用代码),XX:UseCGroupMemoryLimitForHeap(解除锁定实验操作)。这将把-XX:MaxRAM设置为cgroup内存限制。默认情况下,JVM分配大约25%的最大RAM,因为默认值为4。 示例: 对于(通常)由单个JVM进程组成的部署来说,只使用25%的配额似乎是浪费。所以现在人们设置,所以理论上允许JVM使用100%的MaxRAM。 对于

  • 本文向大家介绍生产环境中安全运行Docker容器,包括了生产环境中安全运行Docker容器的使用技巧和注意事项,需要的朋友参考一下 在生产环境中,强化Docker容器的一种方法就是使它们不可变,也就是只读。安全地运行容器的其他方法还包括最小化受攻击面和应用Linux安全过程,标准Linux安全过程和针对容器环境的特定过程都要应用。 在启动容器时传入--read-only标记就可以 在只读模式下运行

  • 您如何为开发和生产(集群)构建图像: 我正试图为两者都提供一个Dockerfile,以保持“Dockerfile实现在一个地方”,如继承: 然后使用docker compose。开发yml 就像docker compose一样。开发yml: 所以首先,命名不起作用。 额外的问题:如何为生产构建一个映像-您是否只需在一个容器中编译(docker运行),然后将二进制文件复制到一个新容器中?

  • 生产中的EAP EAP在默认的FreeRADIUS安装中开箱即用。但是,也有一些要点需要注意或更改以适应您的环境。在本节中,我们将介绍以下几点: 适当的公钥基础设施(PKI)的重要性 配置内部隧道虚拟服务器 内部和外部隧道识别的问题 禁用未使用的EAP方法 公共密钥基础设施简介公钥基础结构主要用于两件事: 验证某人的身份 通过不安全的连接交换安全数据 为了确保某人是他们声称的人,我们使用证书颁发机

  • 更新时间:2019-08-31 11:22:33 服务分为生产环境与开发环境,未发布的服务认为是在开发环境,发布后的服务为生产环境的服务。生产环境的服务才可以在web工作台,或代码工程内调用。生产环境的服务不可再进行修改,需要在开发环境中修改部署发布服务后,才可生效。 服务运维监控功能是为生产环境的服务提供的,您可以在此查看生产环境服务的调用量及运行日志。

  • 生产环境打包要做两件事: 压缩应用代码; 使用 Vue.js 指南中描述的部署方式去除 Vue.js 中的警告。 下面是配置示例: // webpack.config.js module.exports = { // ... other options plugins: [ // short-circuits all Vue.js warning code new webp