精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

如何有效控制 Go 線程數(shù)?

開發(fā) 后端
相信對 Go 有所了解的人,對下圖所示的 GMP 模型不會陌生,每個 P 都會有一個操作系統(tǒng)線程 M 來執(zhí)行其上的 G。

[[431064]]

前陣子,在讀者交流群中有人提到 Go 默認設置的最大線程數(shù)的問題:如果超過一萬個 G (掛載于 M 上)阻塞于系統(tǒng)調(diào)用,那么程序就會被掛掉。

這是對的,因為 Go 對運行時創(chuàng)建的線程數(shù)量有一個限制,默認是 10000 個線程。今天我們就來探討一下 Go 線程數(shù)相關的問題。

閑置線程

相信對 Go 有所了解的人,對下圖所示的 GMP 模型不會陌生,每個 P 都會有一個操作系統(tǒng)線程 M 來執(zhí)行其上的 G。

GMP 模型

我們可以通過設置 GOMAXPROCS 來設定 P 的最大值,這個值代表什么含義呢?

The GOMAXPROCS variable limits the number of operating system threads that

can execute user-level Go code simultaneously. There is no limit to the number of threads

that can be blocked in system calls on behalf of Go code; those do not count against

the GOMAXPROCS limit. This package's GOMAXPROCS function queries and changes

the limit.

通過 GOMAXPROCS 的定義文檔,我們可以看到該變量只是限制了可以同時執(zhí)行用戶級 Go 代碼的 OS 系統(tǒng)線程數(shù)量(通俗地講:Go 程序最多只能有和 P 相等個數(shù)的系統(tǒng)線程同時運行)。但是,在系統(tǒng)調(diào)用中被阻塞的線程不在此限制之中。

對于系統(tǒng)調(diào)用,可分為同步和異步兩種方式。

我們在《Go 網(wǎng)絡編程和 TCP 抓包實操》一文中闡述的 Go 網(wǎng)絡編程模型,就是一種異步系統(tǒng)調(diào)用。它使用網(wǎng)路輪詢器進行系統(tǒng)調(diào)用,調(diào)度器可以防止 G 在進行這些系統(tǒng)調(diào)用時阻塞 M。這可以讓 M 繼續(xù)執(zhí)行其他的 G,而不需要創(chuàng)建新的 M。

但是,如果 G 要進行的是無法異步完成的系統(tǒng)調(diào)用時怎么辦?當網(wǎng)絡輪詢器無法使用時,進行系統(tǒng)調(diào)用的 G 將會阻塞 M。在 Linux 下基于普通文件(Linux 下的 epoll 只支持 socket,Windows 下的 iocp 可以支持 socket、file)的系統(tǒng)調(diào)用就是一個典型的例子。

同步系統(tǒng)調(diào)用 1

如上圖所示,運行在 M1 上的 G1 想要請求一個同步系統(tǒng)調(diào)用。

同步系統(tǒng)調(diào)用 2

當發(fā)生同步系統(tǒng)調(diào)用并阻塞時,調(diào)度器將 M1 和仍然掛載在其之上的 G1 與 P 分離,并引入新的 M2 來運行 P 上的其他 G。

同步系統(tǒng)調(diào)用 3

當 G1 進行的阻塞式系統(tǒng)調(diào)用結束時,G1 重新回到 P 的 LRQ 中去,但 M1 變成了閑置線程,不會被回收,以留備后續(xù)復用。

問題來了,如果在某一短時段內(nèi),Go 程序存在大量無法短暫結束的同步系統(tǒng)調(diào)用,那線程數(shù)豈不是會一直漲下去?

最大線程數(shù)限制

線程數(shù)限制的問題,在官方 issues#4056: "runtime: limit number of operating system threads" 中,有過討論,并最終將線程限制數(shù)值確定為 10000。

這個值存在的主要目的是限制可以創(chuàng)建無限數(shù)量線程的 Go 程序:在程序把操作系統(tǒng)干爆之前,干掉程序。

當然,Go 也暴露了 debug.SetMaxThreads() 方法可以讓我們修改最大線程數(shù)值。

  1. package main 
  2.  
  3. import ( 
  4.  "os/exec" 
  5.  "runtime/debug" 
  6.  "time" 
  7.  
  8. func main() { 
  9.  debug.SetMaxThreads(10) 
  10.  for i := 0; i < 20; i++ { 
  11.   go func() { 
  12.    _, err := exec.Command("bash""-c""sleep 3").Output() 
  13.    if err != nil { 
  14.     panic(err) 
  15.    } 
  16.   }() 
  17.  } 
  18.  time.Sleep(time.Second * 5) 

如程序所示,我們將最大線程數(shù)設置為 10,然后通過執(zhí)行 shell 命令 sleep 3 來模擬同步系統(tǒng)調(diào)用過程。那么,執(zhí)行 sleep 操作的 G 和 M 都會阻塞,當程序啟動的線程 M 超過 10 個時,會得到以下報錯。

  1. runtime: program exceeds 10-thread limit 
  2. fatal error: thread exhaustion 
  3. *** 

讓閑置線程退出

閑置線程退出的問題,在官方 issues#14592: "runtime: let idle OS threads exit" 中有過討論。目前,還沒有一個完美的解決方案。

但是,在該 issue 里有人提出使用 runtime.LockOSThread() 方法來殺死線程。

簡單了解下這個函數(shù)的特性:

  • 調(diào)用 LockOSThread 函數(shù)會把當前 G 綁定在當前的系統(tǒng)線程 M 上,這個 G 總是在這個 M 上執(zhí)行,并且阻止其它 G 在該 M 執(zhí)行。
  • 只有當前 G 調(diào)用了與之前調(diào)用 LockOSThread 相同次數(shù)的 UnlockOSThread 函數(shù)之后,G 與 M 才會解綁。
  • 如果當前 G 在退出時,沒有調(diào)用 UnlockOSThread,這個線程會被終止。

那么,我們可以利用第三個特性,在啟動 G 時,調(diào)用 LockOSThread 來獨占一個 M。當 G 退出時,而不調(diào)用 UnlockOSThread,那這個 M 將不會被閑置,就被終止了。

下面,我們來看一個例子

  1. package main 
  2.  
  3. import ( 
  4.  "fmt" 
  5.  "os/exec" 
  6.  "runtime/pprof" 
  7.  "time" 
  8.  
  9. func main() { 
  10.  threadProfile := pprof.Lookup("threadcreate"
  11.  fmt.Printf(" init threads counts: %d\n", threadProfile.Count()) 
  12.  
  13.  for i := 0; i < 20; i++ { 
  14.   go func() { 
  15.    _, err := exec.Command("bash""-c""sleep 3").Output() 
  16.    if err != nil { 
  17.     panic(err) 
  18.    } 
  19.   }() 
  20.  } 
  21.  time.Sleep(time.Second * 5) 
  22.  fmt.Printf(" end threads counts: %d\n", threadProfile.Count()) 

通過 threadProfile.Count() 我們可以實時獲取當前線程數(shù)目,那么在發(fā)生了阻塞式系統(tǒng)調(diào)用后,該程序的線程數(shù)目是多少呢?

  1. init threads counts: 5 
  2. end threads counts: 25 

根據(jù)結果可以看到,G 執(zhí)行完畢后,閑置線程并沒有被釋放。

在程序中添加一行代碼 runtime.LockOSThread() 代碼

  1. go func() { 
  2.  runtime.LockOSThread() // 增加的一行代碼 
  3.  _, err := exec.Command("bash""-c""sleep 3").Output() 
  4.  if err != nil { 
  5.   panic(err) 
  6.  } 
  7. }() 

此時,程序的執(zhí)行結果如下

  1. init threads counts: 5 
  2.  
  3. end threads counts: 11 

可以看到,由于調(diào)用了 LockOSThread 函數(shù)的 G 沒有執(zhí)行 UnlockOSThread 函數(shù),在 G 執(zhí)行完畢后,M 也被終止了。

總結

在 GMP 模型中,P 與 M 一對一的掛載形式,通過設定 GOMAXPROCS 變量就能控制并行線程數(shù)。

當 M 遇到同步系統(tǒng)調(diào)用時,G 和 M 會與 P 剝離,當系統(tǒng)調(diào)用完成,G 重新進入可運行狀態(tài),而 M 就會被閑置起來。

Go 目前并沒有對閑置線程做清除處理,它們被當作復用的資源,以備后續(xù)需要。但是,如果在 Go 程序中積累大量空閑線程,這是對資源的一種浪費,同時對操作系統(tǒng)也產(chǎn)生了威脅。因此,Go 設定了 10000 的默認線程數(shù)限制。

我們發(fā)現(xiàn)了一種利用 LockOSThread 函數(shù)的 trik 做法,可以借此做一些限制線程數(shù)的方案:例如啟動定期排查線程數(shù)的 goroutine,當發(fā)現(xiàn)程序的線程數(shù)超過某閾值后,就回收掉一部分閑置線程。

當然,這個方法也存在隱患。例如在 issues#14592 有人提到:當子進程由一個帶有 PdeathSignal: SIGKILL 的 A 線程創(chuàng)建,A 變?yōu)榭臻e時,如果 A 退出,那么子進程將會收到 KILL 信號,從而引起其他問題。

當然,絕大多數(shù)情況下,我們的 Go 程序并不會遇到空閑線程數(shù)過多的問題。如果真的存在線程數(shù)暴漲的問題,那么你應該思考代碼邏輯是否合理(為什么你能允許短時間內(nèi)如此多的系統(tǒng)同步調(diào)用),是否可以做一些例如限流之類的處理。而不是想著通過 SetMaxThreads 方法來處理。

參考

Scheduling In Go:https://www.ardanlabs.com/blog/2018/08/scheduling-in-go-part2.html

issues#4056:https://github.com/golang/go/issues/4056

 

issues#14592:https://github.com/golang/go/issues/14592

 

責任編輯:武曉燕 來源: Golang技術分享
相關推薦

2023-10-29 16:14:07

2012-04-23 14:36:10

天璣科技IT成本IT服務

2010-05-31 16:46:31

2011-09-06 10:33:11

2009-01-21 18:31:50

2023-12-29 08:10:41

Go并發(fā)開發(fā)

2017-12-18 10:27:30

數(shù)據(jù)中心制冷系統(tǒng)

2014-11-17 10:05:12

Go語言

2023-12-01 08:01:33

GoValidator

2024-04-30 10:29:46

前端開發(fā)h5開發(fā)函數(shù)

2020-07-16 14:25:18

PythonGo前端

2024-02-04 19:38:02

云計算

2021-03-29 17:51:00

瑞數(shù)信息攻防演練

2021-06-25 15:19:13

攻防演練

2010-03-16 17:52:27

Java多線程信號量

2022-06-20 10:45:55

SpringBoot項目

2022-12-27 09:57:41

線程數(shù)CPU

2009-10-28 10:31:39

在線交易SSL證書

2021-03-29 10:39:07

evSecOps信息安全系統(tǒng)安全

2024-05-08 00:00:00

核心線程數(shù)隊列
點贊
收藏

51CTO技術棧公眾號

成人欧美一区二区三区在线观看| 日韩欧美色电影| 成人久久一区二区| 国产美女久久久久久| 日韩一区二区三区四区五区| ...xxx性欧美| 成人激情av| 国产一国产二国产三| 欧美aaaaa级| 色狠狠一区二区| 中文字幕剧情在线观看一区| 性欧美一区二区三区| 欧美精品啪啪| 亚洲韩国日本中文字幕| 欧美激情a∨在线视频播放| 久久久久无码精品| 精品3atv在线视频| 亚洲国产视频在线| 亚洲美女网站18| 少妇荡乳情欲办公室456视频| 日韩精品一区第一页| 欧美高清一级大片| 顶级黑人搡bbw搡bbbb搡| 噜噜噜狠狠夜夜躁精品仙踪林| 欧美日韩一本到| 欧美a在线视频| 青春草免费在线视频| 中文字幕+乱码+中文字幕一区| 国产精品久久久久久免费观看 | 国产精品自在自线| 高清精品在线| 亚洲欧美激情在线| 亚洲v国产v在线观看| 天天躁日日躁狠狠躁喷水| 国产精品一卡二| 91九色国产视频| 在线观看你懂的网站| 国产精品嫩草99av在线| 欧美极品少妇xxxxx| 日韩视频中文字幕在线观看| 色爱综合网欧美| 亚洲图片欧美日产| 亚洲综合色一区| 牲欧美videos精品| 亚洲激情久久久| 精品无码av一区二区三区| 二区三区精品| 欧美一级高清片在线观看| 日韩精品你懂的| 国产精品毛片久久久久久久久久99999999 | 99国产精品| 久久久久九九九九| 精品爆乳一区二区三区无码av| 午夜精品一区二区三区国产 | 三年中国中文观看免费播放| 亚欧洲精品视频在线观看| 日韩精品免费综合视频在线播放 | 国产精品久久久久久久久免费樱桃| 欧美日韩一区在线视频| 青青久在线视频| 久久久青草青青国产亚洲免观| 蜜桃狠狠色伊人亚洲综合网站| 亚洲av成人无码网天堂| 久久久久久久久免费| 日本成人黄色| 午夜激情视频在线观看| 成人欧美一区二区三区黑人麻豆 | 欧美图区在线视频| mm131国产精品| 福利精品一区| 欧美一区二区三区在线观看视频| 精品人妻一区二区三区免费| 精品一区二区三区在线观看视频| 日韩欧美一区二区在线视频| wwwww在线观看| 久久动漫网址| 亚洲一级黄色片| 日韩黄色中文字幕| 粉嫩久久久久久久极品| 亚洲精品中文字幕av| 精品成人无码一区二区三区| 亚洲天天综合| 国内精品视频久久| 无码人妻丰满熟妇精品区| 老司机午夜精品| 成人h在线播放| 九色视频成人自拍| 亚洲欧美日韩国产中文在线| 男人添女人下部视频免费| 中国字幕a在线看韩国电影| 日本韩国一区二区| 无码人妻一区二区三区在线视频| 东京久久高清| 色小说视频一区| 清纯粉嫩极品夜夜嗨av| 久久亚洲美女| 91在线观看免费高清| 十九岁完整版在线观看好看云免费| 国产精品美女久久久久高潮| 日本五级黄色片| 写真福利精品福利在线观看| 日韩一区二区免费电影| a毛片毛片av永久免费| 99久久这里只有精品| 91精品国产免费久久久久久| 亚洲天堂手机在线| 91污片在线观看| 国产精品波多野结衣| 水蜜桃在线视频| 91精品在线免费| 日本xxxxxxxxx18| 欧美激情1区2区3区| 国产精品 欧美在线| 亚洲成人av综合| 国产欧美日韩不卡| 免费看国产一级片| 国产精品高清一区二区| 国产亚洲精品一区二区| 日韩乱码人妻无码中文字幕| 黑人巨大精品欧美一区| 欧美另类一区| a天堂资源在线| 欧美日本一道本在线视频| 女尊高h男高潮呻吟| 欧美天天视频| 91视频国产高清| 成人影院免费观看| 欧美性xxxxxx| 国产熟女高潮一区二区三区| 国产一区二区三区四区三区四| 成人精品福利视频| yw在线观看| 一本一道久久a久久精品 | 久久精品水蜜桃av综合天堂| 成人一对一视频| 看全色黄大色大片免费久久久| 久久成年人视频| 一炮成瘾1v1高h| 中文字幕乱码久久午夜不卡| 久久久久久久久久久久久国产精品| silk一区二区三区精品视频| 久久99久久久久久久噜噜| 国产又黄又粗又猛又爽| 国产精品久久久久毛片软件| 亚洲一区二区三区四区五区xx| 久操国产精品| 国产a∨精品一区二区三区不卡| 三级理论午夜在线观看| 欧美日韩在线视频观看| 偷拍女澡堂一区二区三区| 日韩视频二区| 免费在线国产精品| 97成人超碰| 色婷婷av一区二区三区久久| 夜夜嗨av禁果av粉嫩avhd| 国产精品午夜久久| 超碰在线资源站| 自由日本语亚洲人高潮| 99在线首页视频| 9999在线视频| 亚洲精品大尺度| 久久黄色精品视频| 国产亚洲人成网站| 亚洲最大综合网| 99久久99久久精品国产片果冰| 成人欧美一区二区三区黑人| 亚洲欧美成人影院| 亚洲国产精品成人va在线观看| 日韩在线观看第一页| 久久综合狠狠综合| 91小视频网站| 亚洲欧美亚洲| 久久riav二区三区| h1515四虎成人| 久久精品国亚洲| 免费看国产片在线观看| 色综合色综合色综合色综合色综合| 人妻熟人中文字幕一区二区| 国产一区二区三区美女| 日韩精品久久一区二区| 一区三区在线欧| 91久久久久久久久久久久久| 国产偷倩在线播放| 国产一区二区日韩精品欧美精品| 国产免费高清av| 欧美色图在线视频| 韩国一级黄色录像| www激情久久| 午夜影院免费观看视频| 国产欧美亚洲一区| 日产精品一线二线三线芒果 | 久久99国产精品99久久| 国产亚洲人成a在线v网站| 欧美国产一区二区三区| 国产黄色在线| 亚洲国产精品系列| 国产精品久久777777换脸| 天天射综合影视| 国产精品99久久久久久成人| 91香蕉视频污| 在线观看视频在线观看| 老**午夜毛片一区二区三区| 日本黄网站色大片免费观看| 国产精品免费99久久久| 91九色在线免费视频| 日韩欧美一区二区三区在线观看| 久久99热精品这里久久精品| 国产日韩精品在线看| 精品国产不卡一区二区三区| 97精品久久人人爽人人爽| 岛国精品视频在线播放| 久久亚洲成人av| 国产精品第五页| 偷拍夫妻性生活| 白白色亚洲国产精品| 日韩va在线观看| 久久蜜桃资源一区二区老牛| 久草免费福利在线| 婷婷久久综合| 亚洲日本无吗高清不卡| 亚洲人成精品久久久| 国产综合精品一区二区三区| crdy在线观看欧美| 国产精品久久久久久久久久久久久久| caoporn视频在线| 久久99国产综合精品女同| av在线三区| 尤物yw午夜国产精品视频| 性xxxx视频播放免费| 精品国产伦一区二区三区观看方式 | 欧美日韩午夜在线| 波多野结衣影片| 日韩欧美在线字幕| 日本黄色片视频| 午夜国产精品影院在线观看| 黄色一级视频免费观看| 一区二区三区在线视频播放 | 美国成人毛片| 国产视频亚洲视频| 婷婷色在线观看| 亚洲精品国产精品自产a区红杏吧 亚洲精品国产精品乱码不99按摩 亚洲精品国产精品久久清纯直播 亚洲精品国产精品国自产在线 | 99久久精品免费看国产一区二区三区| 亚洲ww精品| 91久热免费在线视频| 成人51免费| 2014国产精品| 成人午夜网址| 精品国产第一页| 久久a爱视频| 欧美日韩精品综合| 国产一区二区三区电影在线观看| 欧美亚洲国产免费| 国产欧美日韩一区二区三区四区| 日本不卡二区| 久久一本综合| 一级全黄肉体裸体全过程| 婷婷精品进入| 欧美中日韩在线| 国产视频欧美| 色诱视频在线观看| 美女免费视频一区| 91插插插影院| 不卡的电视剧免费网站有什么| 中文文字幕文字幕高清| 久久欧美中文字幕| 欧洲性xxxx| 亚洲欧美在线aaa| 国产一卡二卡在线播放| 欧美日韩国产一区中文午夜| 国产suv精品一区二区33| 欧美日韩高清影院| 亚洲大尺度视频| 精品中文视频在线| 尤物网在线观看| 欧美日韩电影在线观看| 色黄视频在线观看| 国产欧美最新羞羞视频在线观看| 精品国产亚洲一区二区三区| 国产精品视频免费观看| 国产精品一国产精品| 午夜啪啪免费视频| 99亚洲视频| 男人添女人下面免费视频| 丰满放荡岳乱妇91ww| 国精品无码人妻一区二区三区| 国产精品久久久久久久久免费桃花| 私库av在线播放| 色婷婷av久久久久久久| 国产美女www爽爽爽视频| 亚洲激情第一页| 免费a在线看| 欧美一级在线播放| 中文字幕日本一区| 欧美精品一区二区视频| 亚洲国产不卡| 日韩免费高清在线| 成人看片黄a免费看在线| 国产1区2区在线观看| 亚洲高清视频的网址| 中文字幕自拍偷拍| 日韩激情片免费| 国精产品一区| 日韩免费中文字幕| 国产厕拍一区| 男女h黄动漫啪啪无遮挡软件| 免费日韩av片| 午夜不卡久久精品无码免费| 国产精品人妖ts系列视频| wwwxxx亚洲| 4438x亚洲最大成人网| 欧洲综合视频| 久久久久久久色| 亚洲精品一区av| 欧洲国产精品| 亚洲人成久久| 亚洲av无码成人精品区| **网站欧美大片在线观看| 日韩手机在线视频| 亚洲精品一区二区三区在线观看| 欧美激情免费| 国产精品久久中文| 深爱激情综合| 久草精品在线播放| 99这里只有精品| 久久久一区二区三区四区| 91.麻豆视频| 天天影视久久综合| 国产精品久久久久91| 国产精品亚洲人成在99www| 成人毛片视频网站| 不卡的看片网站| 国产真实夫妇交换视频| 欧美一级一区二区| 在线视频观看国产| 亚洲最大av网| 中文字幕一区二区三区乱码图片| www.日本一区| 中文字幕国产一区| 中文字幕在线视频免费| 日韩一区二区三区国产| 欧美成人aaa| www亚洲国产| 国产一区啦啦啦在线观看| 欧洲美女女同性互添| 欧美一区二区视频在线观看2020 | 天天色综合av| 午夜伦理精品一区| 香蕉久久夜色精品国产使用方法| 尤物av无码色av无码| 久久只精品国产| chinese国产精品| 亚洲香蕉伊综合在人在线视看| 午夜精品久久久久久久久久蜜桃| 女同一区二区| 免费观看在线色综合| 懂色av粉嫩av蜜臀av一区二区三区| 欧美视频日韩视频| 国产激情视频在线| 国产精品久久精品视| 亚洲一区二区动漫| 亚洲理论片在线观看| 欧美专区在线观看一区| 日韩精品黄色| ts人妖另类在线| 亚洲精品少妇| 日韩人妻无码精品综合区| 欧美日韩在线电影| 91在线中文| 国精产品99永久一区一区| 免费一级欧美片在线播放| 亚欧精品视频一区二区三区| 日韩一区二区三区高清免费看看| 97人澡人人添人人爽欧美| 青青影院一区二区三区四区| 久久精品国产色蜜蜜麻豆| 精品视频一区二区在线观看| 亚洲欧美资源在线| 国产精品一区三区在线观看| 成人午夜视频在线观看免费| 久久美女艺术照精彩视频福利播放 | 欧美三级视频在线| 黄页网站在线| 亚洲草草视频| 成人激情黄色小说| 亚洲天堂狠狠干| 午夜免费在线观看精品视频| 日韩片欧美片| 精品人妻二区中文字幕| 色国产综合视频| 欧美黄色视屏| 色噜噜色狠狠狠狠狠综合色一| 国产成人午夜精品5599| 四虎成人在线观看| 欧美成人精品一区| 国产剧情在线观看一区| 欧美熟妇精品一区二区| 欧美亚洲精品一区| 阿v视频在线观看| 中文字幕在线乱| 国产清纯白嫩初高生在线观看91|