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


115

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

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

还是总的来说,有什么证据/理论证明Unix域套接字比TCP回送连接具有更好的性能?


3
请记住,本地套接字(UNIX域套接字)需要文件系统中的文件。使用TCP回送地址会将其全部保留在内存中。而且,如果您必须使用远程TCP套接字,则集成另一个TCP套接字而不是摆弄新的套接字和地址系列可能会更容易。
2013年

1
@JoachimPileborg仅在Linux(Android)上开发时,可以选择使用抽象的 UNIX域套接字地址,该文件不需要文件系统中的文件。
thuovila

请参阅stackoverflow.com/questions/14643571/…以获取android连接。
RDX

8
@Someprogrammerdude他们需要文件系统中的一个文件,但这并不意味着所有内容都会转移到磁盘上并返回。
罗恩侯爵

3
@Someprogrammerdude只有文件名,所有权和权限信息才会存储在文件系统中。所有实际的数据传输完全在内存中进行。
杰森'18

Answers:


105

是的,由于您的TCP开销较小,因此通过Unix域套接字进行的本地进程间通信应比通过环回localhost连接进行的通信更快,请参见此处


12
第一个链接引用了第二个链接,该链接来自2005年(旧)。它仅涵盖FreeBSD
Janus Troelsen 2014年

7
这个答案是错误的,因为在现代linux上测试回送tcp的速度与UDS一样快,有时甚至更快。可以根据需要提供基准测试
easytiger 2014年

10
这个答案是绝对正确的。环回接口仍然是TCP,这意味着您仍然有TCP的开销(拥塞控制,流控制,流管理(IP数据包排序,重传等))。Unix域套接字不执行上述任何操作,因为它是从头开始设计为在本地运行的,这意味着没有拥塞问题,没有需要流控制的服务器/客户端之间的速度差异,没有丢失的数据包等。 ,不是新事物。
JSON

4
本地UDP呢?
CMCDragonkai 2014年

2
鉴于第一个链接已失效(HTTP 404)...这就是为什么stackoverflow最佳做法是在撰写答案时至少从源URL中提供简短明了的相关引号(然后当链接断开时简短摘要仍然可用)。
Trevor Boyd Smith,

80

该基准测试: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自定义协议。


7
在我看来,他们的产品可以解决这个问题!也许这就是为什么他们要回答这些问题。因为他们知道答案。
GreenReaper

这是一个很好的答案,因为它有一些数字。在i5上,从TCP到UNIX的吞吐量提高了350%,从UNIX到PIPE的吞吐量提高了40%。
ScalaWilliam '16

13
@GreenReaper答案的确是相关的,但是我们的Torusware Speedus产品系列...带有2个版本,Speedus Lite和Speedus Extreme Performance(EP)没有,这听起来很便宜。
德米特里·格里戈里耶夫

3
垃圾邮件。不,他的产品与TCP和Unix套接字之间的比较无关。套接字有很多常识性的替代方法,每一种都超出了OP的要求
JSON

该工具的用法没有得到足够的解释。是否以某种方式解释了如何调用客户端和服务器的页面?
falkb

40

Redis 基准测试表明,Unix域套接字比TCP环回显着更快。

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

但是,这种差异仅在吞吐量高时才重要。

每个数据大小的吞吐量


8

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.