Skip to content

Latest commit

 

History

History
75 lines (56 loc) · 5.11 KB

File metadata and controls

75 lines (56 loc) · 5.11 KB

Shmipc

English | 中文

简介

Shmipc是一个由字节跳动开发的高性能进程间通讯库。它基于Linux的共享内存构建,使用unix/tcp连接进行进程同步,实现进程间通讯零拷贝。在IO密集型场景或大包场景能够获得显著的性能收益。

特性

零拷贝

在工业生产环境中,Unix domain socket和Tcp loopback常用于进程间通讯,读写均涉及通讯数据在用户态buffer与内核态buffer的来回拷贝。而Shmipc使用共享内存存放通讯数据,相对于前者没有数据拷贝。

批量收割IO

Shmipc在共享内存中引入了一个IO队列来描述通讯数据的元信息,一个进程可以并发地将多个请求的元信息放入IO队列,另外一个进程只要需要一次同步就能批量收割IO.这在IO密集的场景下能够有效减少进程同步带来的system call。

性能测试

源码中 bench_test.go 进行了Shmipc与Unix domain socket在ping-pong场景下不同数据包大小的性能对比,结果如下所示: 小包场景性能相当,包越大Shmipc的性能优势越明显。

go test -bench=BenchmarkParallelPingPong -run BenchmarkParallelPingPong
goos: linux
goarch: amd64
pkg: github.com/cloudwego/shmipc-go
cpu: Intel(R) Xeon(R) Platinum 8260 CPU @ 2.40GHz
BenchmarkParallelPingPongByShmipc64B-8     	  144470	      7740 ns/op	  25.84 MB/s	     272 B/op	       6 allocs/op
BenchmarkParallelPingPongByShmipc512B-8    	  145243	      8727 ns/op	 159.51 MB/s	    1170 B/op	       6 allocs/op
BenchmarkParallelPingPongByShmipc1KB-8     	  137221	     11467 ns/op	 240.69 MB/s	    2199 B/op	       6 allocs/op
BenchmarkParallelPingPongByShmipc4KB-8     	   67123	     16574 ns/op	 660.78 MB/s	    8403 B/op	       6 allocs/op
BenchmarkParallelPingPongByShmipc16KB-8    	   37604	     34197 ns/op	1278.49 MB/s	   33711 B/op	       6 allocs/op
BenchmarkParallelPingPongByShmipc64KB-8    	   12418	     97118 ns/op	1799.79 MB/s	  138413 B/op	       6 allocs/op
BenchmarkParallelPingPongByShmipc256KB-8   	    3885	    347648 ns/op	2010.89 MB/s	  561896 B/op	       7 allocs/op
BenchmarkParallelPingPongByShmipc512KB-8   	    2122	    567535 ns/op	2463.51 MB/s	 1126969 B/op	       7 allocs/op
BenchmarkParallelPingPongByShmipc1MB-8     	    1147	   1078216 ns/op	2593.39 MB/s	 2258771 B/op	       7 allocs/op
BenchmarkParallelPingPongByShmipc4MB-8     	     302	   4163412 ns/op	2686.46 MB/s	 9185775 B/op	       8 allocs/op
BenchmarkParallelPingPongByUds64B-8        	  227320	      5523 ns/op	  36.21 MB/s	     720 B/op	      10 allocs/op
BenchmarkParallelPingPongByUds512B-8       	  123703	      8154 ns/op	 170.72 MB/s	    3988 B/op	      10 allocs/op
BenchmarkParallelPingPongByUds1KB-8        	  100774	     10796 ns/op	 255.66 MB/s	    7837 B/op	      10 allocs/op
BenchmarkParallelPingPongByUds4KB-8        	   39502	     31889 ns/op	 343.44 MB/s	   33147 B/op	      10 allocs/op
BenchmarkParallelPingPongByUds16KB-8       	   10116	    114273 ns/op	 382.59 MB/s	  134418 B/op	      10 allocs/op
BenchmarkParallelPingPongByUds64KB-8       	    5803	    216532 ns/op	 807.23 MB/s	  521737 B/op	      11 allocs/op
BenchmarkParallelPingPongByUds256KB-8      	    2078	    520211 ns/op	1343.84 MB/s	 2043899 B/op	      11 allocs/op
BenchmarkParallelPingPongByUds512KB-8      	    1237	    892046 ns/op	1567.33 MB/s	 4061270 B/op	      11 allocs/op
BenchmarkParallelPingPongByUds1MB-8        	     703	   2626436 ns/op	1064.65 MB/s	 8087850 B/op	      11 allocs/op
BenchmarkParallelPingPongByUds4MB-8        	     171	   5893266 ns/op	1897.90 MB/s	33747030 B/op	      13 allocs/op
PASS
ok  	github.com/cloudwego/shmipc-go	43.834s
  • BenchmarkParallelPingPongByUds,基于Unix domain socket进行ping-pong通讯。
  • BenchmarkParallelPingPongByShmipc,基于Shmipc进行ping-pong通讯。
  • 后缀为ping-pong的数据包大小, 从 64 Byte ~ 4MB 不等。
  • Stream.BufferWriter()和Stream.BufferReader()提供了共享内存的buffer读写接口,其中使用ReadBytes()和Reserve()方法可以进行零拷贝的读和写.

快速开始

HelloWorld

与应用集成

热升级

热升级demo