【发布时间】:2021-07-29 17:26:10
【问题描述】:
谁能告诉我,与共享内存(或替代内存映射文件)相比,UNIX 域套接字有多慢?
谢谢。
【问题讨论】:
谁能告诉我,与共享内存(或替代内存映射文件)相比,UNIX 域套接字有多慢?
谢谢。
【问题讨论】:
这更多的是设计问题,而不是速度(共享内存更快),域套接字绝对是 UNIX 风格的,并且做的问题要少得多。在选择方面事先知道:
域套接字的优势
域套接字的缺点
共享内存优势
共享内存的缺点
这就是我现在能想到的。但是,我每天都会使用域套接字——更不用说重新实现它们来进行分布式计算要容易得多。由于需要安全的设计,共享内存的速度增益将丢失。但是,如果您确切知道自己在做什么,并使用正确的内核调用,您可以通过共享内存实现更快的速度。
【讨论】:
need manual freeing, even if unused by any program可以和/dev/ashmem对战
在速度方面共享内存绝对是赢家。使用套接字,您将拥有至少两个数据副本——从发送进程到内核缓冲区,然后从内核到接收进程。使用共享内存,延迟将仅受盒子上内核之间的缓存一致性算法的约束。
不过,正如 Kornel 所指出的,处理共享内存更复杂,因为您必须提出自己的同步/信令方案,这可能会增加延迟,具体取决于您走的路线。一定要在共享内存中使用信号量(在 Linux 上用futex 实现)以避免非竞争情况下的系统调用。
【讨论】:
两者都是进程间通信 (IPC) 机制。 UNIX 域套接字用于一台主机上的进程之间的通信,类似于在不同主机之间使用 TCP 套接字。 共享内存 (SHM) 是一块内存,您可以在其中放置数据并在进程之间共享。 SHM 通过使用指针为您提供随机访问,可以写入或读取套接字,但您不能倒带或定位。
【讨论】:
@Kornel Kisielewicz 的回答是很好的 IMO。只需在此处为套接字添加我自己的结果,而不仅仅是 Unix 域套接字。
共享内存
套接字
在我的测试中,小块数据(大约 1MByte/秒)的交换显示共享内存没有真正的优势。我什至会说使用 TCP 的 ping/pong 交换更快(由于简单而有效的信号机制)。 但是在交换大量数据(大约 200MBytes/秒)时,我使用套接字的 CPU 消耗为 20%,而使用共享内存的 CPU 消耗为 3%。所以在 CPU 方面共享内存是一个巨大的胜利,因为read 和write 套接字调用并不便宜。
【讨论】:
在这种情况下 - 套接字更快。写入共享内存比任何 IPC 都快,但是写入内存映射文件和写入共享内存是完全不同的两件事。
在写入内存映射文件时,您需要将写入共享内存的内容“刷新”到实际的绑定文件(不完全是,正在为您完成刷新),因此您首先将数据复制到共享内存,然后你将它再次复制(刷新)到实际文件中,这是超级膨胀的 - 比任何东西都多,甚至比写入套接字还要多,这样做你一无所获。
【讨论】: