日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

理解Go、容器以及Linux調度器

來源: 責編: 時間:2023-12-18 09:46:08 227觀看
導讀Go開發的應用程序通常部署在容器中。在容器中運行時,重要的一點是要設置CPU限制以確保容器不會耗光主機上的所有CPU。但Go運行時不知道容器上設置的CPU限制,因此有可能會把所有可用的CPU都用光,從而造成應用延遲很高。這

Go開發的應用程序通常部署在容器中。在容器中運行時,重要的一點是要設置CPU限制以確保容器不會耗光主機上的所有CPU。但Go運行時不知道容器上設置的CPU限制,因此有可能會把所有可用的CPU都用光,從而造成應用延遲很高。這個問題曾經困擾過我,在這篇文章中,我將解釋發生了什么以及如何修復。e3f28資訊網——每日最新資訊28at.com

e3f28資訊網——每日最新資訊28at.com

Go垃圾收集器是如何工作的

這是對Go垃圾收集器(GC)的概要介紹,想要更深入了解,建議閱讀Go文檔[2]以及Will Kennedy的系列文章[3]。e3f28資訊網——每日最新資訊28at.com

絕大多數情況下,Go運行時在執行程序的同時執行垃圾收集,這意味著GC會與程序同時運行。然而,在GC過程中有兩個點需要Go運行時暫停所有Goroutine,從而確保數據完整性。在GC標記階段(Mark Phase)之前,運行時將暫停所有Goroutine,用以啟用寫屏障(write barrier),確保在此之后創建的任何對象都不會被GC,這個階段稱為掃描終止(Sweep Termination)。在標記階段完成后,還有一個STW(stop the world)階段,被稱為標記終止(Mark Termination),并且也是刪除寫屏障的過程。整個流程通常需要幾十微秒。e3f28資訊網——每日最新資訊28at.com

我創建了一個簡單的web應用,分配了大量內存,并使用以下命令在一個限制為4個CPU核的容器中運行,源代碼在Github[4]上。e3f28資訊網——每日最新資訊28at.com

docker run --cpus=4 -p 8080:8080 $(ko build -L main.go)

值得注意的是,docker CPU限制是硬性限制。可以設置--CPU-shares,表示只在主機CPU受限時強制執行。這意味著如果主機有空閑容量,容器可以使用超出分配的CPU核。但是如果主機資源受限,那么應用程序也將受到限制。e3f28資訊網——每日最新資訊28at.com

可以使用runtime/trace[5]包收集trace,然后用go tool trace對其進行分析。下面的trace顯示了在我的機器上捕獲的一個GC周期,可以看到在Proc 5中STW階段的掃描終止和標記終止。e3f28資訊網——每日最新資訊28at.com

e3f28資訊網——每日最新資訊28at.com

這個GC周期只花了不到2.5ms,但我們在STW階段花費了近10%的時間。這是相當長的一段時間,特別是對于延遲敏感應用來說。e3f28資訊網——每日最新資訊28at.com

Linux調度器

完全公平調度程序(Complete Fair Scheduler, CFS)[6]是在Linux 2.6.23中引入的,在2023年10月份發布的Linux 6.6之前一直是默認調度程序,很可能你正在使用CFS。e3f28資訊網——每日最新資訊28at.com

CFS是一個比例共享調度器[7],意味著進程權重與允許使用的CPU內核數量成正比。例如,如果允許一個進程使用4個CPU核,那么它的權重將為4。如果一個進程被允許使用2個CPU核心,它的權重將為2。e3f28資訊網——每日最新資訊28at.com

CFS通過分配一小部分CPU時間來實現,一個4核系統每秒鐘有4秒的CPU時間可以分配。當我們為容器分配多個CPU內核時,實際上是要求Linux調度器給它n個CPU的時間。e3f28資訊網——每日最新資訊28at.com

在上面的docker run命令中,指定了4個CPU,意味著容器每秒將獲得4秒的CPU時間。e3f28資訊網——每日最新資訊28at.com

問題

當Go運行時啟動時,為每個CPU內核創建一個操作系統線程。這意味著如果有一個16核的機器,Go運行時將創建16個操作系統線程,不管任何CGroup CPU限制。然后Go運行時使用這些操作系統線程來調度程序。e3f28資訊網——每日最新資訊28at.com

問題是Go運行時不知道CGroup的CPU限制,而是在所有16個操作系統線程上調度goroutine,意味著Go運行時預計每秒能夠使用16秒的CPU時間。e3f28資訊網——每日最新資訊28at.com

由于Go運行時需要在等待Linux調度器調度的線程上停止gooutine,因此將面臨長時間的STW時間,因為一旦容器使用超過了CPU配額,線程就不會被調度。e3f28資訊網——每日最新資訊28at.com

解決方案

Go通過設置GOMAXPROCS環境變量限制運行時將創建的CPU線程數量。這一次,使用以下命令來啟動容器:e3f28資訊網——每日最新資訊28at.com

docker run --cpus=4 -e GOMAXPROCS=4 -p 8080:8080 $(ko build -L main.go)

下面是從與上面相同的應用程序捕獲的trace,現在使用與CPU配額匹配的GOMAXPROCS環境變量。e3f28資訊網——每日最新資訊28at.com

e3f28資訊網——每日最新資訊28at.com

在這個trace中,盡管負載完全相同,但垃圾收集時間要短得多。GC周期小于1ms,STW時間為26μs,約為無限制時的1/10。e3f28資訊網——每日最新資訊28at.com

GOMAXPROCS應該設置為容器允許使用的CPU核數,通常情況應該向下取整,如果分配的CPU內核少于1個,則向上取整。可以用GOMAXPROCS=max(1, floor(cpu))來計算。Uber開源了一個庫automaxprocs[8]來自動從容器的cgroups中計算這個值。e3f28資訊網——每日最新資訊28at.com

有一個Github問題[9]支持將這個特性添加到Go運行時中,使其開箱即用,希望最終會被Go運行時接受!e3f28資訊網——每日最新資訊28at.com

結論

在容器化應用程序中運行Go時,設置CPU限制非常重要。通過設置合理的GOMAXPROCS值或使用像automaxprocs這樣的庫,確保Go運行時意識到這些限制也很重要。e3f28資訊網——每日最新資訊28at.com

參考資料

[1]Go, Containers, and the Linux Scheduler: https://www.riverphillips.dev/blog/go-cfse3f28資訊網——每日最新資訊28at.com

[2]Go文檔: https://tip.golang.org/doc/gc-guidee3f28資訊網——每日最新資訊28at.com

[3]Garbage Collection In Go: https://www.ardanlabs.com/blog/2018/12/garbage-collection-in-go-part1-semantics.htmle3f28資訊網——每日最新資訊28at.com

[4]示例代碼: https://github.com/RiverPhillips/go-cfs-bloge3f28資訊網——每日最新資訊28at.com

[5]runtime/trace package: https://golang.org/pkg/runtime/tracee3f28資訊網——每日最新資訊28at.com

[6]完全公平調度程序(Complete Fair Scheduler, CFS): https://docs.kernel.org/scheduler/sched-design-CFS.htmle3f28資訊網——每日最新資訊28at.com

[7]Proportional share scheduling: https://en.wikipedia.org/wiki/Proportional_share_schedulinge3f28資訊網——每日最新資訊28at.com

[8]automaxprocs: https://github.com/uber-go/automaxprocse3f28資訊網——每日最新資訊28at.com

[9]Github問題: https://github.com/golang/go/issues/33803e3f28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-48340-0.html理解Go、容器以及Linux調度器

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 淺析 Preact Signals 及實現原理

下一篇: C++17中的if和switch語句初始化

標簽:
  • 熱門焦點
  • 小米平板5 Pro 12.4簡評:多專多能 兼顧影音娛樂的大屏利器

    疫情帶來了網課,網課盤活了安卓平板,安卓平板市場雖然中途停滯了幾年,但好的一點就是停滯的這幾年行業又有了新的發展方向,例如超窄邊框、高刷新率、多攝鏡頭組合等,這就讓安卓
  • 7月安卓手機性能榜:紅魔8S Pro再奪榜首

    7月份的手機市場風平浪靜,除了紅魔和努比亞帶來了兩款搭載驍龍8Gen2領先版處理器的新機之外,別的也想不到有什么新品了,這也正常,通常6月7月都是手機廠商修整的時間,進入8月份之
  • 使用LLM插件從命令行訪問Llama 2

    最近的一個大新聞是Meta AI推出了新的開源授權的大型語言模型Llama 2。這是一項非常重要的進展:Llama 2可免費用于研究和商業用途。(幾小時前,swyy發現它已從LLaMA 2更名為Lla
  • 簽約井川里予、何丹彤,單視頻點贊近千萬,MCN黑馬永恒文希快速崛起!

    來源:視聽觀察永恒文希傳媒作為一家MCN公司,說起它的名字來,可能大家會覺得有點兒陌生,但是說出來下面一串的名字之后,或許大家就會感到震驚,原來這么多網紅,都簽約這家公司了。根
  • 新電商三兄弟,“抖快紅”成團!

    來源:價值研究所作 者:Hernanderz 隨著內容電商的概念興起,抖音、快手、小紅書組成的“新電商三兄弟”成為業內一股不可忽視的勢力,給阿里、京東、拼多多帶去了巨大壓
  • 當家的盒馬,加速謀生

    來源 | 價值星球Planet作者 | 歸去來自己“當家”的盒馬,開始加速謀生了。據盒馬官微消息,盒馬計劃今年開放生鮮供應鏈,將其生鮮商品送往食堂。目前,盒馬在上海已經與
  • 年輕人的“職場羞恥感”,無處不在

    作者:馮曉亭 陶 淘 李 欣 張 琳 馬舒葉來源:燃次元“人在職場,應該選擇什么樣的著裝?”近日,在網絡上,一個與著裝相關的帖子引發關注,在該帖子里,一位在高級寫字樓亞洲金
  • 疑似小米14外觀設計圖曝光:后置相機模組變化不大

    下半年的大幕已經開啟,而誰將成為下半年手機圈的主角就成為了大家關注的焦點,其中被傳有望拿下新一代驍龍8 Gen3旗艦芯片的小米14系列更是備受大家矚
  • 聯想小新Pad Pro 12.6將要推出,搭載高通驍龍 870 處理器

    聯想小新Pad Pro 12.6將于秋季新品會上推出,官方按照慣例直接在發布會前給出了機型的所有參數。聯想小新 Pad Pro 12.6 將搭載高通驍龍 870 處理器,重量為 5
Top 主站蜘蛛池模板: 洪泽县| 容城县| 北流市| 石棉县| 改则县| 怀宁县| 蕲春县| 凤凰县| 将乐县| 黄骅市| 宜昌市| 莱阳市| 普兰县| 苏州市| 华坪县| 金湖县| 图木舒克市| 牟定县| 迁西县| 洪湖市| 赫章县| 乐清市| 罗平县| 天门市| 周宁县| 饶平县| 增城市| 湘乡市| 乌兰察布市| 汉川市| 曲周县| 库车县| 乃东县| 沾益县| 闸北区| 库伦旗| 凤庆县| 霍林郭勒市| 阿图什市| 安岳县| 门头沟区|