UNIX域套接字 vs 共享内存(映射文件)

54

有人能告诉我,UNIX域套接字与共享内存(或替代的内存映射文件)相比有多慢吗?

谢谢。

5个回答

86

这更多是一个设计问题,而不是速度问题(共享内存确实更快),域套接字明显更符合UNIX风格,且会出现较少的问题。在选择时要事先了解:

域套接字优点

  • 阻塞和非阻塞模式及其之间的切换
  • 完成任务后无需释放它们

域套接字缺点

  • 必须按线性方式读取和写入

共享内存优点

  • 非线性存储
  • 永远不会阻塞
  • 多个程序可以访问它

共享内存缺点

  • 需要锁定实现
  • 即使未被任何程序使用也需要手动释放

这就是我现在所能想到的全部。但是,我会每天都选择域套接字——更不用说重新实现它们以进行分布式计算要容易得多。由于需要安全设计,共享内存的速度优势将会丧失。但是,如果您确切地知道自己在做什么,并使用适当的内核调用,您就可以通过共享内存获得更高的速度。


感谢您详细的回答和比较! - SyBer
2
即使未被任何程序使用,也需要手动释放,可以通过/dev/ashmem来解决。 - Vi.

15

就速度而言,共享内存绝对是胜者。通过套接字,数据至少会复制两次——从发送进程到内核缓冲区,然后从内核到接收进程。而使用共享内存,延迟只受限于盒子上的核之间的高速缓存一致性算法。

正如Kornel所指出的那样,处理共享内存更加复杂,因为您必须想出自己的同步/信号方案,这可能会根据您选择的路线增加延迟。在共享内存中一定要使用信号量(在Linux上实现为futex),以避免在非竞争情况下进行系统调用。


1
我相信Unix域套接字与普通套接字的区别在于,一个端点上的写操作直接进入另一端点的接收缓冲区,因此不一定需要额外的复制。如果您能找到一种方法让应用程序实际上使用共享内存中的同一对象而不是将其复制出来,则可能仍然需要更多的复制。 - Joseph Garvin
至少会有两份额外的拷贝 - 从用户到内核,然后再返回。 - Nikolai Fetissov
这只有在超过512字节时才成立吧?(Linux上为4096字节) - JSON

6

两者都是进程间通信(IPC)机制。 UNIX域套接字用于在同一主机上的进程之间进行通信,类似于TCP套接字用于不同主机之间的通信。 共享内存(SHM)是一个内存片段,您可以将数据放入其中并在进程之间共享此数据。 使用指针,SHM提供随机访问,套接字可以被写入或读取,但您无法倒带或定位。


6

@Kornel Kisielewicz的回答我认为很好。这里只是为了sockets添加我的结果,不仅涉及Unix域套接字。

共享内存

  • 性能非常高。使用RAW访问数据时无需复制。肯定是最快的访问方式。
  • 需要同步。对于复杂情况,设计不是很容易设置。
  • 大小固定。可以增加共享内存,但必须先取消映射内存,然后增大,并重新映射。
  • 信号机制可能相当慢,请参见此处:Boost.Interprocess notify() performance。特别是如果您想在进程之间进行大量交换。信号机制的设置也不是很容易。

套接字

  • 易于设置。
  • 可用于不同的计算机上。
  • 不需要复杂的同步。
  • 如果使用TCP,则大小不是问题。简单的设计,包含数据包大小的头信息,然后发送数据。
  • Ping/Pong交换很快,因为可以被操作系统视为硬件中断。
  • 性能平均:会复制几份数据。
  • 与共享内存相比,CPU消耗较高。如果经常使用套接字调用,则套接字调用不便宜。

在我的测试中,小块数据的交换(每秒约1MB)对于共享内存没有真正的优势。我甚至要说,由于简单而有效的信令机制,使用TCP的Ping/Pong交换更快。但是,当交换大量数据时(约每秒200MB),使用套接字时,CPU消耗20%,而使用共享内存时仅消耗3%的CPU。因此,在CPU方面,共享内存取得了巨大的胜利,因为read和write套接字调用并不便宜。


-1
在这种情况下 - sockets 更快。写入共享内存比任何IPC都要快,但是写入内存映射文件和写入共享内存是两个完全不同的事情。
当写入内存映射文件时,您需要将已写入的内容“刷新”到实际绑定的文件中(不完全是这样,刷新是由系统自动完成的),因此您首先将数据复制到共享内存中,然后再次复制(刷新)到实际文件中,这非常昂贵 - 比任何东西都要昂贵,甚至比写入socket还要昂贵,这样做没有任何好处。

4
这不是真的。通过内存映射文件(通常的机制),设置共享内存相对简单,并且可以实现数据快速共享。 - Justin King-Lacroix
另外,为了避免混淆,mmaped文件存在于内存中而不是物理磁盘上,并且不具有由物理磁盘机制及其相关驱动程序创建的相同性能限制。只有在使用持久化的mmaped文件时才会将数据写入磁盘。 - JSON

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接