开发者在使用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相关推荐

  1. spring 加载java类_在Spring中基于Java类进行配置的完整步骤

    在Spring中基于Java类进行配置的完整步骤 发布于 2020-7-7| 复制链接 基于Java配置选项,可以编写大多数的Spring不用配置XML,下面 前言JavaConfig 原来是 Spr ...

  2. java oca_OCA第7部分中的Java难题

    java oca 在OCA系列的Java Puzzlers的这一部分中,我将展示定义字符串和与之相关的潜在惊喜的多种方法. 创建字符串的两种基本类型是使用new关键字和仅使用字符串文字来创建. Str ...

  3. java铃声类_MediaPlayer.setDataSource中的java.lang.IllegalStateException,使用铃声类

    我有一个用户(Samsung Galaxy S5,Android 4.4)报告的崩溃,我不明白发生了什么.这似乎是可以吸收的,但也许有些人遇到了同样的问题,或类似的问题.MediaPlayer.set ...

  4. java解析shell命令_Android中执行java命令的方法及java代码执行并解析shell命令

    这篇文章给大家介绍Android中执行java命令的方法及java代码执行并解析shell命令,需要的朋友一起学习 android中执行java命令的方法大家都晓得吗,下面一段内容给大家带来了具体解析 ...

  5. js 中 java 代码_在js中嵌套java代码

    jsp中有时候在js中操作某些java后台传递过来的数据逻辑比较复杂,比如list内容的遍历,可以直接在页面上添加java脚本来执行内容,代码如下: //在js中插入java代码操作 //取出java ...

  6. 微信信息回复 java,微信公众平台开发中使用Java如何实现一个消息回复功能

    微信公众平台开发中使用Java如何实现一个消息回复功能 发布时间:2020-11-17 16:11:11 来源:亿速云 阅读:82 作者:Leah 本篇文章给大家分享的是有关微信公众平台开发中使用Ja ...

  7. eclipse中java都乱码怎么办_eclipse中的java代码出现乱码怎么办

    eclipse中的java代码出现乱码怎么办 发布时间:2020-06-29 18:11:20 来源:亿速云 阅读:109 作者:Leah eclipse中的java代码出现乱码怎么办?相信很多没有经 ...

  8. idea java代码格式化_intellij Idea中的Java代码格式化(链式方法调用)

    我对Intellij Idea 14.1.4中的 java代码格式有一个小问题. 我有一段由我手动格式化的代码,对我来说很好看: public class Test { private static ...

  9. java金额比较大小_JAVA中精确计算金额BigDecimal

    packagecom.chauvet.utils;importjava.math.BigDecimal;importjava.text.DecimalFormat;importjava.text.Nu ...

最新文章

  1. 面向汽车应用的硬件推理芯片
  2. 深度学习有哪些经典数据集?
  3. Linux的shell scripts的shell脚本练习
  4. A Network-based End-to-End Trainable Task-oriented Dialogue System
  5. 想找首歌来表达心情!
  6. 恒生java开发复试_2019恒生电子面试经验(JAVA开发人员,实施工程师等)
  7. apk私钥_获取APK证书MD5、SHA1、SHA256等秘钥
  8. [文档].Altera - Avalon接口规范
  9. WCF 第二章 契约 系列文章
  10. 不用到处找图标了!模库承包你所有的图标素材!
  11. SAP License:SAP传输错误所引起的系统崩溃事件反思
  12. 碳酸钡颗粒行业调研报告 - 市场现状分析与发展前景预测
  13. 一起艳恶学习电商项目
  14. 谷粒商城微服务分布式高级篇十一———商城检索
  15. 计算机不断自动重启,电脑一直自动重启,手把手教你电脑一直自动重启怎么解决...
  16. Sqlite3并发读写注意事项
  17. Ubuntu系统,window系统,利用闲置电脑搭建了一台服务器
  18. java毕业设计_基于web的医院信息管理系统
  19. 当前的程序自动修复(automated program repair)工具介绍
  20. 从零开始学习VIO笔记 --- 第四讲:滑动窗口(基于滑动窗口算法的 VIO 系统:可观性和一致性)

热门文章

  1. mysql中group concat_mysql中group_concat()函数的使用方法总结
  2. Oracle、SQL Server、MySQL分页方法
  3. clientHeight , scrollHeight , offsetHeight之间的区别及兼容方案
  4. 被IP代理网站屏蔽了,真是跪了
  5. 那些年,一起学的Java 7-3
  6. 读写配置文件app.config
  7. [转]arm汇编相关链接
  8. Vue自定义指令实现下拉加载:v-loadmore
  9. 【NOIP2012模拟10.25】旅行
  10. 解决Caused by: java.lang.NoSuchMethodException: com.mchange.v2.c3p0.cfg.C3P0Config.init()的总结...