小编:时间:2023-08-29 01:59:38 来源:火箭下载站整理
很多朋友对于18一19docker和如何设置Docker容器中Java应用的内存限制不太懂,今天就由小编来为大家分享,希望可以帮助到大家,下面一起来看看吧!
当地时间2019年5月6日至8日在美国华盛顿州西雅图举办的Build2019已经圆满落幕。由于没有太多以消费者为中心的新内容和新动向,因此今年的微软开发者大会给人的感觉有点平淡。不过从大会的Session安排来看,微软正在为更宏伟的目标而夯实基础。以下是外媒MSPowerUser对本届Build大会的内容盘点。
MicrosoftEdge
2015年,MicrosoftEdge浏览器以InternetExplorer替代者的身份随Windows10系统一起发布。尽管当时IE浏览器在企业市场依然被广泛使用,但是在消费领域早已被打上了“速度缓慢”、“渲染效果不佳”等的标签,更多用户倾向于Chrome和Firefox等第三方浏览器。
最初MicrosoftEdge基于自己研发的EdgeHTML引擎上,不过近期微软决定转投Chromium,目前已经提供Canary和Dev两个通道,而在前几天Beta通道版本也可以通过官方服务器进行下载
MicrosoftSearch
MicrosoftSearch推出已经有一段时间了,它主要为用户提供统一的网络和本地搜索体验。微软已经宣布MicrosoftSearch将于2019年5月28日正式发布。在改进资源管理员之后,用户将会在传统索引结果中加入来自用户OneDrive在线内容。微软会先面向少数用户开放这项功能,但是会逐渐向更多Insider成员开放。
那么对于用户来说这意味着什么?在获得新体验之后,当用户在资源管理器的搜索框中输入文字,那么在下拉列表中就会看到可供选择的建议文件。用户点击搜索结果中的文件就能直接启动,如果想要打开文件所在的位置,可以右键该条目然后执行相关的操作。如果您需要使用命令或深入挖掘非索引位置,您仍然可以按Enter键并使用传统搜索结果填充视图。
例如某位员工在他公司内搜索某位员工,那么在搜索结果中就会对方的所有可显示内容,包括他的姓名、联系方式和办公地点等等。
区块链
微软和摩根大通在区块链领域增强合作。两家公司共同致力于开发Quorum和以太坊的企业版。
在微软的帮助下,星巴克通过实施从云计算到区块链的先进技术,在其商店中创造了更加个性化,无缝的客户体验。在应用程序中,客户可以通过在MicrosoftAzure中构建和托管的强化学*平台获得量身定制的订单建议。
通过这项技术和星巴克数据科学家的工作,1600万活跃的星巴克会员现在可以根据当地商店库存、热门选择、天气、时间、社区偏好和之前的订单,从应用程序获得有关食品和饮料的精准推荐。此外,通过Azure平台提供的区块链技术,用户可以对每一袋咖啡豆进行溯源查询。
MicrosoftAzure
MicrosoftAzure是Microsoft一直在努力改进的一项服务。他们最近宣布,大约95%的财富500强公司在其组织内的不同服务中使用MicrosoftAzure。微软一直在强调使用隐私和负责任的人工智能。因此,他们宣布了ArtificialIntelligence2.0。有了这个,微软承诺构建基础架构框架,并为开发人员构建负责任的AI提供工具。
Dynamics365
微软正在继续努力发展他们的商业应用开发者社区,他们将充分利用他们的Dynamics365和Power平台。
Microsoft365
凭借MicrosoftGraph和负责任的AI的强大功能,Microsoft正在为其Microsoft365和Office365带来各种智能功能。他们宣布了一项名为IdeasforMicrosoftWord的功能。Ideas将帮助用户设计和呈现精美文档并使用MicrosoftSearch。
WordforWordOnline中的创意,可以帮助您轻松设计和呈现精美文档;MicrosoftSearch,一种新的企业搜索体验,应用Bing的AI技术和MicrosoftGraph提供的深度个性化洞察。
WindowsTerminal
是的,微软已经发布了全新的,现代的,快速,高效,强大且高效的终端应用程序,它将包含所有命令行工具和shell,包括PowerShell,命令提示符和各种风格的WSL。
ElectionGuard
微软已经发布了ElectionGuard,一个软件开发工具包和投票系统的参考实现。这种开源的SDK旨在通过在选举过程中对选民,竞选活动,选举官员和公众的结果公开及验证,帮助保护投票系统并增加公众对选举结果的信任。这套系统是微软与位于波特兰的公司Galois合作开发,该公司专门研究和开发解决计算机科学难题的新技术,并将几个美国政府部门和机构视为其客户。
ElectionGuardSDK将为投票系统供应商提供能够为其系统中的选举提供端到端的可验证性和改进的风险限制审计能力。ElectionGuard参考实现将提供有关如何在Windows10平台上设置系统以获得最大安全性的指导,以及与XboxAdaptiveController集成的现代投票应用程序,以提高可访问性。
DOT.NET5
这将是.NET系列的下一个重要版本。将来只会有一个.NET,您将能够使用它来开发Windows,Linux,macOS,iOS,Android,tvOS,watchOS和WebAssembly等等。
NET5是.NETCore的下一步。该项目旨在通过以下几个关键方式改进.NET:制造一个可在任何地方使用的.NET运行时和框架,并具有统一的运行时行为和开发人员体验。通过充分利用.NETCore、.NETFramework、Xamarin和Mono来扩展.NET的功能。从单个代码库构建该产品,开发人员(Microsoft和社区)可以一起工作并一起扩展,从而改进所有方案。
WindowsSubsystemforLinux2
WSL2附带一个真实的Linux内核,意味着它能够带来完整的系统调用兼容性,且微软能够简单地通过内核更新来对其加以改进,而无需更新整个WindowsLinux子系统。WSL2基于Azure上同样的Linux4.19内核打造,其有助于减少Linux的启动时间,并减少内存的占用。
此外,WSL2提升了文件系统的I/O性能、与Linux的兼容性、且可本机运行Docker容器,因此Windows上的容器将不再需要虚拟机。
如果使用官方的Java镜像,或者基于Java镜像构建的Docker镜像,都可以通过传递JAVA_OPTS环境变量来轻松地设置JVM的内存参数。比如,对于官方Tomcat镜像,我们可以执行下面命令来启动一个最大内存为512M的tomcat实例
dockerrun--rm-eJAVA_OPTS='-Xmx512m'tomcat:8
在日志中,我们可以清楚地发现设置已经生效“Commandlineargument:-Xmx512m”
02-Apr-201612:46:26.970INFO[main]org.apache.catalina.startup.VersionLoggerListener.logServerversion:ApacheTomcat/8.0.32
02-Apr-201612:46:26.974INFO[main]org.apache.catalina.startup.VersionLoggerListener.logServerbuilt:Feb2201619:34:53UTC
02-Apr-201612:46:26.975INFO[main]org.apache.catalina.startup.VersionLoggerListener.logServernumber:8.0.32.0
02-Apr-201612:46:26.975INFO[main]org.apache.catalina.startup.VersionLoggerListener.logOSName:Linux
02-Apr-201612:46:26.975INFO[main]org.apache.catalina.startup.VersionLoggerListener.logOSVersion:4.1.19-boot2docker
02-Apr-201612:46:26.975INFO[main]org.apache.catalina.startup.VersionLoggerListener.logArchitecture:amd64
02-Apr-201612:46:26.975INFO[main]org.apache.catalina.startup.VersionLoggerListener.logJavaHome:/usr/lib/jvm/java-7-openjdk-amd64/jre
02-Apr-201612:46:26.976INFO[main]org.apache.catalina.startup.VersionLoggerListener.logJVMVersion:1.7.0_95-b00
02-Apr-201612:46:26.976INFO[main]org.apache.catalina.startup.VersionLoggerListener.logJVMVendor:OracleCorporation
02-Apr-201612:46:26.977INFO[main]org.apache.catalina.startup.VersionLoggerListener.logCATALINA_BASE:/usr/local/tomcat
02-Apr-201612:46:26.977INFO[main]org.apache.catalina.startup.VersionLoggerListener.logCATALINA_HOME:/usr/local/tomcat
02-Apr-201612:46:26.978INFO[main]org.apache.catalina.startup.VersionLoggerListener.logCommandlineargument:-Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties
02-Apr-201612:46:26.978INFO[main]org.apache.catalina.startup.VersionLoggerListener.logCommandlineargument:-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
02-Apr-201612:46:26.978INFO[main]org.apache.catalina.startup.VersionLoggerListener.logCommandlineargument:-Xmx512m
...
然而在Docker集群上部署运行Java容器应用的时候,仅仅对JVM的heap参数设置是不够的,我们还需要对Docker容器的内存资源进行限制:
1.限制容器使用的内存的最大量,防止对系统或其他应用造成伤害
2.能够将Docker容器调度到拥有足够空余的内存的节点,从而保证应用的所需运行资源
关于容器的资源分配约束,Docker提供了相应的启动参数
对内存而言,最基本的就是通过-m参数来约束容器使用内存的大小
-m,--memory=""
Memorylimit(format:<number>[<unit>]).Numberisapositiveinteger.Unitcanbeoneofb,k,m,org.Minimumis4M.
那么问题就来了,为了正确设置Docker容器内存的大小,难道我们需要同时传递容器的内存限制和JAVA_OPTS环境变量吗?如下所示:
dockerrun--rm-m512m-eJAVA_OPTS='-Xmx512m'tomcat:8
这个方法有两个问题
1.需要管理员保证容器内存和JVM内存设置匹配,否则可能引发错误
2.当对容器内存限制调整时,环境变量也需要重新设定,这就需要重建一个新的容器
是否有一个方法,可以让容器内部的JVM自动适配容器的内存限制?这样可以采用更加统一的方法来进行资源管理,简化配置工作。
大家知道Docker是通过CGroup来实现资源约束的,自从1.7版本之后,Docker把容器的localcgroups以只读方式挂载到容器内部的文件系统上,这样我们就可以在容器内部,通过cgroups信息来获取系统对当前容器的资源限制了。
我创建了一个示例镜像registry.aliyuncs.com/denverdino/tomcat:8-autoheap
,其源代码可以从Github获得。它基于Docker官方Tomcat镜像创建,它的启动脚本会检查CGroup中内存限置,并计算JVM最大Heapsize来传递给Tomcat。其代码如下
#!/bin/bash
limit_in_bytes=$(cat/sys/fs/cgroup/memory/memory.limit_in_bytes)
#Ifnotdefaultlimit_in_bytesincgroup
if["$limit_in_bytes"-ne"9223372036854771712"]
then
limit_in_megabytes=$(expr$limit_in_bytes/1048576)
heap_size=$(expr$limit_in_megabytes-$RESERVED_MEGABYTES)
exportJAVA_OPTS="-Xmx${heap_size}m$JAVA_OPTS"
echoJAVA_OPTS=$JAVA_OPTS
fi
execcatalina.shrun
说明:
为了监控,故障排查等场景,我们预留了部分内存(缺省64M),其余容器内存我们都分配给JVM的堆。
这里没有对边界情况做进一步处理。在生产系统中需要根据情况做相应的设定,比如最大的堆大小等等。
现在我们启动一个tomcat运行在512兆的容器中
dockerrun-d--nametest-m512mregistry.aliyuncs.com/denverdino/tomcat:8-autoheap
通过下列命令,从日志中我们可以检测到相应的JVM参数已经被设置成448MB(512-64)
dockerlogstest
...
02-Apr-201614:18:09.870INFO[main]org.apache.catalina.startup.VersionLoggerListener.logCommandlineargument:-Xmx448m
...
我们也可以方便的调整Java应用的内存.
Docker1.10提供了对容器资源限制的动态修改能力。但是由于JVM无法感知容器资源修改,我们依然需要重启tomcat来变更JVM的内存设置,例如,我们可以通过下面命令把容器内存限制调整到1GB
dockerupdate-m1024mtest
dockerrestarttest
再次检查日志,相应的JVMHeapSize最大值已被设置为960MB
dockerlogstest
...
02-Apr-201614:21:07.644INFO[main]org.apache.catalina.startup.VersionLoggerListener.logCommandlineargument:-Xmx960m
OK,本文到此结束,希望对大家有所帮助。