異構(gòu)模塊進(jìn)程間通信之 AF_INTE VS AF_UNIX

簡(jiǎn)介 AF_INET / AF_UNIX

進(jìn)程間通信在不強(qiáng)調(diào)性能的情況下是一個(gè)很簡(jiǎn)單的問(wèn)題换途,
通常會(huì)選用 RPC(AF_INET) 來(lái)實(shí)現(xiàn)掀潮,其通信原理大致如下:

AF_INET

可以看到每個(gè)數(shù)據(jù)包都會(huì)經(jīng)過(guò) TCP/IP 協(xié)議棧米辐,性能損耗主要在此洪己,
在不改變接口的情況下使用 IPC(AF_UNIX) 來(lái)實(shí)現(xiàn)進(jìn)程間通信效率會(huì)有很大提升洽故,
如下圖所示 AF_UNIX 直接通過(guò)內(nèi)核緩沖區(qū)copy數(shù)據(jù)届良,省去了TCP/IP協(xié)議棧的工作

AF_UNIX

內(nèi)核為兩種方式提供了相同的接口: socket / bind / connect / accept / send / recv
處理方式也是完全一致的:select / poll / epoll

兩種方式可以無(wú)成本的輕松進(jìn)行切換笆凌,AF_UNIX特別適合異構(gòu)模塊本地進(jìn)程間通信,
下文對(duì)此進(jìn)行了簡(jiǎn)單的測(cè)試士葫,使用 golang 編寫(xiě)了 echo server乞而,并提供了 golangjava 兩種客戶端

啟動(dòng) echoserver

go-afecho$> go run server/main.go
--> tcp :  <nil> [::]:12345
--> ipc :  <nil> /tmp/afecho.ipc

使用 client 測(cè)試

測(cè)試 50w 條 "HelloWorld" 消息,對(duì)比兩種通道的處理能力

go

多次測(cè)試數(shù)據(jù)會(huì)有所波動(dòng)慢显,可以看出用 go 實(shí)現(xiàn)的 AF_UNIX / AF_INET
處理相同的工作性能相差 5 倍以上(理論上應(yīng)該是10倍甚至更多), 具體測(cè)試腳本如下:

go-afecho$> go run client/go/main.go --help
  -a string
        unix: /tmp/afecho.ipc , tcp: localhost:12345 (default "/tmp/afecho.ipc")
  -c int
        total count of message (default 100000)
  -m string
        HelloWorld (default "HelloWorld")
  -n string
        netrowk : tcp / unix (default "unix")

AF_UNIX

client 端:

go-afecho$> go run client/go/main.go -n unix -c 500000 -m HelloWorld
normal quit.
net=unix , msg.size=10 , r=500000 ,w=500000 , time=1.430734597s avg=349470.825021/s

//server 輸出:
--accept--> /tmp/afecho.ipc
<--close-- /tmp/afecho.ipc  500000 1.449517214s 344942.43681330985

AF_INET

client 端:

go-afecho$> go run client/go/main.go -n tcp -a localhost:12345 -c 500000 -m HelloWorld
normal quit.
net=tcp , msg.size=10 , r=500000 ,w=500000 , time=8.105451805s avg=61686.875948/s

//server 輸出:
--accept--> 127.0.0.1:12345 127.0.0.1:54276
<--close-- 127.0.0.1:12345 127.0.0.1:54276 500000 8.127940457s 61516.19867852091

java

golang不同爪模,java不能直接做系統(tǒng)調(diào)用,需要使用JNI/JNR方式調(diào)用c編寫(xiě)的庫(kù)來(lái)中轉(zhuǎn)一下鳍怨,
過(guò)程中應(yīng)會(huì)損失一些性能呻右,完成下面的測(cè)試需要先使用 maven 編譯 java client 具體操作如下:

$> cd go-afecho/client/java/echo-tester
$> mvn package
......
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  3.627 s
[INFO] Finished at: 2020-12-05T11:26:31+08:00
[INFO] ------------------------------------------------------------------------

AF_UNIX

$> java -jar target/echo-tester-1.0-SNAPSHOT.jar unix 500000
1607138984673
done : net=unix , msg.size=12 , total=500000 , time=1543ms , avg=324044.069994/s

// server 輸出:
--accept--> /tmp/afecho.ipc
<--close-- /tmp/afecho.ipc  500000 1.542095908s 324234.0488721406

AF_INET

$> java -jar target/echo-tester-1.0-SNAPSHOT.jar tcp 500000
done : net=tcp , msg.size=12 , total=500000 , time=4830ms , avg=103519.668737/s

// server 輸出:
--accept--> 127.0.0.1:12345 127.0.0.1:54359
<--close-- 127.0.0.1:12345 127.0.0.1:54359 500000 4.832523878s 103465.60361061915

結(jié)果

Client AF_UNIX AF_INET AF_UNIX/AF_INET
go 349470/s 61686/s 5.7
java 324044 103519/s 3.1

結(jié)果只為表明AF_UNIX速度更快,看上去 go 的 tcp 處理比 java 慢純屬測(cè)試代碼的問(wèn)題??

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鞋喇,一起剝皮案震驚了整個(gè)濱河市声滥,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌侦香,老刑警劉巖落塑,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異罐韩,居然都是意外死亡憾赁,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)散吵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)龙考,“玉大人蟆肆,你說(shuō)我怎么就攤上這事』蘅睿” “怎么了炎功?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)缓溅。 經(jīng)常有香客問(wèn)我蛇损,道長(zhǎng),這世上最難降的妖魔是什么坛怪? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任淤齐,我火速辦了婚禮,結(jié)果婚禮上袜匿,老公的妹妹穿的比我還像新娘更啄。我一直安慰自己,他們只是感情好居灯,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布锈死。 她就那樣靜靜地躺著,像睡著了一般穆壕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上其屏,一...
    開(kāi)封第一講書(shū)人閱讀 51,692評(píng)論 1 305
  • 那天喇勋,我揣著相機(jī)與錄音,去河邊找鬼偎行。 笑死川背,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蛤袒。 我是一名探鬼主播熄云,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼妙真!你這毒婦竟也來(lái)了缴允?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤珍德,失蹤者是張志新(化名)和其女友劉穎练般,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體锈候,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡薄料,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了泵琳。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片摄职。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡誊役,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出谷市,到底是詐尸還是另有隱情蛔垢,我是刑警寧澤,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布歌懒,位于F島的核電站啦桌,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏及皂。R本人自食惡果不足惜甫男,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望验烧。 院中可真熱鬧板驳,春花似錦、人聲如沸碍拆。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)感混。三九已至端幼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間弧满,已是汗流浹背婆跑。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留庭呜,地道東北人滑进。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像募谎,于是被迫代替她去往敵國(guó)和親扶关。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容