TCP 环回连接与 Unix 域套接字性能

Posted

技术标签:

【中文标题】TCP 环回连接与 Unix 域套接字性能【英文标题】:TCP loopback connection vs Unix Domain Socket performance 【发布时间】:2013-02-05 02:31:52 【问题描述】:

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

我想知道用 Unix Domain 套接字替换内部通信是否会提高性能?

或者一般而言,是否有任何证据/理论证明 Unix 域套接字会比 TCP 环回连接提供更好的性能?

【问题讨论】:

请记住,本地套接字(UNIX 域套接字)需要文件系统中的文件。使用 TCP 环回地址将其全部保存在内存中。如果您必须使用远程 TCP 套接字,那么集成另一个 TCP 套接字可能会更容易,而不是摆弄一个新的套接字和地址系列。 @JoachimPileborg 当只为 Linux (Android) 开发时,可以选择使用 abstract UNIX 域套接字地址,它不需要文件系统中的文件。 请参考***.com/questions/14643571/… 进行安卓连接。 @Someprogrammerdude 他们在文件系统中需要一个文件,但这并不意味着所有的东西都在磁盘上然后返回。 @Someprogrammerdude 只有文件名、所有权和权限信息才会存储在文件系统中。所有实际的数据传输都完全在内存中进行。 【参考方案1】:

是的,unix 域套接字的本地进程间通信应该比环回本地主机连接的通信更快,因为您的 TCP 开销更少,请参阅here。

【讨论】:

第一个链接引用了第二个链接,它来自 2005 年(旧)。它只涵盖 FreeBSD 这个答案是错误的,当在现代 linux 上测试 loopback tcp 和 UDS 一样快,有时甚至更快。如果需要可以提供基准 这个答案是绝对正确的。 Loopback 接口仍然是 TCP,这意味着您仍然有 TCP 的开销(拥塞控制、流量控制、流管理(IP 数据包排序、重传等))。 Unix 域套接字不执行上述任何操作,因为它从一开始就被设计为在本地运行,这意味着没有拥塞问题、需要流量控制的服务器/客户端之间没有速度差异、没有丢包等。如果有疑问,请谷歌,不是什么新鲜事。 本地 UDP 怎么样? 鉴于第一个链接已失效(HTTP 404)...这就是为什么 *** 的最佳实践是在回答时至少提供来自源 URL 的简短/简洁的相关引用写作(然后当链接断开时,简短的摘要仍然可用)。【参考方案2】:

这个基准: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 自定义协议。

【讨论】:

听起来他们的产品是解决问题的方法!也许这就是他们回答这些问题的原因;因为他们知道答案。 这是一个很好的答案,因为它有一些数字。在 i5 上,从 TCP 到 UNIX 的吞吐量提高了 350%,从 UNIX 到 PIPE 提高了 40%。 @GreenReaper 答案确实是相关的,但 我们的 Torusware Speedus 产品 ... 有 2 个版本,Speedus Lite 和 Speedus Extreme Performance (EP) 不是,它使整个事情听起来像一个廉价的广告。 垃圾邮件。不,他的产品与 TCP 和 Unix 套接字之间的比较无关。套接字有很多常识性的替代方案——每一个都超出了 OP 的要求 该工具的用法没有得到充分解释。是否有一个页面解释如何调用客户端和服务器?【参考方案3】:

Redis benchmark 表明 unix 域套接字可以比 TCP 环回快得多。

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

但是,这种差异仅在吞吐量较高时才有意义。

【讨论】:

【参考方案4】:

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

【讨论】:

以上是关于TCP 环回连接与 Unix 域套接字性能的主要内容,如果未能解决你的问题,请参考以下文章

如何确定打开的套接字是 TCP 还是 unix 域套接字?

高流量站点NGINX与PHP-fpm配置优化

高流量站点NGINX与PHP-fpm配置优化

通过UNIX域套接字传递文件描述符

Nebula系列通过UNIX域套接字传递描述符的应用

如何禁止mysql的dns反查功能