成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Go1.24 新特性:自旋互斥 lock2 優化,性能有一定提高!

開發 前端
通過上述的分析,原作者發現當前的 lock2 實現雖然理論上允許線程睡眠,但實際上導致所有線程都在自旋,自旋的線程至少與(并且可能也導致)更慢的鎖傳遞有關,帶來了不少的性能損耗。

大家好,我是煎魚。

除了上次跟大家提到的 map 使用 Swiss Table 來替換 Hashmap 的原始實現以外。本次 Go1.24 新版本還帶來了更多的有效優化。

今天這篇文章將繼續和大家一起學習自旋互斥 lock2 優化。

背景

提案作者 @Rhys Hiltner 在 2024 年提出了改進互斥鎖的性能優化訴求:

圖片

其個人對于 runtime.mutex 值的部分經驗是:整個進程會因為對單個 mutex 的需求使得整個程序緩慢運行。

我不認為這一點會讓人感到意外,盡管速度減慢的程度超出了我的預期。主要的驚喜在于,程序一旦跌落性能懸崖,就很難再恢復過來。

性能測試

在基準測試 ChanContended 中,作者發現隨著 GOMAXPROCS 的增加,mutex 的性能明顯下降。

  • Intel i7-13700H (linux/amd64):
  • 當允許使用 4 個線程時,整個進程的吞吐量是單線程時的一半。
  • 當允許使用 8 個線程時,吞吐量再次減半。
  • 當允許使用 12 個線程時,吞吐量再次減半。
  • 在 GOMAXPROCS=20 時,200 次通道操作平均耗時 44 微秒,平均每 220 納秒調用一次 unlock2,每次都有機會喚醒一個睡眠線程。
  • M1 MacBook Air (darwin/arm64):
  • 當允許使用 5 個線程時,吞吐量不到單線程時的一半。

另一個角度是考慮進程的 CPU 占用時間。

下面的數據顯示,在 1.78 秒的掛鐘時間內,進程的 20 個線程在 lock2 調用中總共有 27.74 秒處于 CPU 上。

如下測試報告:

$ go test runtime -test.run='^$' -test.bench=ChanContended -test.cpu=20 -test.count=1 -test.cpuprofile=/tmp/p
goos: linux
goarch: amd64
pkg: runtime
cpu: 13th Gen Intel(R) Core(TM) i7-13700H
BenchmarkChanContended-20        26667      44404 ns/op
PASS
ok   runtime 1.785s

$ go tool pprof -peek runtime.lock2 /tmp/p
File: runtime.test
Type: cpu
Time: Jul 24, 2024 at 8:45pm (UTC)
Duration: 1.78s, Total samples = 31.32s (1759.32%)
Showing nodes accounting for 31.32s, 100% of 31.32s total
----------------------------------------------------------+-------------
      flat  flat%   sum%        cum   cum%   calls calls% + context
----------------------------------------------------------+-------------
                                            27.74s   100% |   runtime.lockWithRank
     4.57s 14.59% 14.59%     27.74s 88.57%                | runtime.lock2
                                            19.50s 70.30% |   runtime.procyield
                                             2.74s  9.88% |   runtime.futexsleep
                                             0.84s  3.03% |   runtime.osyield
                                             0.07s  0.25% |   runtime.(*lockTimer).begin
                                             0.02s 0.072% |   runtime.(*lockTimer).end
----------------------------------------------------------+-------------

關鍵問題之一:這些 lock2 相關的線程并沒有休眠,而是一直在自旋!

新提案:增加 spinning 狀態

發現問題

通過上述的分析,原作者發現當前的 lock2 實現雖然理論上允許線程睡眠,但實際上導致所有線程都在自旋,自旋的線程至少與(并且可能也導致)更慢的鎖傳遞有關,帶來了不少的性能損耗。

@Rhys Hiltner 進而提出了新的設計方案《Proposal: Improve scalability of runtime.lock2[1]》。大家有興趣的可以認真看下。下面提及主要優化部分。

圖片

核心優化點

核心的觀點在于:擴展互斥鎖的 mutex 狀態字,加入一個新的標志位,稱為 “spinning”(旋轉)。

使用這個 “spinning” 位來表示是否有一個等待的線程處于 “醒著并循環嘗試獲取鎖” 的狀態。線程之間會互相排除進入 “spinning” 狀態,但它們不會因為嘗試獲取這個標志位而阻塞。

只有持有 “spinning” 位的線程可以循環重新加載 mutex 狀態字。這個線程在進入休眠之前會釋放 “spinning” 位。其他等待線程則會直接進入休眠,而不會嘗試爭奪 “spinning” 位。

當某個線程解鎖互斥鎖時,如果發現已經有線程處于 “醒著并旋轉” 的狀態,就可以避免喚醒其他線程。在 Go 運行時的背景下,這種設計被稱為 “spinbit”(旋轉位)。

簡單來說,這個設計的核心目的是:通過讓一個線程負責 “旋轉嘗試獲取鎖”,避免所有線程都同時競爭資源,從而減少爭用和不必要的線程切換。

兼容性和多平臺

本次對于兼容性有保障,導出 API 沒有變化。所以我們只需要升級到新版本 Go1.24 就可以白嫖這個優化點了!

目前該優化支持 futex 和 Xchg8 系統調用兩個類型。futex 專門用于 GOOS=linux 平臺。futex 是主要實現,整體綜合表現會好一些。

在已支持的平臺上會默認打開 GOEXPERIMENT=spinbitmutex 以此應用該實驗性規則。如果大家不需要可以進行關閉。

參考資料

[1]Proposal: Improve scalability of runtime.lock2: https://github.com/golang/proposal/blob/master/design/68578-mutex-spinbit.md

責任編輯:武曉燕 來源: 腦子進煎魚了
相關推薦

2025-01-06 09:18:04

2025-02-12 08:50:22

2024-12-30 11:05:28

泛型Go類型別名

2024-12-23 08:44:49

2025-05-07 08:55:14

GoMap存儲

2022-05-05 11:20:08

KubernetesDocker云計算

2025-02-07 09:18:05

機制Go函數

2024-09-03 08:49:01

2025-03-07 09:12:28

2025-02-08 11:00:33

2013-05-15 09:37:00

GoGo1.1性能測試

2022-12-09 08:52:51

Go匿名接口

2025-05-26 10:10:00

Go開發testing

2022-05-02 09:21:25

微信微信支付

2021-01-14 10:38:41

Java枚舉工具

2021-09-01 07:21:46

堆棧Gopanic

2022-09-30 14:00:50

JavaScrip新特性代碼

2021-09-05 18:25:30

Go命令倉庫

2025-05-06 08:00:35

2021-02-02 09:10:12

Go語言二進制
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: av电影一区| 91欧美激情一区二区三区成人 | 国产一区二区观看 | 亚洲欧美精品一区 | 亚洲v区| 欧美一区二区三区在线免费观看 | 国产精品久久久久久久久图文区 | 在线观看视频一区 | 国产黄a一级 | 日本精a在线观看 | 国产高清久久 | 亚洲精品视频免费观看 | 亚洲国产成人av好男人在线观看 | 四虎国产 | 国产高清一二三区 | 国产高清一区二区三区 | 国产成人精品久久二区二区91 | 韩日在线| 亚洲狠狠爱 | 国产成人精品一区二区三区网站观看 | 黑人精品欧美一区二区蜜桃 | 久久噜噜噜精品国产亚洲综合 | 午夜爽爽爽男女免费观看 | 91久久 | 成人在线免费观看 | 国产精品久久久久久久久久久久久久 | 成人免费看黄网站在线观看 | 久久久91精品国产一区二区三区 | 亚洲综合资源 | 欧美精品国产一区二区 | 精品欧美一区二区三区精品久久 | 盗摄精品av一区二区三区 | 91久久久久久久久久久 | 老司机午夜性大片 | 欧美一区二区三区高清视频 | 午夜羞羞 | 91精品国产综合久久久久久丝袜 | 亚洲色欲色欲www | 欧美久久精品一级黑人c片 91免费在线视频 | 久久美女视频 | 狠狠干美女|