歡迎光臨
每天分享高質量文章

.NET和Docker ,比翼雙飛

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

.NET 團隊致力於使.NET Core成為真正的容器運行時。在過去的版本中,我們認為.NET Core是容器友好的。.NET 團隊現在正在加強運行時,使其在低記憶體環境中具有容器感知功能並高效運行。 我們做出的最基本的改變是減少CoreCLR預設使用的記憶體,在過去的幾個版本中,.NET 團隊付出了很多努力來改進.NET Core在TechEmpower基準測試中的表現。使用.NET Core 3.0,.NET 團隊找到了顯著提高性能並減少大量使用記憶體的方法。.NET 團隊現在在容量限製為大約150 MB的容器中運行TechEmpower純文本基準測試,同時每秒處理數百萬個請求,這使我們能夠每天驗證記憶體受限的情況。

說到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?spm=a2c4e.11153940.blogcont700628.17.10fb43bf5u3n1d。

從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應用程式可以被”發佈”,使得它和它的所有依賴關係在一個地方,這很容易放入容器

已同步到看一看
赞(0)

分享創造快樂