TCP 环回连接与 Unix domain socket 性能的比较

使用基于 Android 和 iOS 的应用程序,这些应用程序需要与运行在同一设备上的服务器进行通信。目前使用 TCP 环回连接与应用程序和服务器通信(应用程序编写在用户层,服务器编写在 C + + 使用 Android NDK)

我想知道用 Unix domain socket 代替内部通信是否会提高性能?

或者总的来说,是否有任何证据/理论能够证明 Unix domain socket 能够提供比 TCP 环回连接更好的性能?

95367 次浏览

是的,Unix 域套接字的本地进程间通信应该比环回本地主机连接的通信更快,因为 TCP 开销更小,请参阅 给你

当两个对等点都在同一个主机上时,Unix 域套接字的速度通常是 TCP 套接字的两倍。 Unix 域协议不是一个实际的协议套件,而是一种在单个主机上执行客户机/服务器通信的方法,使用的 API 与在不同主机上用于客户机和服务器的 API 相同。Unix 域协议是进程间通信(IPC)方法的一种替代方法。

Redis基准显示 Unix domain socket 可以比 TCP 环回快得多。

当服务器和客户端基准测试程序在同一个机器上运行时,可以使用 TCP/IP 环回和 unix 域套接字。根据不同的平台,unix 域套接字的吞吐量可以比 TCP/IP 环回(例如在 Linux 上)高出约50% 。重定向基准测试的默认行为是使用 TCP/IP 环回。

但是,只有当吞吐量高时,这种差异才重要。

Throughput per data size

这个基准测试: < a href = “ https://github.com/rigtorp/ipc-bench”rel = “ norefrer”> https://github.com/rigtorp/ipc-bench 为 TCP 套接字、 Unix 域套接字(UDS)和 PIPE 提供延迟和吞吐量测试。

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

66% 的延迟 减少和几乎 7倍的吞吐量解释了为什么大多数性能关键软件有自己的 IPC 定制协议。

Unix 域套接字确实比 TCP 快,这里提供的大多数答案都是这样的。我还要补充一点,尽管对性能数据进行基准测试总是一个好主意,因为不同平台之间可能存在差异。下面是一个很好的基准测试集,涵盖了执行 IPC 的各种方法: https://github.com/goldsborough/ipc-bench