国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

理解Go、容器以及Linux調(diào)度器

開發(fā) 后端 Linux
在容器中運行Go應(yīng)用程序時,需要設(shè)置合理的GOMAXPROCS,從而避免調(diào)度中因為資源不足而造成STW。

Go開發(fā)的應(yīng)用程序通常部署在容器中。在容器中運行時,重要的一點是要設(shè)置CPU限制以確保容器不會耗光主機上的所有CPU。但Go運行時不知道容器上設(shè)置的CPU限制,因此有可能會把所有可用的CPU都用光,從而造成應(yīng)用延遲很高。這個問題曾經(jīng)困擾過我,在這篇文章中,我將解釋發(fā)生了什么以及如何修復(fù)。

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

這是對Go垃圾收集器(GC)的概要介紹,想要更深入了解,建議閱讀Go文檔[2]以及Will Kennedy的系列文章[3]。

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

我創(chuàng)建了一個簡單的web應(yīng)用,分配了大量內(nèi)存,并使用以下命令在一個限制為4個CPU核的容器中運行,源代碼在Github[4]上。

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

值得注意的是,docker CPU限制是硬性限制。可以設(shè)置--CPU-shares,表示只在主機CPU受限時強制執(zhí)行。這意味著如果主機有空閑容量,容器可以使用超出分配的CPU核。但是如果主機資源受限,那么應(yīng)用程序也將受到限制。

可以使用runtime/trace[5]包收集trace,然后用go tool trace對其進行分析。下面的trace顯示了在我的機器上捕獲的一個GC周期,可以看到在Proc 5中STW階段的掃描終止和標(biāo)記終止。

這個GC周期只花了不到2.5ms,但我們在STW階段花費了近10%的時間。這是相當(dāng)長的一段時間,特別是對于延遲敏感應(yīng)用來說。

Linux調(diào)度器

完全公平調(diào)度程序(Complete Fair Scheduler, CFS)[6]是在Linux 2.6.23中引入的,在2023年10月份發(fā)布的Linux 6.6之前一直是默認(rèn)調(diào)度程序,很可能你正在使用CFS。

CFS是一個比例共享調(diào)度器[7],意味著進程權(quán)重與允許使用的CPU內(nèi)核數(shù)量成正比。例如,如果允許一個進程使用4個CPU核,那么它的權(quán)重將為4。如果一個進程被允許使用2個CPU核心,它的權(quán)重將為2。

CFS通過分配一小部分CPU時間來實現(xiàn),一個4核系統(tǒng)每秒鐘有4秒的CPU時間可以分配。當(dāng)我們?yōu)槿萜鞣峙涠鄠€CPU內(nèi)核時,實際上是要求Linux調(diào)度器給它n個CPU的時間。

在上面的docker run命令中,指定了4個CPU,意味著容器每秒將獲得4秒的CPU時間。

問題

當(dāng)Go運行時啟動時,為每個CPU內(nèi)核創(chuàng)建一個操作系統(tǒng)線程。這意味著如果有一個16核的機器,Go運行時將創(chuàng)建16個操作系統(tǒng)線程,不管任何CGroup CPU限制。然后Go運行時使用這些操作系統(tǒng)線程來調(diào)度程序。

問題是Go運行時不知道CGroup的CPU限制,而是在所有16個操作系統(tǒng)線程上調(diào)度goroutine,意味著Go運行時預(yù)計每秒能夠使用16秒的CPU時間。

由于Go運行時需要在等待Linux調(diào)度器調(diào)度的線程上停止gooutine,因此將面臨長時間的STW時間,因為一旦容器使用超過了CPU配額,線程就不會被調(diào)度。

解決方案

Go通過設(shè)置GOMAXPROCS環(huán)境變量限制運行時將創(chuàng)建的CPU線程數(shù)量。這一次,使用以下命令來啟動容器:

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

下面是從與上面相同的應(yīng)用程序捕獲的trace,現(xiàn)在使用與CPU配額匹配的GOMAXPROCS環(huán)境變量。

在這個trace中,盡管負(fù)載完全相同,但垃圾收集時間要短得多。GC周期小于1ms,STW時間為26μs,約為無限制時的1/10。

GOMAXPROCS應(yīng)該設(shè)置為容器允許使用的CPU核數(shù),通常情況應(yīng)該向下取整,如果分配的CPU內(nèi)核少于1個,則向上取整。可以用GOMAXPROCS=max(1, floor(cpu))來計算。Uber開源了一個庫automaxprocs[8]來自動從容器的cgroups中計算這個值。

有一個Github問題[9]支持將這個特性添加到Go運行時中,使其開箱即用,希望最終會被Go運行時接受!

結(jié)論

在容器化應(yīng)用程序中運行Go時,設(shè)置CPU限制非常重要。通過設(shè)置合理的GOMAXPROCS值或使用像automaxprocs這樣的庫,確保Go運行時意識到這些限制也很重要。

參考資料

[1]Go, Containers, and the Linux Scheduler: https://www.riverphillips.dev/blog/go-cfs

[2]Go文檔: https://tip.golang.org/doc/gc-guide

[3]Garbage Collection In Go: https://www.ardanlabs.com/blog/2018/12/garbage-collection-in-go-part1-semantics.html

[4]示例代碼: https://github.com/RiverPhillips/go-cfs-blog

[5]runtime/trace package: https://golang.org/pkg/runtime/trace

[6]完全公平調(diào)度程序(Complete Fair Scheduler, CFS): https://docs.kernel.org/scheduler/sched-design-CFS.html

[7]Proportional share scheduling: https://en.wikipedia.org/wiki/Proportional_share_scheduling

[8]automaxprocs: https://github.com/uber-go/automaxprocs

[9]Github問題: https://github.com/golang/go/issues/33803

責(zé)任編輯:趙寧寧 來源: DeepNoMind
相關(guān)推薦

2023-10-25 12:51:28

Go調(diào)度器

2024-12-03 15:15:22

2021-07-05 06:51:45

Linux內(nèi)核調(diào)度器

2021-07-02 06:54:44

Linux內(nèi)核主調(diào)度器

2011-01-21 07:36:00

LinuxBFSCFS

2017-05-08 11:37:41

Go調(diào)度器源碼分析程序

2011-01-13 13:59:14

2021-05-12 07:50:02

CFS調(diào)度器Linux

2025-06-16 05:10:00

2025-01-15 09:13:53

2017-03-25 21:33:33

Linux調(diào)度器

2010-01-28 10:11:13

Linux 2.6公平調(diào)度器

2020-10-13 09:23:57

LinuxKernel調(diào)度器

2025-05-13 06:41:08

2022-10-30 15:00:50

2022-02-14 11:08:07

Linux容器命令

2022-09-15 10:42:21

API安全網(wǎng)絡(luò)攻擊

2022-07-29 10:01:50

Docker退出碼

2025-07-04 08:43:51

2009-09-16 08:40:53

linux進程調(diào)度linuxlinux操作系統(tǒng)
點贊
收藏

51CTO技術(shù)棧公眾號

国产69精品久久久久999小说| 亚洲激情图片qvod| 欧美xxxx做受欧美.88| 国产福利视频在线| 亚洲激情中文1区| 成人免费看黄网址| 国产精品污污网站在线观看| 午夜肉伦伦影院| 成人一区二区三区中文字幕| 亚洲国产精品一区在线观看不卡| 亚洲成人直播| 2014亚洲精品| 围产精品久久久久久久| 国产美女扒开尿口久久久| 亚洲人成精品久久久| 日产精品久久久一区二区福利| 亚洲三级av| 91精品国产网站| 色婷婷久久久| 97av在线影院| 丝袜连裤袜欧美激情日韩| 69久久夜色精品国产69| 亚洲+小说+欧美+激情+另类| 国产极品精品在线观看| 国产精品x453.com| 2020国产精品久久精品不卡| 亚洲国产影院| 色中文字幕在线观看| av在线综合网| 黄网站免费入口| 精品国产乱码久久久久酒店| 成人影院免费观看| 日韩欧美一级在线播放| www.com.cn成人| 色综合久久悠悠| 成人情趣视频网站| av在线不卡一区| 美女网站一区二区| 国产亚洲综合视频| 综合激情成人伊人| 奇米影视888狠狠狠777不卡| 欧美视频一区二区三区四区| 日本三级在线观看网站| 最新国产精品拍自在线播放| 秋霞影视一区二区三区| 国产精品精品软件视频| 韩国精品久久久| 国产福利在线免费| 欧美性感一区二区三区| 僵尸再翻生在线观看| 久久久免费观看| 亚洲欧洲一级| 91视频最新入口| 色成人在线视频| 日本美女久久| 国产在线精品自拍| 国产一区二区三区四| 成年在线播放小视频| 欧美日韩国产色站一区二区三区| 久久久久久一区二区三区四区别墅| 国产精品av免费在线观看| 麻豆久久精品| av网站一区| 亚洲国产成人精品一区二区| 日韩有码一区| 亚洲制服中文| 亚洲在线观看免费| 欧美黑人粗大| 91老司机精品视频| 99久久婷婷国产综合精品| 男人天堂综合| 久久成人在线视频| 99精品视频免费观看视频| 国产成人无码一二三区视频| 欧美视频一区二区在线观看| 91午夜精品| 亚洲成人第一| 午夜精品福利一区二区蜜股av| 日韩美女在线看免费观看| 91中文在线观看| 久久综合中文字幕| 在线观看av免费| 国产精品成人一区| julia一区二区三区中文字幕| 97在线看免费观看视频在线观看| 国产精品巨作av| 91沈先生在线观看| 中文字幕日韩亚洲| 在线视频一区二区| www.国产二区| 色综合久久久久| 婷婷成人av| 欧洲在线视频一区| 五月天亚洲婷婷| 国产精品麻豆| 亚洲欧美电影在线观看| 狠狠做深爱婷婷久久综合一区| 日韩最新av| 亚洲看片网站| 欧美中文字幕不卡| 免费av一区二区三区四区| 日韩视频在线视频| 亚洲第一男人天堂| 亚洲高清久久| 波多野结衣av在线播放| 久久这里有精品视频| 国产在线精品一区二区不卡了| 幼a在线观看| 2019国产精品视频| 亚洲一区二区三区四区五区中文| 永久免费精品视频| 中文字幕中文字幕在线十八区 | 欧美日韩视频不卡| 久久国产麻豆精品| 精品国产不卡一区二区| 午夜两性免费视频| 99re在线视频上| 国产精品大尺度| 亚洲日日夜夜| 欧美日韩系列| 欧美日韩国产区一| 成人豆花视频| 国产精品一级久久久| 日韩欧美视频在线| 久久aⅴ国产欧美74aaa| 波多野结衣一区| 国产女主播在线| 亚洲人成网站在线观看播放| 亚洲a在线播放| 欧美一区二区三区免费视| 精品精品国产高清a毛片牛牛| 欧美一区二区三区在线视频| 国产精品一区免费视频| 黄色成人在线观看网站| 国产精品一区二区婷婷| 麻豆av一区二区| 欧美激情第一页xxx| 在线观看日韩电影| 成人精品国产一区二区4080| 国产youjizz在线| 91精品国产综合久久久久久丝袜| 精品日韩一区二区| 国产一区二区三区四区福利| 成人国产精品色哟哟| 欧美三级午夜理伦三级| av免费在线视| 欧美1级片网站| 亚洲美女黄网| 国产高清久久久| 91蜜桃网址入口| 久久你懂得1024| 色一区二区三区四区| 一区二区三区四区日韩| 欧美精品第三页| 午夜两性免费视频| 国产精品久久婷婷六月丁香| 亚洲国产精品国自产拍av秋霞| 亚洲国产专区| 亚洲一区二区三区高清| 精品久久一二三| 91精品视频在线| 国产日韩精品视频| 在线观看成人免费| 在线激情视频| 黄动漫在线免费观看| 69成人在线| 一本色道久久综合狠狠躁的番外| 综合久久精品| eeuss鲁片一区二区三区在线观看| 午夜精品久久久久久久| 一区二区三区日韩| 久久婷婷成人综合色| 亚洲欧美在线视频观看| 亚洲人成在线观看一区二区| 91精品免费观看| 日韩午夜电影av| 91精品久久久久久蜜臀| 欧美一级黄色片| 97热在线精品视频在线观看| 免费影院在线观看一区| 91久久精品国产91性色| 7777在线视频| 玖玖在线播放| av免费不卡国产观看| 日本国产精品| 国产精品青草综合久久久久99| 日韩欧美资源站| 97夜夜澡人人双人人人喊| 伊人国产在线视频| 美女扒开腿让男人桶爽久久软| 亚洲不卡在线| 日韩二区三区四区| 精品毛片网大全| 精品国产一区a| 91在线视频精品| 天天想你在线观看完整版电影免费| 国产美女被遭强高潮免费网站| 麻豆网站免费在线观看| 免费欧美日韩| 欧美伦理视频网站|