java 容器限制大小,容器中的Java与内存限制:LXC、Docker与OpenVZ
开发者在使用JVM、内存与Docker时是否遭遇到难题?今天我们将一同利用Jelastic将其解决。最近Matt Willaims提起的Docker内Java及其内存限制的议题得到了广泛关注,而这些在容器使用当中无法避免的状况也在Twitter上引发一系列讨论。
那么在今天的文章中,我们就来共同分析这一问题并尝试找出解决办法。
问题
Matt讲述了他在Docker容器内使用JVM heap时的探索之旅。他指出,容器对于内存的限制未能正确显示,这导致任意Java或其它应用都可分配给该主机设备的全部内存资源,而JVM却无法指示其中有多少资源应该专门用于其运行所在的父容器。如此一来,OutOfMemoryError开始出现。
事实上,大多数Linux工具所提供的系统资源指标在创建时间上要早于cgroups(例如free与top,二者皆源自procps)。其通常会从proc文件系统:/proc/meminfo,/proc/vmstat, /proc/PID/smaps或者其它位置处读取内存指标。
遗憾的是,/proc/meminfo, /proc/vmstat及其它位置无法实现容器化,也就是其无法为cgroup所识别。其只能显示主机系统(物理或虚拟机)的整体内存容量,而现代Linux容器技术无法对其加以利用。容器中的流程无法依靠free、top及其它指标确定所能使用的内存容量;其必须遵循cgroups提供的约束条件,且无法使用主机系统中的全部内存。
事实上,实际内存限制条件的可见性非常重要,我们需要利用其实现应用优化及故障排查,例如内存泄露、交换空间使用、性能下降等等。另外,某些用例还需要利用垂直伸缩以实现容器内的资源使用优化,包括自动变更工作程序、进程或线程数量。垂直伸缩往往取决于特定容器的实际可用内存量,因此必须配合容器中的限制可见性方能起效。
解决方案
开放容器倡议配合runC能够利用文件系统用户空间覆盖/proc文件。LXC创建的lxcfs文件系统允许容器拥有虚拟cgroup文件系统及虚拟/proc文件查看方式,这样上述问题的实质就成了如何对容器进行维护。
我们也遇到过类似的问题,但在Jelastic的帮助下,我们顺利为客户解决了这一障碍。下面来看具体办法。
首先打开Jelastic向导,为测试账户选定服务供应商并利用预定义内存限制创建一套Java Docker容器——例如8 cloudlets,相当于1 GB内存。
接下来前往Jelastic SSH gate(1),选定之前创建的测试环境(2),而后选定该容器(3)。现在我们已经可以利用free工具检查可用内存了(4)。
As we can see, the memory limit equals 1GB defined before. Let’s check the top tool.
一切运行正常。为了进一步检查,我们重复Matt之前提到的Java启发式行为问题。
现在的MaxHeapSize = 268435546 (~256 MiB),意味着当前容器的内存容量为默认JVM heap的四分之一。
其中的秘诀是什么?当然,这是各种“成分”的***结合。在本示例中,我们将OpenVZ与Docker技术结合以提供更出色的安全与隔离控制效果,同时保证其不会影响到容器实时迁移与容器休眠等必要功能。下面,大家可以看到Docker容器在Jelastic当中的高级应用思路。
在OpenVZ中,每套容器都拥有一套/proc pseudo-filesystem虚拟化视图。需要强调的是,容器中的/proc/meminfo为“定制”版本,能够显示每容器信息而非直接提取自主机。如此一来,top与free等工具在运行于容器内时,就能显示特定容器中遵循限制条件时的内存与swap使用情况。
值得注意的是,容器中的swap并非真正的swap,而只是一种虚拟机制(因此其整体技术被称为VSwap)。其核心思路在于,一旦启用了VSwap的某容器超出配置内存限制,则其部分内存即会转换为所谓swap cache。期间并不会发生真正的空间交换,意味着不存在I/O——除非整体环境下出现了全局(而非每容器)内存短缺。另外,使用VSwap的容器会通过降低运行速度的方式解决内存超标,这种方式从容器内部角度来看类似于执行真正的空间交换。这项技术能够对每容器内存与swap使用情况加以有效控制。
当然,除了Jelastic之外,大家也可以根据Matt的提示始终为JVM指定heap大小而非依赖于启发机制。如果各位有其它更好的思路,也请在评论中与我们分享。
原文标题:Java and Memory Limits in Containers: LXC, Docker and OpenVZ
【51CTO.com独家译文,合作站点转载请注明来源。】
【编辑推荐】
【责任编辑:wangxueyan TEL:(010)68476606】
点赞 0
java 容器限制大小,容器中的Java与内存限制:LXC、Docker与OpenVZ相关推荐
- spring 加载java类_在Spring中基于Java类进行配置的完整步骤
在Spring中基于Java类进行配置的完整步骤 发布于 2020-7-7| 复制链接 基于Java配置选项,可以编写大多数的Spring不用配置XML,下面 前言JavaConfig 原来是 Spr ...
- java oca_OCA第7部分中的Java难题
java oca 在OCA系列的Java Puzzlers的这一部分中,我将展示定义字符串和与之相关的潜在惊喜的多种方法. 创建字符串的两种基本类型是使用new关键字和仅使用字符串文字来创建. Str ...
- java铃声类_MediaPlayer.setDataSource中的java.lang.IllegalStateException,使用铃声类
我有一个用户(Samsung Galaxy S5,Android 4.4)报告的崩溃,我不明白发生了什么.这似乎是可以吸收的,但也许有些人遇到了同样的问题,或类似的问题.MediaPlayer.set ...
- java解析shell命令_Android中执行java命令的方法及java代码执行并解析shell命令
这篇文章给大家介绍Android中执行java命令的方法及java代码执行并解析shell命令,需要的朋友一起学习 android中执行java命令的方法大家都晓得吗,下面一段内容给大家带来了具体解析 ...
- js 中 java 代码_在js中嵌套java代码
jsp中有时候在js中操作某些java后台传递过来的数据逻辑比较复杂,比如list内容的遍历,可以直接在页面上添加java脚本来执行内容,代码如下: //在js中插入java代码操作 //取出java ...
- 微信信息回复 java,微信公众平台开发中使用Java如何实现一个消息回复功能
微信公众平台开发中使用Java如何实现一个消息回复功能 发布时间:2020-11-17 16:11:11 来源:亿速云 阅读:82 作者:Leah 本篇文章给大家分享的是有关微信公众平台开发中使用Ja ...
- eclipse中java都乱码怎么办_eclipse中的java代码出现乱码怎么办
eclipse中的java代码出现乱码怎么办 发布时间:2020-06-29 18:11:20 来源:亿速云 阅读:109 作者:Leah eclipse中的java代码出现乱码怎么办?相信很多没有经 ...
- idea java代码格式化_intellij Idea中的Java代码格式化(链式方法调用)
我对Intellij Idea 14.1.4中的 java代码格式有一个小问题. 我有一段由我手动格式化的代码,对我来说很好看: public class Test { private static ...
- java金额比较大小_JAVA中精确计算金额BigDecimal
packagecom.chauvet.utils;importjava.math.BigDecimal;importjava.text.DecimalFormat;importjava.text.Nu ...
最新文章
- 面向汽车应用的硬件推理芯片
- 深度学习有哪些经典数据集?
- Linux的shell scripts的shell脚本练习
- A Network-based End-to-End Trainable Task-oriented Dialogue System
- 想找首歌来表达心情!
- 恒生java开发复试_2019恒生电子面试经验(JAVA开发人员,实施工程师等)
- apk私钥_获取APK证书MD5、SHA1、SHA256等秘钥
- [文档].Altera - Avalon接口规范
- WCF 第二章 契约 系列文章
- 不用到处找图标了!模库承包你所有的图标素材!
- SAP License:SAP传输错误所引起的系统崩溃事件反思
- 碳酸钡颗粒行业调研报告 - 市场现状分析与发展前景预测
- 一起艳恶学习电商项目
- 谷粒商城微服务分布式高级篇十一———商城检索
- 计算机不断自动重启,电脑一直自动重启,手把手教你电脑一直自动重启怎么解决...
- Sqlite3并发读写注意事项
- Ubuntu系统,window系统,利用闲置电脑搭建了一台服务器
- java毕业设计_基于web的医院信息管理系统
- 当前的程序自动修复(automated program repair)工具介绍
- 从零开始学习VIO笔记 --- 第四讲:滑动窗口(基于滑动窗口算法的 VIO 系统:可观性和一致性)
热门文章
- mysql中group concat_mysql中group_concat()函数的使用方法总结
- Oracle、SQL Server、MySQL分页方法
- clientHeight , scrollHeight , offsetHeight之间的区别及兼容方案
- 被IP代理网站屏蔽了,真是跪了
- 那些年,一起学的Java 7-3
- 读写配置文件app.config
- [转]arm汇编相关链接
- Vue自定义指令实现下拉加载:v-loadmore
- 【NOIP2012模拟10.25】旅行
- 解决Caused by: java.lang.NoSuchMethodException: com.mchange.v2.c3p0.cfg.C3P0Config.init()的总结...