本篇文章給大家談?wù)勛詣?dòng)化測(cè)試腳本容器,以及自動(dòng)化測(cè)試腳本的結(jié)果檢查方***對(duì)應(yīng)的知識(shí)點(diǎn),希望對(duì)各位有所幫助,不要忘了收***本站喔。 今天給各位分享自動(dòng)化測(cè)試腳本容器的知識(shí),其中也會(huì)對(duì)自動(dòng)化測(cè)試腳本的結(jié)果檢查方***進(jìn)行解釋?zhuān)绻芘銮山鉀Q***現(xiàn)在面臨的問(wèn)題,別忘了關(guān)注本站,現(xiàn)在開(kāi)始吧!
1、如何設(shè)置Docker容器中J*a應(yīng)用的內(nèi)存限制?
如果使用官方的J*a鏡像,或者基于J*a鏡像構(gòu)建的Docker鏡像,都可以通過(guò)傳遞 J*A_OPTS 環(huán)境變量來(lái)輕松地設(shè)置JVM的內(nèi)存參數(shù)。比如,對(duì)于官方Tomcat 鏡像,我們可以執(zhí)行下面命令來(lái)啟動(dòng)一個(gè)最大內(nèi)存為512M的tomcat實(shí)例
docker run --rm -e J*A_OPTS='-Xmx512m' tomcat:8
在日志中,我們可以清楚地發(fā)現(xiàn)設(shè)置已經(jīng)生效 “Command line argument: -Xmx512m”
02-Apr-2016 12:46:26.*0 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version: Apache Tomcat/8.0.32
02-Apr-2016 12:46:26.*4 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server built: Feb 2 2016 19:34:53 UTC
02-Apr-2016 12:46:26.*5 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server number: 8.0.32.0
02-Apr-2016 12:46:26.*5 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Name: Linux
02-Apr-2016 12:46:26.*5 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Version: 4.1.19-boot2docker
02-Apr-2016 12:46:26.*5 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Architecture: amd64
02-Apr-2016 12:46:26.*5 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log J*a Home: /usr/lib/jvm/j*a-7-openjdk-amd64/jre
02-Apr-2016 12:46:26.*6 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Version: 1.7.0_95-b00
02-Apr-2016 12:46:26.*6 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Vendor: Oracle Corporation
02-Apr-2016 12:46:26.*7 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_BASE: /usr/local/tomcat
02-Apr-2016 12:46:26.*7 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_HOME: /usr/local/tomcat
02-Apr-2016 12:46:26.*8 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dj*a.util.logging.config.file=/usr/local/tomcat/conf/logging.properties
02-Apr-2016 12:46:26.*8 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dj*a.util.logging.man*er=org.apache.juli.ClassLoaderLogMan*er
02-Apr-2016 12:46:26.*8 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Xmx512m
...
然而在Docker集群上部署運(yùn)行J*a容器應(yīng)用的時(shí)候,僅僅對(duì)JVM的heap參數(shù)設(shè)置是不夠的,我們還需要對(duì)Docker容器的內(nèi)存**進(jìn)行限制:
1. 限制容器使用的內(nèi)存的最大量,防止對(duì)系統(tǒng)或其他應(yīng)用造成傷害
2. 能夠?qū)ocker容器調(diào)度到擁有足夠空余的內(nèi)存的節(jié)點(diǎn),從而保證應(yīng)用的所需運(yùn)行**
關(guān)于容器的**分配約束,Docker提供了相應(yīng)的啟動(dòng)參數(shù)
對(duì)內(nèi)存而言,最基本的就是通過(guò) -m參數(shù)來(lái)約束容器使用內(nèi)存的大小
-m, --memory=""
Memory limit (format:
那么問(wèn)題就來(lái)了,為了正確設(shè)置Docker容器內(nèi)存的大小,難***我們需要同時(shí)傳遞容器的內(nèi)存限制和J*A_OPTS環(huán)境變量嗎? 如下所示:
docker run --rm -m 512m -e J*A_OPTS='-Xmx512m' tomcat:8
這個(gè)方***有兩個(gè)問(wèn)題
1. 需要管理員保證容器內(nèi)存和JVM內(nèi)存設(shè)置匹配,否則可能引發(fā)錯(cuò)誤
2. 當(dāng)對(duì)容器內(nèi)存限制調(diào)整時(shí),環(huán)境變量也需要重新設(shè)定,這就需要重建一個(gè)新的容器
是否有一個(gè)方***,可以讓容器內(nèi)部的JVM自動(dòng)適配容器的內(nèi)存限制?這樣可以***用更加統(tǒng)一的方***來(lái)進(jìn)行**管理,簡(jiǎn)化配置工作。
大家知***Docker是通過(guò)CGroup來(lái)實(shí)現(xiàn)**約束的,自從1.7版本之后,Docker把容器的local cgroups以只讀方式掛載到容器內(nèi)部的文件系統(tǒng)上,這樣我們就可以在容器內(nèi)部,通過(guò)cgroups信息來(lái)獲取系統(tǒng)對(duì)當(dāng)前容器的**限制了。
我創(chuàng)建了一個(gè)示例鏡像 registry.aliyuncs**/denverdino/tomcat:8-autoheap
,其源***碼可以從Github 獲得。它基于Docker官方Tomcat鏡像創(chuàng)建,它的啟動(dòng)腳本會(huì)檢查CGroup中內(nèi)存限置,并計(jì)算JVM最大Heap size來(lái)傳遞給Tomcat。其***碼如下
#!/bin/bash
limit_in_bytes=$(cat /sys/fs/cgroup/memory/memory.limit_in_bytes)
# If not default limit_in_bytes in cgroup
if [ "$limit_in_bytes" -ne "9223372036854771712" ]
then
limit_in_megabytes=$(expr $limit_in_bytes \/ 1048576)
heap_size=$(expr $limit_in_megabytes - $RESERVED_MEGABYTES)
export J*A_OPTS="-Xmx${heap_size}m $J*A_OPTS"
echo J*A_OPTS=$J*A_OPTS
fi
exec catalina.sh run
說(shuō)明:
為了監(jiān)控,故障排查等場(chǎng)景,我們預(yù)留了部分內(nèi)存(缺省64M),其余容器內(nèi)存我們都分配給JVM的堆。
這里沒(méi)有對(duì)邊界情況做進(jìn)一步處理。在生產(chǎn)系統(tǒng)中需要根據(jù)情況做相應(yīng)的設(shè)定,比如最大的堆大小等等。
現(xiàn)在我們啟動(dòng)一個(gè)tomcat運(yùn)行在512兆的容器中
docker run -d --name test -m 512m registry.aliyuncs**/denverdino/tomcat:8-autoheap
通過(guò)下列命令,從日志中我們可以檢測(cè)到相應(yīng)的JVM參數(shù)已經(jīng)被設(shè)置成 448MB (512-64)
docker logs test
...
02-Apr-2016 14:18:09.870 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Xmx448m
...
我們也可以方便的調(diào)整J*a應(yīng)用的內(nèi)存.
Docker 1.10提供了對(duì)容器**限制的動(dòng)態(tài)修改能力。但是由于JVM無(wú)***感知容器**修改,我們依然需要重啟tomcat來(lái)變更JVM的內(nèi)存設(shè)置,例如,我們可以通過(guò)下面命令把容器內(nèi)存限制調(diào)整到1GB
docker update -m **m test
docker restart test
再次檢查日志,相應(yīng)的JVM Heap Size最大值已被設(shè)置為960MB
docker logs test
...
02-Apr-2016 14:21:07.644 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Xmx960m
到此,以上就是小編對(duì)于自動(dòng)化測(cè)試腳本容器的問(wèn)題就介紹到這了,希望介紹關(guān)于自動(dòng)化測(cè)試腳本容器的1點(diǎn)解答對(duì)大家有用。