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

字節(jié)跳動(dòng)開源 Shmipc:基于共享內(nèi)存的高性能 IPC

開源
本文主要介紹 Shmipc 的一些主要的設(shè)計(jì)思路以及后續(xù)的演進(jìn)規(guī)劃。

簡介

CloudWeGo - Shmipc 是字節(jié)跳動(dòng)服務(wù)框架團(tuán)隊(duì)研發(fā)的高性能進(jìn)程間通訊庫,它基于共享內(nèi)存構(gòu)建,具有零拷貝的特點(diǎn),同時(shí)它引入的同步機(jī)制具有批量收割 IO 的能力,相對(duì)于其他進(jìn)程間通訊方式能明顯提升性能。在字節(jié)內(nèi)部,Shmipc 應(yīng)用于 Service Mesh 場景下,mesh proxy 進(jìn)程與業(yè)務(wù)邏輯進(jìn)程、與通用 sidecar 進(jìn)程的通訊, 在大包場景IO 密集型場景能夠取得顯著的性能收益。

開源社區(qū)關(guān)于這方面的資料不多,Shmipc 的開源希望能為社區(qū)貢獻(xiàn)一份力量,提供一份參考。本文主要介紹 Shmipc 的一些主要的設(shè)計(jì)思路以及后續(xù)的演進(jìn)規(guī)劃。?

go 版本實(shí)現(xiàn):

??https://github.com/cloudwego/shmipc-go??

設(shè)計(jì)細(xì)節(jié):

??https://github.com/cloudwego/shmipc-spec???

項(xiàng)目背景

在字節(jié),Service Mesh 在落地的過程中進(jìn)行了大量的性能優(yōu)化工作,其中 Service Mesh 的流量劫持是通過,mesh proxy 與微服務(wù)框架約定的地址進(jìn)行進(jìn)程間通訊來完成,性能會(huì)優(yōu)于開源方案中的 iptables。但常規(guī)的優(yōu)化手段已不能帶來明顯的性能提升。于是我們把目光放到了進(jìn)程間通訊上,Shmipc 由此誕生。

設(shè)計(jì)思路

零拷貝

在生產(chǎn)環(huán)境中比較廣泛使用的進(jìn)程間通訊方式是 unix domain socket 與 TCP loopback(localhost:$PORT),兩者從 benchmark 看性能差異不大。從技術(shù)細(xì)節(jié)看,都需要將通訊的數(shù)據(jù)在用戶態(tài)和內(nèi)核態(tài)之間進(jìn)行拷貝。在 RPC場景下,一次 RPC 流程中在進(jìn)程間通訊上會(huì)有四次的內(nèi)存拷貝,Request 路徑兩次, Response 路徑兩次。

圖片

雖然現(xiàn)代 CPU 上進(jìn)行順序的 copy 非常快,但如果我們能夠消除這多達(dá)四次的內(nèi)存拷貝,在大包場景下也能在一定程度上節(jié)省 CPU 使用。而基于共享內(nèi)存通訊零拷貝的特性,我們可以很容易達(dá)成這一點(diǎn)。但為了達(dá)到零拷貝的效果,圍繞共享內(nèi)存本身,還會(huì)產(chǎn)生有許多額外的工作,比如:

  1. 深入微服務(wù)框架的序列化與反序列化。我們希望當(dāng) Request 或 Response 序列化完成時(shí),對(duì)應(yīng)的二進(jìn)制數(shù)據(jù)已經(jīng)存在共享內(nèi)存中。而不是序列化到一塊非共享內(nèi)存的 buffer 中,然后再拷貝到共享內(nèi)存 buffer。
  2. 實(shí)現(xiàn)一種進(jìn)程同步機(jī)制。當(dāng)一個(gè)進(jìn)程把數(shù)據(jù)寫入共享內(nèi)存后,另外一個(gè)進(jìn)程并不知道,因此需要同步機(jī)制進(jìn)行通知。
  3. 高效的內(nèi)存分配和回收。保證跨進(jìn)程的共享內(nèi)存的分配和回收機(jī)制的開銷足夠低,避免其掩蓋零拷貝的特性帶來的收益。

同步機(jī)制

分場景考慮:

  1. 按需實(shí)時(shí)同步。適用于在線場景,對(duì)時(shí)延極其敏感,每次寫入操作完成后都通知對(duì)端進(jìn)程。Linux 下,可做選擇的比較多,TCP loopback、unix domain socket、event fd 等。event fd的 benchmark 性能會(huì)略好,但跨進(jìn)程傳遞 fd 會(huì)引入過多復(fù)雜性,其帶來的性能提升在 IPC 上不太明顯,復(fù)雜性與性能中間的權(quán)衡需要慎重考慮。在字節(jié),我們選擇了 unix domain socket 來進(jìn)行進(jìn)程同步。
  2. 定時(shí)同步。適用于離線場景,對(duì)時(shí)延不敏感。通過高間隔的 sleep 訪問共享內(nèi)存中自定義的標(biāo)志位來鑒別是否有數(shù)據(jù)寫入。但注意 sleep 本身也需要系統(tǒng)調(diào)用,開銷大于 unix domain socket 的讀寫。
  3. 輪詢同步。適用于時(shí)延非常敏感,CPU不那么敏感的場景。可以通過單核輪詢共享內(nèi)存中的自定義標(biāo)志位來完成。

總的來說按需實(shí)時(shí)同步和定期同步需要系統(tǒng)調(diào)用來完成,輪詢同步不需要系統(tǒng)調(diào)用,但需要常態(tài)跑滿一個(gè) CPU 核心。

批量收割 IO

在線場景中按需實(shí)時(shí)同步,每次數(shù)據(jù)寫入都需要進(jìn)行一次進(jìn)行進(jìn)程同步(下圖中的4),雖然延遲問題解決了,但在性能上,需要交互的數(shù)據(jù)包需要大于一個(gè)比較大的閾值,零拷貝帶來的收益才能突顯。因此在共享內(nèi)存中構(gòu)造了一個(gè) IO 隊(duì)列的來完成批量收割 IO,使其在小包 IO 密集場景也能顯現(xiàn)收益。核心思想是:當(dāng)一個(gè)進(jìn)程把請(qǐng)求寫入 IO隊(duì)列后,會(huì)給另外一個(gè)進(jìn)程發(fā)通知來處理。那么在下一個(gè)請(qǐng)求進(jìn)來時(shí)(對(duì)應(yīng)下圖中的 IOEvent 2~N,一個(gè) IOEvent 可以獨(dú)立描述一個(gè)請(qǐng)求在共享內(nèi)存中的位置),如果對(duì)端進(jìn)程還在處理 IO 隊(duì)列中的請(qǐng)求,那么就不必進(jìn)行通知。因此,IO越密集,批處理效果就越好。

圖片

另外就是離線場景中,定時(shí)同步本身就是批量處理 IO 的,批處理的效果能夠有效減少進(jìn)程同步帶來的系統(tǒng)調(diào)用,sleep 間隔越高,進(jìn)程同步的開銷就越低。

對(duì)于輪詢同步則不需要考慮批量收割 IO,因?yàn)檫@個(gè)機(jī)制本身是為了減少進(jìn)程同步開銷。而輪詢同步直接占滿一個(gè) CPU 核心,相當(dāng)于默認(rèn)把同步機(jī)制的開銷拉滿以獲取極低的同步延遲。

性能收益

Benchmark

圖片

其中X 軸為數(shù)據(jù)包大小,Y軸為一次 Ping-Pong 的耗時(shí),單位為微秒,越小越好。可以看到在小包場景下,Shmipc 相對(duì)于 unix domain socket 也能獲得一些收益,并且隨著包大小越大性能越好

數(shù)據(jù)源:??git clone https://github.com/cloudwego/shmipc-go && go test -bench=BenchmarkParallelPingPong -run BenchmarkParallelPingPong??

生產(chǎn)環(huán)境

在字節(jié)生產(chǎn)環(huán)境的 Service Mesh 生態(tài)中,我們?cè)?nbsp;3000+ 服務(wù)、100w+ 實(shí)例上應(yīng)用了 Shmipc。不同的業(yè)務(wù)場景顯現(xiàn)出不同的收益,其中收益最高的風(fēng)控 業(yè)務(wù)降低了整體24%的資源使用,當(dāng)然也有無明顯收益的甚至劣化的場景出現(xiàn)。但在大包和 IO 密集型場景均能顯現(xiàn)出顯著收益

采坑記錄

在字節(jié)實(shí)際落地的過程中我們也踩了一些坑,導(dǎo)致一些線上事故,比較具有參考價(jià)值。

  1. 共享內(nèi)存泄漏。IPC 過程共享內(nèi)存分配和回收涉及到兩個(gè)進(jìn)程,稍有不慎就容易發(fā)生共享內(nèi)存的泄漏。問題雖然非常棘手,但只要能夠做到泄漏時(shí)主動(dòng)發(fā)現(xiàn),以及泄漏之后有觀測手段可以排查即可。
  1. 主動(dòng)發(fā)現(xiàn)。可以通過增加一些統(tǒng)計(jì)信息然后匯總到監(jiān)控系統(tǒng)來做到主動(dòng)發(fā)現(xiàn),比如總分配和總回收的內(nèi)存大小。
  2. 觀測手段。在設(shè)計(jì)共享內(nèi)存的布局時(shí)增加一些元信息,使得在發(fā)生泄漏之后,我們可以通過內(nèi)置的 debug 工具dump 泄漏時(shí)刻的共享內(nèi)存來進(jìn)行分析。能夠知道所泄漏的內(nèi)存有多少,里面的內(nèi)容是什么,以及和這部分內(nèi)容相關(guān)的一些元信息。
  1. 串包。串包是最頭疼的問題,出現(xiàn)的原因是千奇百怪的,往往造成嚴(yán)重后果。我們?cè)谀硺I(yè)務(wù)上發(fā)生串包事故,出現(xiàn)的原因是因?yàn)榇蟀鼘?dǎo)致共享內(nèi)存耗盡,fallback 到常規(guī)路徑的過程中設(shè)計(jì)存在缺陷,小概率出現(xiàn)串包。排查過程和原因并不具備共性,可以提供更多的參考是增加更多場景的集成測試和單元測試將串包扼殺在搖籃中。
  2. 共享內(nèi)存踩踏。應(yīng)該盡可能使用 memfd 來共享內(nèi)存,而不是 mmap 文件系統(tǒng)中的某個(gè)路徑。早期我們通過 mmap 文件系統(tǒng)的路徑來共享內(nèi)存,Shmipc 的開啟和共享內(nèi)存的路徑由環(huán)境變量指定,啟動(dòng)過程由引導(dǎo)進(jìn)程注入應(yīng)用進(jìn)程。那么存在一種情況是應(yīng)用進(jìn)程可能會(huì) fork 出一個(gè)進(jìn)程,該進(jìn)程繼承了應(yīng)用進(jìn)程的環(huán)境變量并且也集成了 Shmipc,然后 fork 的進(jìn)程和應(yīng)用進(jìn)程 mmap 了同一塊共享內(nèi)存,發(fā)現(xiàn)踩踏。在字節(jié)的事故場景是應(yīng)用進(jìn)程使用了 golang 的 plugin 機(jī)制從外部加載 .so 來運(yùn)行,該 .so 集成了 Shmipc,并且跑在應(yīng)用進(jìn)程里,能看到所有環(huán)境變量,于是就和應(yīng)用進(jìn)程 mmap 了同一片共享內(nèi)存,運(yùn)行過程發(fā)生未定義行為。
  3. Sigbus coredump。早期我們通過 mmap /dev/shm/路徑(tmpfs)下的文件來共享內(nèi)存,應(yīng)用服務(wù)大都運(yùn)行在 docker 容器實(shí)例中。容器實(shí)例對(duì) tmpfs 有容量限制(可以通過 df -h 觀測),這會(huì)使得 mmap 的共享內(nèi)存如果超過該限制就會(huì)出現(xiàn) Sigbus,并且 mmap 本身不會(huì)有任何報(bào)錯(cuò),但在運(yùn)行期,使用到超過限制的地址空間時(shí)才會(huì)出現(xiàn) Sigbus 導(dǎo)致應(yīng)用進(jìn)程崩潰。解決方式和第三點(diǎn)一樣,使用 memfd 來共享內(nèi)存。

后續(xù)演進(jìn)

  1. 整合至微服務(wù) RPC 框架 CloudWeGo/Kitex。
  2. 整合至微服務(wù) HTTP 框架 CloudWeGo/Hertz。
  3. 開源 Rust 版本的 Shmipc 并整合至 Rust RPC 框架 CloudWeGo/Volo。
  4. 開源 C++ 版本的 Shmipc。
  5. 引入定時(shí)同步機(jī)制適用于離線場景。
  6. 引入輪詢同步的同步機(jī)制適用于對(duì)延遲有極致要求的場景。
  7. 賦能其他 IPC 場景, 比如 Log SDK 與 Log Agent, Metrics SDK 與 Metrics Agent 等。

總結(jié)

希望本文能讓大家對(duì)于 Shmipc 有一個(gè)初步的了解,知曉其設(shè)計(jì)原理,更多實(shí)現(xiàn)細(xì)節(jié)以及使用方法請(qǐng)參考文章開頭給出的項(xiàng)目地址。歡迎各位感興趣的同學(xué)向 Shmipc 項(xiàng)目提交 Issue 和 PR,共同建設(shè) CloudWeGo 開源社區(qū),也期望 Shmipc 在 IPC 領(lǐng)域助力越來越多開發(fā)者和企業(yè)構(gòu)建高性能云原生架構(gòu)。

責(zé)任編輯:龐桂玉 來源: 字節(jié)跳動(dòng)技術(shù)團(tuán)隊(duì)
相關(guān)推薦

2022-07-18 17:37:27

字節(jié)跳動(dòng)人工智能AI模型

2024-06-07 14:17:53

2022-05-17 17:18:40

Kite字節(jié)跳動(dòng)微服務(wù)框架

2023-10-18 11:56:17

開源AI

2022-03-21 17:56:59

大模型訓(xùn)練訓(xùn)練框架

2022-03-21 15:06:10

模型字節(jié)跳動(dòng)框架

2024-02-19 00:00:00

前端開源項(xiàng)目

2022-07-18 16:02:10

數(shù)據(jù)庫實(shí)踐

2023-07-19 16:22:00

Hudi機(jī)器學(xué)習(xí)

2022-11-02 10:02:24

BitSail字節(jié)跳動(dòng)數(shù)據(jù)集成

2022-06-22 06:49:39

Hertz開源HTTP 框架

2021-09-09 09:05:30

開源字節(jié)跳動(dòng)CloudWeGo

2011-12-15 13:28:57

2022-08-25 18:48:29

字節(jié)跳動(dòng)CSS開源

2020-10-24 07:30:05

開源字節(jié)跳動(dòng)模型

2020-09-11 15:37:18

GitHub代碼開發(fā)者

2025-04-09 09:20:00

2011-04-25 14:06:23

java

2011-04-07 09:25:25

內(nèi)存Java

2022-12-09 08:40:56

高性能內(nèi)存隊(duì)列
點(diǎn)贊
收藏

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

主站蜘蛛池模板: 国产乱码一二三区精品 | 国产片侵犯亲女视频播放 | 日本理论片好看理论片 | 亚洲一区二区视频 | 奇米影视77 | 欧美a∨| 91视频一区二区三区 | 最新av在线网址 | 久久网国产| 91国内视频在线 | 自拍偷拍中文字幕 | 久久精品日产第一区二区三区 | 国产一区免费 | 久久国产精品视频 | 亚洲精品视频在线观看视频 | 成人在线欧美 | 日日操夜夜操视频 | 亚洲精品www | 成人午夜 | 高清国产午夜精品久久久久久 | www.99re5.com| 中文在线观看视频 | 中文字幕日本一区二区 | 亚洲精品一区在线 | 国产乱码精品一品二品 | 亚洲成人在线网 | 午夜精品久久久久久久久久久久久 | 四虎成人免费视频 | 一本综合久久 | 日韩中文字幕区 | 2020国产在线 | 日韩中文在线观看 | 精品视频一区二区三区 | a级毛片国产| 亚洲一二视频 | 免费午夜剧场 | 天天躁日日躁狠狠躁白人 | 中文字幕欧美一区 | 久久国品片 | 国产日韩欧美电影 | 久草热播 |