.NET 云原生技术使用调查
.NET Core 3.0?即將發(fā)布RC,.NET Core 3.0默認更好的支持Docker資源限制,官方團隊也在努力讓.NET Core成為真正的容器運行時,使其在低內存環(huán)境中具有容器感知功能并高效運行。
GC堆限制
.NET Core減少了CoreCLR默認使用的內存,如G0代內存分配預算,以更好地與現代處理器緩存大小和緩存層次結構保持一致。
在新的創(chuàng)建的GC堆數量的策略里,GC保留了一個內存片段,每個堆最小是16M,在低內存限制的機器上也可以很好的運行。在多核CPU的機器上運行時,系統(tǒng)并沒有設置CPU的核數限制。例如,如果在48核計算機上設置160 MB內存限制,則不需要創(chuàng)建48個GC堆。也就是說如果設置160 MB限制,則只會創(chuàng)建10個GC堆。如果未設置CPU限制,應用程序可以利用計算機上的所有核心。
有了這樣的新策略,可以不需要啟用Docker環(huán)境下的.NET Core應用的工作站GC的工作負載。
支持Docker內存限制
Docker資源限制建立在cgroup之上,而cgroup是Linux的內核功能。從運行時的角度來看,我們需要定位cgroup原語。
設置cgroup限制時的.NET Core 3.0內存使用規(guī)則:
默認GC堆大小:容器上cgroup內存限制的最大值20MB或最大值的75%
每個GC堆的最小保留段大小16MB,這將減少在具有大量內核和小內存限制的計算機上創(chuàng)建的堆數
為了支持容器方案,添加了2個HardLimit配置:
GCHeapHardLimit - 指定GC堆的硬限制
GCHeapHardLimitPercent - 指定允許此進程使用的物理內存的百分比
如果同時指定了兩者,則首先檢查GCHeapHardLimit,并且只有在未指定GCHeapHardLimit時才檢查GCHeapHardLimitPercent。
如果兩者都未指定,但進程正在有內存限制的容器中運行,則默認是使用如下設置:
max(20mb,容器內存限制的75%)
如果指定了hardlimit配置,并且程序在有內存限制的容器中使用,GC堆的使用不會超過hardlimit限制,但總內存仍然受容器的內存限制。所以當我們統(tǒng)計內存消耗時,基于容器內存限制得出的數據。
舉例:
進程在設置了200MB限制的容器中運行,用戶還將GCHeapHardLimit配置為100MB。
如果把GC限制中100MB限制中的50MB用于GC,而容器限制中剩余的100MB用于其他用途,那么內存消耗即為(50+100)/200=75%。
GC將更積極地執(zhí)行資源回收與釋放,因為GC堆越接近GCHeapHardLimit限制,就越能實現提供更多可用內存的目標,也越能使得應用程序可以繼續(xù)而又安全地運行。如果算法計算出的結果認為此時的GC效率低下,那么將避免持續(xù)執(zhí)行完全阻塞的GC。
即使GC堆完全壓縮,GC依然會拋出一個OutOfMemoryException異常出來,這是因為所分配的堆大小超過了GCHeapHardLimit的限制。
由此可見,.NET Core 3.0的設計是要穩(wěn)定運行于有資源限制的容器中。
支持DockerCPU限制
在CPU限制的情況下,Docker上設置的值將向上舍入為下一個整數值。此值是CoreCLR使用的最大有效CPU核數。
默認情況下,ASP.NET Core應用程序啟用了服務器GC(它不適用于控制臺應用程序),因為它可以實現高吞吐量并減少跨核心的爭用。當進程僅限于單個處理器時,運行時會自動切換到工作站GC。即使您明確指定使用服務器GC,工作站GC也將始終用于單核環(huán)境。
通過計算CPU繁忙時間,設置CPU限制,我們避免了線程池的各種推導性競爭:
嘗試分配更多的線程以增加CPU繁忙時間
嘗試分配更少的線程,因為添加更多的線程不會提高吞吐量
你應該會看到很多關于Kubernetes和Docker的消息,以至于你可能想知道哪個更好。事實上,沒有“更好”一說,因為它們所解決的問題是不一樣的。Docker就像飛機,而Kubernetes就像飛機場。就像你不可能說“我應該基于哪個去旅行——飛機或者飛機場?”,Docker和Kubernetes也是一樣的,你需要它們兩個。今天做一個調查。
相關文章:
張善友:基于Kubernetes 構建.NET Core 技術中臺(附視頻回顧)
面向 Kubernetes 編程: Kubernetes 是下一代操作系統(tǒng)
Kubernetes應用部署模型解析(部署篇)
Docker+ Kubernetes已成為云計算的主流(二十六)
.NET Core Run On Docker By Kubernetes 系列文章匯總
.NET社區(qū)新聞,深度好文,歡迎訪問公眾號文章匯總?http://www.csharpkit.com?
總結
以上是生活随笔為你收集整理的.NET 云原生技术使用调查的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《ASP.NET Core 微服务实战》
- 下一篇: 「PowerBI」分析服务多维数据结构重