本地 unix 套接字 - 吞吐量的粗略概念

sa2*_*289 11 performance socket

有没有人知道使用本地 unix 套接字进行进程间通信的吞吐量基准/测量?

我想说明在与从数据库请求数据的软件相同的服务器上拥有本地数据库实例的性能优势,而不是必须通过网络链接进行通信,尤其是像千兆以太网这样的网络链接,我预计它会很慢相对而言。

在网上搜索时,我发现一些基准显示每秒的操作数,但没有显示每秒的吞吐量(即 12GB/s)。

我知道性能会因诸如给定系统上的内存吞吐量或其他硬件特性等因素而有所不同,但只需要一个粗略的想法。

这不是指本地 TCP 性能或与之比较。

zep*_*lin 21

您可以使用socat进行简单的 UNIX 套接字速度测试。

以下是我在笔记本电脑上得到的结果:

#Generate 1GB random file in the "shared memory" (i.e. RAM disk) 
>dd if=/dev/urandom of=/dev/shm/data.dump bs=1M count=1024
Run Code Online (Sandbox Code Playgroud)

内存到磁盘 (SSD),通过 UNIX 套接字

>socat -u -b32768 UNIX-LISTEN:/tmp/unix.sock ./data.dump &
>socat -u -b32768 "SYSTEM:dd if=/dev/shm/data.dump bs=1M count=1024" UNIX:/tmp/unix.sock
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 1.96942 s, 545 MB/s
Run Code Online (Sandbox Code Playgroud)

内存到内存,通过 UNIX 套接字

>socat -u -b32768 UNIX-LISTEN:/tmp/unix.sock /dev/shm/data.dump.out &
>socat -u -b32768 "SYSTEM:dd if=/dev/shm/data.dump bs=1M count=1024" UNIX:/tmp/unix.sock
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 0.927163 s, 1.2 GB/s
Run Code Online (Sandbox Code Playgroud)

内存到 /dev/null(丢弃),通过 UNIX 套接字

>socat -u -b32768 UNIX-LISTEN:/tmp/unix.sock /dev/null &
>socat -u -b32768 "SYSTEM:dd if=/dev/shm/data.dump bs=1M count=1024" UNIX:/tmp/unix.sock
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 0.720415 s, 1.5 GB/s
Run Code Online (Sandbox Code Playgroud)

/dev/zero 到 /dev/null,通过 UNIX 套接字

>socat -u -b32768 UNIX-LISTEN:/tmp/unix.sock /dev/null &
>socat -u -b32768 "SYSTEM:dd if=/dev/zero bs=1M count=1024" UNIX:/tmp/unix.sock
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 0.491179 s, 2.2 GB/s
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,即使是“内存到磁盘”测试吞吐量也是 545MB/s(即 ~ 4360MiB/s),这远远领先于 1GB 以太网连接的最大理论吞吐量(即 ~ 1000/8 = 125MB/s,甚至不考虑任何协议开销)。

聚苯乙烯

请注意,这只是使用一些简单工具的简单测试,而不是真正的、适当的基准测试。