.NET和Docker ,比翼雙飛

DockerCon 2019本週將在舊金山舉行 ,DockerCon 是從業者、貢獻者、維護者、開發者和容器生態系統學習、網絡和創新的一站式活動。 .NET 團隊博客發佈了《一塊兒使用.NET和Docker - DockerCon 2019更新》,分享.NET團隊如何在過去一年中改進使用.NET和Docker的經驗。.NET團隊去年改進.NET Core Docker體驗的大部分工做都集中在.NET Core 3.0上。.NET Core 3.0 是第一個發佈實質性運行時更改以使CoreCLR更有效的支持Docker資源限制,並提供更多配置供您調整的版本。java

.NET 團隊致力於使.NET Core成爲真正的容器運行時。在過去的版本中,咱們認爲.NET Core是容器友好的。.NET 團隊如今正在增強運行時,使其在低內存環境中具備容器感知功能並高效運行。 咱們作出的最基本的改變是減小CoreCLR默認使用的內存,在過去的幾個版本中,.NET 團隊付出了不少努力來改進.NET Core在TechEmpower基準測試中的表現。使用.NET Core 3.0,.NET 團隊找到了顯着提升性能並減小大量使用內存的方法。.NET 團隊如今在容量限制爲大約150 MB的容器中運行TechEmpower純文本基準測試,同時每秒處理數百萬個請求,這使咱們可以天天驗證內存受限的狀況。docker

說到Docker,我對.NET Core搭配 Docker的使用很是滿意,.NET Core 3.0的到來會更加美好,再借助於kubernetes的協調,咱們的生活會愈來愈美好。編程

可是長久以來,Docker 和 Java 就像一對「歡喜冤家」。一方面,容器技術的「不可變基礎設施」特性爲開發者帶來了無比寶貴的依賴與環境一致性保證;但另外一方面, Linux 容器經過 Cgroups 對應用進行資源限制的方式跟全部依賴於 JVM 進行資源分配的編程語言都產生了本質的衝突。我在客戶諮詢的過程當中常常見到客戶的基於java8的應用程序(國內大量的Java應用都是java8)在docker中運行時出現「隨機」故障?或者也許是一些奇怪的死機?二者均可能是Java 8(仍普遍使用的)中糟糕的docker支持引發的。Docker使用控制組(cgroups)來限制資源。在容器中運行應用程序時限制內存和CPU絕對是個好主意――它能夠阻止應用程序佔用整個可用內存及/或CPU,這會致使在同一個系統上運行的其餘容器毫無反應。限制資源可提升應用程序的可靠性和穩定性。它還容許爲硬件容量做好規劃。在Kubernetes或DC/OS之類的編排系統上運行容器時尤其重要。網絡

JVM能夠「看到」系統上的整個內存和可用的全部CPU核心,並確保與資源一致。它默認狀況下將最大堆大小(heap size)設置爲系統內存的1/4,並將某些線程池大小(好比針對GC)設置爲物理核心數量,咱們在擁有64GB內存的系統上運行,默認的最大堆大小是物理內存的1/4即16GB。若是咱們使用docker cgroups限制內存,會發生什麼,JVM進程被殺死了。因爲它是一個子進程――容器自己倖存下來,但一般當java是容器(PID 1)內的惟一進程時,容器會崩潰。編程語言

CPU怎麼樣? 系統上的確有12個CPU。所以,即便可用處理器的數量限制爲1,JVM也會嘗試使用12 , Java8和Docker的相殺,可是若是你升級到新的Java版本(10及以上版本)已經內置了docker支持功能。但有時升級不是辦法,好比說若是應用程序與新JVM不兼容就不行,並且Oracle在2019年4月更改了Java 8更新的許可證,自Java SE 8 Update 211以來商業使用再也不免費。 不過也有好消息,而就在上週,最近發佈的OpenJDK 鏡像 openjdk:8u212-jdk 終於可以讓 Java 8 運行時在容器裏面爲應用分配出合理的 CPU 數目和堆棧大小了,具體能夠參考 https://blog.softwaremill.com/docker-support-in-new-java-8-finally-fd595df0ca54模塊化

從Oracle JDK 8 切換到OpenJDK 8 是想繼續使用Java的好選擇,不過我仍是勸告你們能夠考慮下.NET Core 了,新的項目能夠採用.NET Core 2.2進行開發,半年後就能夠轉到.NET Core 3.0 .NET Core是以MIT協議開源, Java是GPL協議開源。 Java 8 SDK升級Oracle要收費這件事對於不少小公司是有着重大的影響的。衆多沒有能力開發維護OpenJDK的公司徹底能夠轉向更具備競爭力的.NET Core,.NET Core從屬於.NET基金會,由微軟進行官方支持。使用最寬鬆的MIT和Apache 2開源協議,文檔協議遵循CC-BY。這將容許任何人任何組織和企業任意處置,包括使用,複製,修改,合併,發表,分發,再受權,或者銷售。惟一的限制是,軟件中必須包含上述版 權和許可提示,後者協議將會除了爲用戶提供版權許可以外,還有專利許可,而且受權是免費,無排他性的(任何我的和企業都能得到受權)而且永久不可撤銷,用戶使用.NET Core徹底不用擔憂收費問題,你能夠很自由的部署在任何地方。性能

如今是雲計算時代,.NET Core已經磨練5年時間,準備好了迎接雲計算時代的雲原生應用開發,雲系統中,用更少的硬件爲更高密度的用戶提供服務是很是重要的。應用程序的佔位面積越小,密度越高。容器只包含應用程序及其依賴項。文件大小要小不少倍,啓動時間以秒爲單位,只有應用程序加載到內存中,容器保證在任何主機上工做。鑑於容器的明顯優點,.NET Core的設計決定之一就是使其成爲模塊化。這意味着你的.NET Core應用程序能夠被"發佈",使得它和它的全部依賴關係在一個地方,這很容易放入容器學習

相關文章
相關標籤/搜索