English | 中文
Shmipc是一个由字节跳动开发的高性能进程间通讯库。它基于Linux的共享内存构建,使用unix/tcp连接进行进程同步,实现进程间通讯零拷贝。在IO密集型场景或大包场景能够获得显著的性能收益。
在工业生产环境中,Unix domain socket和Tcp loopback常用于进程间通讯,读写均涉及通讯数据在用户态buffer与内核态buffer的来回拷贝。而Shmipc使用共享内存存放通讯数据,相对于前者没有数据拷贝。
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()方法可以进行零拷贝的读和写.