成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Kubernetes之路 1 - Java應(yīng)用資源限制的迷思

andycall / 568人閱讀

摘要:本系列文章會記錄阿里云容器服務(wù)團(tuán)隊(duì)在支持客戶中的一些心得體會和最佳實(shí)踐。阿里云服務(wù)全球首批通過一致性認(rèn)證,簡化了集群生命周期管理,內(nèi)置了與阿里云產(chǎn)品集成,也將進(jìn)一步簡化的開發(fā)者體驗(yàn),幫助用戶關(guān)注云端應(yīng)用價值創(chuàng)新。

隨著容器技術(shù)的成熟,越來越多的企業(yè)客戶在企業(yè)中選擇Docker和Kubernetes作為應(yīng)用平臺的基礎(chǔ)。然而在實(shí)踐過程中,還會遇到很多具體問題。本系列文章會記錄阿里云容器服務(wù)團(tuán)隊(duì)在支持客戶中的一些心得體會和最佳實(shí)踐。我們也歡迎您通過郵件和釘釘群和我們聯(lián)系,分享您的思路和遇到的問題。

問題

有些同學(xué)反映:自己設(shè)置了容器的資源限制,但是Java應(yīng)用容器在運(yùn)行中還是會莫名奇妙地被OOM Killer干掉。

這背后一個非常常見的原因是:沒有正確設(shè)置容器的資源限制以及對應(yīng)的JVM的堆空間大小。

我們拿一個tomcat應(yīng)用為例,其實(shí)例代碼和Kubernetes部署文件可以從Github中獲得。

git clone https://github.com/denverdino/system-info
cd system-info`

下面是一個Kubernetes的Pod的定義描述:

Pod中的app是一個初始化容器,負(fù)責(zé)把一個JSP應(yīng)用拷貝到 tomcat 容器的 “webapps”目錄下。注:
鏡像中JSP應(yīng)用index.jsp用于顯示JVM和系統(tǒng)資源信息。

tomcat 容器會保持運(yùn)行,而且我們限制了容器最大的內(nèi)存用量為256MB內(nèi)存。

apiVersion: v1
kind: Pod
metadata:
  name: test
spec:
  initContainers:
  - image: registry.cn-hangzhou.aliyuncs.com/denverdino/system-info
    name: app
    imagePullPolicy: IfNotPresent
    command:
      - "cp"
      - "-r"
      - "/system-info"
      - "/app"
    volumeMounts:
    - mountPath: /app
      name: app-volume
  containers:
  - image: tomcat:9-jre8
    name: tomcat
    imagePullPolicy: IfNotPresent
    volumeMounts:
    - mountPath: /usr/local/tomcat/webapps
      name: app-volume
    ports:
    - containerPort: 8080
    resources:
      requests:
        memory: "256Mi"
        cpu: "500m"
      limits:
        memory: "256Mi"
        cpu: "500m"
  volumes:
  - name: app-volume
    emptyDir: {}

我們執(zhí)行如下命令來部署、測試應(yīng)用

$ kubectl create -f test.yaml
pod "test" created
$ kubectl get pods test
NAME      READY     STATUS    RESTARTS   AGE
test      1/1       Running   0          28s
$ kubectl exec test curl http://localhost:8080/system-info/
...

我們可以看到HTML格式的系統(tǒng)CPU/Memory等信息,我們也可以用 html2text 命令將其轉(zhuǎn)化成為文本格式。

注意:本文是在一個 2C 4G的節(jié)點(diǎn)上進(jìn)行的測試,在不同環(huán)境中測試輸出的結(jié)果會有所不同

$ kubectl exec test curl http://localhost:8080/system-info/ | html2text

Java version     Oracle Corporation 1.8.0_162
Operating system Linux 4.9.64
Server           Apache Tomcat/9.0.6
Memory           Used 29 of 57 MB, Max 878 MB
Physica Memory   3951 MB
CPU Cores        2
                                          **** Memory MXBean ****
Heap Memory Usage     init = 65011712(63488K) used = 19873704(19407K) committed
                      = 65536000(64000K) max = 921174016(899584K)
Non-Heap Memory Usage init = 2555904(2496K) used = 32944912(32172K) committed =
                      33882112(33088K) max = -1(-1K)
                  

我們可以發(fā)現(xiàn),容器中看到的系統(tǒng)內(nèi)存是 3951MB,而JVM Heap Size最大是 878MB。納尼?!我們不是設(shè)置容器資源的容量為256MB了嗎?如果這樣,當(dāng)應(yīng)用內(nèi)存的用量超出了256MB,JVM還沒對其進(jìn)行GC,而JVM進(jìn)程就會被系統(tǒng)直接OOM干掉了。

問題的根源在于:

對于JVM而言,如果沒有設(shè)置Heap Size,就會按照宿主機(jī)環(huán)境的內(nèi)存大小缺省設(shè)置自己的最大堆大小。

Docker容器利用CGroup對進(jìn)程使用的資源進(jìn)行限制,而在容器中的JVM依然會利用宿主機(jī)環(huán)境的內(nèi)存大小和CPU核數(shù)進(jìn)行缺省設(shè)置,這導(dǎo)致了JVM
Heap的錯誤計(jì)算。

類似,JVM缺省的GC、JIT編譯線程數(shù)量取決于宿主機(jī)CPU核數(shù)。如果我們在一個節(jié)點(diǎn)上運(yùn)行多個Java應(yīng)用,即使我們設(shè)置了CPU的限制,應(yīng)用之間依然有可能因?yàn)镚C線程搶占切換,導(dǎo)致應(yīng)用性能收到影響。

了解了問題的根源,我們就可以非常簡單地解決問題了

解決思路

開啟CGroup資源感知

Java社區(qū)也關(guān)注到這個問題,并在JavaSE8u131+和JDK9 支持了對容器資源限制的自動感知能力 https://blogs.oracle.com/java...

其用法就是添加如下參數(shù)

java -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap …

我們在上文示例的tomcat容器添加環(huán)境變量 “JAVA_OPTS”參數(shù)

apiVersion: v1
kind: Pod
metadata:
  name: cgrouptest
spec:
  initContainers:
  - image: registry.cn-hangzhou.aliyuncs.com/denverdino/system-info
    name: app
    imagePullPolicy: IfNotPresent
    command:
      - "cp"
      - "-r"
      - "/system-info"
      - "/app"
    volumeMounts:
    - mountPath: /app
      name: app-volume
  containers:
  - image: tomcat:9-jre8
    name: tomcat
    imagePullPolicy: IfNotPresent
    env:
    - name: JAVA_OPTS
      value: "-XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap"
    volumeMounts:
    - mountPath: /usr/local/tomcat/webapps
      name: app-volume
    ports:
    - containerPort: 8080
    resources:
      requests:
        memory: "256Mi"
        cpu: "500m"
      limits:
        memory: "256Mi"
        cpu: "500m"
  volumes:
  - name: app-volume
    emptyDir: {}

我們部署一個新的Pod,并重復(fù)相應(yīng)的測試

$ kubectl create -f cgroup_test.yaml
pod "cgrouptest" created

$ kubectl exec cgrouptest curl http://localhost:8080/system-info/ | html2txt
Java version     Oracle Corporation 1.8.0_162
Operating system Linux 4.9.64
Server           Apache Tomcat/9.0.6
Memory           Used 23 of 44 MB, Max 112 MB
Physica Memory   3951 MB
CPU Cores        2
                                          **** Memory MXBean ****
Heap Memory Usage     init = 8388608(8192K) used = 25280928(24688K) committed =
                      46661632(45568K) max = 117440512(114688K)
Non-Heap Memory Usage init = 2555904(2496K) used = 31970840(31221K) committed =
                      32768000(32000K) max = -1(-1K)

我們看到JVM最大的Heap大小變成了112MB,這很不錯,這樣就能保證我們的應(yīng)用不會輕易被OOM了。隨后問題又來了,為什么我們設(shè)置了容器最大內(nèi)存限制是256MB,而JVM只給Heap設(shè)置了112MB的最大值呢?

這就涉及到JVM的內(nèi)存管理的細(xì)節(jié)了,JVM中的內(nèi)存消耗包含Heap和Non-Heap兩類;類似Class的元信息,JIT編譯過的代碼,線程堆棧(thread stack),GC需要的內(nèi)存空間等都屬于Non-Heap內(nèi)存,所以JVM還會根據(jù)CGroup的資源限制預(yù)留出部分內(nèi)存給Non Heap,來保障系統(tǒng)的穩(wěn)定。(在上面的示例中我們可以看到,tomcat啟動后Non Heap占用了近32MB的內(nèi)存)

在最新的JDK 10中,又對JVM在容器中運(yùn)行做了進(jìn)一步的優(yōu)化和增強(qiáng)。

容器內(nèi)部感知CGroup資源限制

如果無法利用JDK 8/9的新特性,比如還在使用JDK6的老應(yīng)用,我們還可以在容器內(nèi)部利用腳本來獲取容器的CGroup資源限制,并通過設(shè)置JVM的Heap大小。

Docker1.7開始將容器cgroup信息掛載到容器中,所以應(yīng)用可以從 /sys/fs/cgroup/memory/memory.limit_in_bytes 等文件獲取內(nèi)存、 CPU等設(shè)置,在容器的應(yīng)用啟動命令中根據(jù)Cgroup配置正確的資源設(shè)置 -Xmx, -XX:ParallelGCThreads等參數(shù)

在 https://yq.aliyun.com/article... 一文中已經(jīng)有相應(yīng)的示例和代碼,本文不再贅述

總結(jié)

本文分析了Java應(yīng)用在容器使用中一個常見Heap設(shè)置的問題。容器與虛擬機(jī)不同,其資源限制通過CGroup來實(shí)現(xiàn)。而容器內(nèi)部進(jìn)程如果不感知CGroup的限制,就進(jìn)行內(nèi)存、CPU分配可能導(dǎo)致資源沖突和問題。

我們可以非常簡單地利用JVM的新特性和自定義腳本來正確設(shè)置資源限制。這個可以解決絕大多數(shù)資源限制的問題。

關(guān)于容器應(yīng)用中資源限制還有一類問題是,一些比較老的監(jiān)控工具或者free/top等系統(tǒng)命令,在容器中運(yùn)行時依然會獲取到宿主機(jī)的CPU和內(nèi)存,這導(dǎo)致了一些監(jiān)控工具在容器中運(yùn)行時無法正常計(jì)算資源消耗。社區(qū)中常見的做法是利用 lxcfs 來讓容器在資源可見性的行為和虛機(jī)保持一致,后續(xù)文章會介紹其在Kubernetes上的使用方案。

阿里云Kubernetes服務(wù) 全球首批通過Kubernetes一致性認(rèn)證,簡化了Kubernetes集群生命周期管理,內(nèi)置了與阿里云產(chǎn)品集成,也將進(jìn)一步簡化Kubernetes的開發(fā)者體驗(yàn),幫助用戶關(guān)注云端應(yīng)用價值創(chuàng)新。

原文作者:易立

原文鏈接

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/27230.html

相關(guān)文章

  • Kubernetes之路 1 - Java應(yīng)用資源限制迷思

    摘要:本系列文章會記錄阿里云容器服務(wù)團(tuán)隊(duì)在支持客戶中的一些心得體會和最佳實(shí)踐。阿里云服務(wù)全球首批通過一致性認(rèn)證,簡化了集群生命周期管理,內(nèi)置了與阿里云產(chǎn)品集成,也將進(jìn)一步簡化的開發(fā)者體驗(yàn),幫助用戶關(guān)注云端應(yīng)用價值創(chuàng)新。 showImg(https://segmentfault.com/img/bV6FTH?w=740&h=296); 隨著容器技術(shù)的成熟,越來越多的企業(yè)客戶在企業(yè)中選擇Dock...

    iliyaku 評論0 收藏0
  • Kubernetes之路 2 - 利用LXCFS提升容器資源可見性

    摘要:簡介社區(qū)中常見的做法是利用來提供容器中的資源可見性。從而使得應(yīng)用獲得正確的資源約束設(shè)定。阿里云服務(wù)全球首批通過一致性認(rèn)證,簡化了集群生命周期管理,內(nèi)置了與阿里云產(chǎn)品集成,也將進(jìn)一步簡化的開發(fā)者體驗(yàn),幫助用戶關(guān)注云端應(yīng)用價值創(chuàng)新。 摘要: 這是本系列的第2篇內(nèi)容,將介紹在Docker和Kubernetes環(huán)境中解決遺留應(yīng)用無法識別容器資源限制的問題。 showImg(https://se...

    graf 評論0 收藏0
  • Kubernetes 2018 年度簡史

    摘要:同時該版本在安全性和等關(guān)鍵功能上作出了改進(jìn)年月日,發(fā)布。盡管谷歌這些年來是的主要貢獻(xiàn)者,但現(xiàn)在其他技術(shù)人員在這個項(xiàng)目上的貢獻(xiàn)量已經(jīng)幾乎和谷歌持平了。這些舉動都在表明云計(jì)算市場的戰(zhàn)火將繼續(xù)蔓延,已經(jīng)成為兵家必爭之地。年月日,宣布推出。 Kubernetes 在過去幾年中一直是云計(jì)算領(lǐng)域最著名的開源項(xiàng)目之一。20...

    gougoujiang 評論0 收藏0
  • 三分天下,分久必合:IBMKubernetes on Mesos探索之路

    摘要:今天是數(shù)人云容器三國演義嘉賓演講實(shí)錄第四彈。說完了各家容器技術(shù)的實(shí)戰(zhàn),那么最后來看容器技術(shù)的融合正在探索的一條道路。月,開始接手,因?yàn)檎麄€產(chǎn)品都是基于這個為基礎(chǔ)的。下面是的地址,到可以找到相關(guān)的資料。但這時候是分開的,不同的使用不同的框架。 今天是數(shù)人云容器三國演義Meetup嘉賓演講實(shí)錄第四彈。說完了各家容器技術(shù)的實(shí)戰(zhàn),那么最后來看容器技術(shù)的融合——IBM正在探索的一條道路。 我叫馬...

    miguel.jiang 評論0 收藏0
  • 三分天下,分久必合:IBMKubernetes on Mesos探索之路

    摘要:今天是數(shù)人云容器三國演義嘉賓演講實(shí)錄第四彈。說完了各家容器技術(shù)的實(shí)戰(zhàn),那么最后來看容器技術(shù)的融合正在探索的一條道路。月,開始接手,因?yàn)檎麄€產(chǎn)品都是基于這個為基礎(chǔ)的。下面是的地址,到可以找到相關(guān)的資料。但這時候是分開的,不同的使用不同的框架。 今天是數(shù)人云容器三國演義Meetup嘉賓演講實(shí)錄第四彈。說完了各家容器技術(shù)的實(shí)戰(zhàn),那么最后來看容器技術(shù)的融合——IBM正在探索的一條道路。 我叫馬...

    Charles 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<