目录

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

关于
221.0 KB
邀请码
    Gitlink(确实开源)
  • 加入我们
  • 官网邮箱:gitlink@ccf.org.cn
  • QQ群
  • QQ群
  • 公众号
  • 公众号

版权所有:中国计算机学会技术支持:开源发展技术委员会
京ICP备13000930号-9 京公网安备 11010802032778号