技术解析

进程间通信用 Unix Domain Socket 比 loopback 好在哪?
0
2021-06-11 23:24:34
idczone

为了性能?还是为了 sock抗投诉服务器 文件权限便于控制?


性能更高,也方便权限控制

你还能跑出性能差别来?

明显我这是疑问句

性能差距真的有这么大么

内核处理 unix domain socket 的时候没有 routing netfilter 这些没用的步骤,所以会比 loopback 更快一些
文件相比 listening socket 更方便控制权限,还能省一个端口号

省端口确实没想到


不过性能差距在高负载的时候才能体现出来

获得一定的性能提升。
损失了一定的跨平台性,直到 Win10 17063 版本以后才支持 AF_UNIX.
天下没有免费的午餐。

UDS 可以传输 fd,实现内存共享。
虚拟化中 vhost user 强依赖这个特性。

https://lists.freebsd.org/pipermail/freebsd-performance/2005-February/001143.html

https://github.com/rigtorp/ipc-bench
Here you have the results on a single CPU 3.3GHz Linux machine :
TCP average latency: 6 us
UDS average latency: 2 us
PIPE average latency: 2 us
TCP average throughput: 0.253702 million msg/s
UDS average throughput: 1.733874 million msg/s
PIPE average throughput: 1.682796 million msg/s

Loopback 可以跨操作系统,unix_domain_socket 顾名思义

win 上也有了。。就是这么神奇。java 也支持了

奇怪,凭什么比 pipe 快??

和机器或者操作系统也有关吧,我这是从 StackOverflow 上摘抄的,下面有评论也说他测试 pipe 比 uds 更好的。https://stackoverflow.com/questions/14973942/tcp-loopback-connection-vs-unix-domain-socket-performance

因为 UDS 本身就是内核级 IPC 机制,完全不走 TCP/IP 协议栈,内核里缓冲区拷贝一下就完事的东西,本来就应该和 pipe 不相上下的。

loopback 接口不走网卡,但是仍要走 TCP/IP 协议栈,还是有一定性能损失的。而且 loopback 接口设计的本意是让开发者可以方便地本地测试网络应用,支持 IPC 只是副产品。UDS 就是专门做本地 IPC 的,更简单纯粹。

另外 UDS 除了 STREAM 和 DGRAM 以外,还支持 SEQPACKET, RDM 等等 TCP/IP 通常情况下不支持的 socket 类型。
(只针对类 UNIX 系统,Windows 10 新增的 UDS 支持在这方面还是有限的)

你这不是答非所问么。我问的是为什么比 pipe 快,你回答说不相上下

我是按照 11 楼的数据说的,他给出的数据 UDS 和 PIPE 之间的差距远比两者和 TCP 之间的差距小,有理由认为是误差。

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服