处理基于 Android 和 iOS 的应用程序,需要与在同一设备中运行的服务器进行通信。目前使用 TCP 环回连接与 App 和服务器通信(App 编写在用户层,服务器使用 Android NDK 用 C++ 编写)
我想知道用 Unix 域套接字替换内部通信是否会提高性能?
或者一般来说,是否有任何证据/理论证明 Unix 域套接字会比 TCP 环回连接提供更好的性能?
处理基于 Android 和 iOS 的应用程序,需要与在同一设备中运行的服务器进行通信。目前使用 TCP 环回连接与 App 和服务器通信(App 编写在用户层,服务器使用 Android NDK 用 C++ 编写)
我想知道用 Unix 域套接字替换内部通信是否会提高性能?
或者一般来说,是否有任何证据/理论证明 Unix 域套接字会比 TCP 环回连接提供更好的性能?
是的,unix 域套接字的本地进程间通信应该比环回 localhost 连接的通信更快,因为您的 TCP 开销更少,请参见此处。
此基准: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 倍的吞吐量增加了几乎7 倍的吞吐量解释了为什么大多数性能关键软件都有自己的 IPC 自定义协议。
Redis基准测试显示 unix 域套接字可以比 TCP 环回快得多。
当服务器和客户端基准程序在同一个机器上运行时,可以使用 TCP/IP 环回和 unix 域套接字。根据平台的不同,unix 域套接字可以实现比 TCP/IP 环回(例如在 Linux 上)多 50% 的吞吐量。redis-benchmark 的默认行为是使用 TCP/IP 环回。
但是,这种差异仅在吞吐量较高时才有意义。
当两个对等点都在同一主机上时,Unix 域套接字的速度通常是 TCP 套接字的两倍。Unix 域协议不是一个实际的协议套件,而是一种在单个主机上执行客户端/服务器通信的方式,使用相同的 API 用于不同主机上的客户端和服务器。Unix 域协议是进程间通信 (IPC) 方法的替代方案。