Java 8/9带来了对堆的支持(使用代码),XX:UseCGroupMemoryLimitForHeap(解除锁定实验操作)。这将把-XX:MaxRAM设置为cgroup内存限制。默认情况下,JVM分配大约25%的最大RAM,因为默认值为4。
示例:
MaxRAM = 1g
MaxRAMFraction = 4
JVM is allowed to allocate: MaxRAM / MaxRAMFraction = 1g / 4 = 256m
对于(通常)由单个JVM进程组成的部署来说,只使用25%的配额似乎是浪费。所以现在人们设置-XX: MaxRAMFraction=1
,所以理论上允许JVM使用100%的MaxRAM。
对于1g示例,这通常会导致堆大小约为900m。这似乎有点高——JVM或其他东西(如远程shell或进程外任务)没有太多的可用空间。
那么,这种配置(XX:UnlockExperimentalVMOptions-XX:UseCGroupMemoryLimitForHeap-XX:MaxRAMFraction=1)是否被认为对产品安全,甚至是最佳做法?或者我还是应该手动选择Xmx、Xms、Xss等等?
最近的oracle-jdk-8(8u191)带来了以下选项,允许Docker容器用户对将用于Java堆的系统内存量进行更细粒度的控制:
-XX:InitialRAMPercentage
-XX:MaxRAMPercentage
-XX:MinRAMPercentage
添加了三个新的JVM选项,以允许Docker容器用户对将用于Java堆的系统内存量进行更细粒度的控制:
-二十: InitialRAMPercentage-XX:MaxRAMPercentage-XX:MinRAMPercentage这些选项替换不推荐使用的分数形式(-XX:InitialRampentage、-XX:MaxRampentage和-XX:MinRampentage)。
看见https://www.oracle.com/technetwork/java/javase/8u191-relnotes-5032181.html
我们做了一些简单的测试,显示设置-XX: MaxRAM=$QUOTA
和-XX: MaxRAMFraction=1
会导致负载下的死容器。JVM分配了超过900M堆,这太多了。-XX: MaxRAMFraction=2
似乎是安全的(ish)。
请记住,您可能希望为其他进程留出空间,例如在容器中获取调试shell(docker exec)或诊断。
编辑:我们已经在一篇文章中详细介绍了所学内容。货币报价:
TL'DR:Java内存管理和配置仍然很复杂。尽管自Java 9/8u131以来,JVM可以读取cgroup内存限制并相应地调整内存使用,但它并不是一颗金弹。您需要知道什么是堆,并且需要为每个部署微调一些参数。否则,您可能会浪费资源和金钱,或者在最坏的时候让您的容器被杀死<代码>-XX:MaxRAMFraction=1
特别危险。Java 10带来了很多改进,但仍需要手动配置。为了安全起见,对你的东西进行负载测试。
和
最优雅的解决方案是升级到Java 10。Java 10反对使用组内存限制堆(11),并引入了取代它的容器支持(12)。它还引入了MaxRAMPercentage(13),它的值介于0和100之间。这允许对允许JVM分配的RAM量进行细粒度控制。由于默认情况下启用了UseContainerSupport,因此所有操作都应该是现成的。
编辑#2:我们已经写了更多关于-XX: UseContainerSupport
的内容
Java10引入了UseContainerSupport
(默认启用),它使JVM在容器环境中使用正确的默认值。自8u191以来,此功能向后移植到Java8,可能允许大量Java部署正确配置其内存。
问题内容: Java 8/9带来了对(带有)的支持。这设置为cgroup内存限制。默认情况下,JVM会分配大约25%的最大RAM,因为默认值为4。 例: 对于仅由单个JVM进程组成的部署,仅使用配额的25%似乎是浪费。因此,现在人们开始设置,因此从理论上讲,JVM可以使用MaxRAM的100%。 对于1g的示例,这通常导致堆大小约为900m。这似乎有点高-JVM或其他东西(如远程Shell或进程外
本文向大家介绍生产环境中安全运行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