【问题标题】:IPC: Ramdisk V.S. socketIPC:Ramdisk V.S.插座
【发布时间】:2014-01-06 06:27:46
【问题描述】:

我需要在 Linux(CentOS) 下的 Java 和 C++ 程序之间传输大量数据。性能是第一个关注点。 什么会是最好的选择? RAMDisk (/dev/shm/) 还是本地套接字?

【问题讨论】:

  • 您进行过任何测试吗?
  • /dev/shm 不是 ramdisk,ramdisk 是一块被视为磁盘驱动器的内存。 /dev/shm 是共享内存。
  • 好的,/dev/shm 不是 ram 磁盘,但它非常相似——至少性能相似。我的情况是有 16 个客户端会生成很多小文件(小于 1MB)并将这些文件发送到服务器(客户端和服务器在同一主机中)。数据总量约为1TB。如果我使用 /dev/shm 进行 IPC,文件将被写入子文件夹,当文件夹大于 100MB 时,客户端将创建另一个文件夹并将新数据文件写入新文件夹。当文件夹已满(超过 100MB)时,客户端会通知服务器进行处理。
  • 好的,16 个客户端,正在写入 /dev/shm V.S.通过套接字发送。令我惊讶的是,socket 版本比 /dev/shm 版本慢了大约 10%(socket 为 120 分钟,/dev/shm 为 110 分钟)。另外需要注意的是,服务器处理输入数据会消耗大量 CPU 资源。
  • @avhacker 毫不奇怪 - 共享内存需要较少的复制操作,并且只需要发送者和接收者之间的基本同步。

标签: sockets ipc ramdisk


【解决方案1】:

套接字是最快的,因为在您完成发送数据之前,另一端可以开始处理数据(在单独的 cpu 内核上)。

假设您要发送 100KB 的数据,另一端可以在收到几 KB 后立即开始处理。而等100KB全部发送完毕,大概已经处理完90KB左右,所以只剩下10KB了。

使用 RAM 磁盘时,您必须写入整个 100KB,然后它才能开始处理数据。假设两端需要做大约相同数量的工作,使用套接字比使用 ram 磁盘快 10 倍左右。

也许将 100KB 写入 RAM 磁盘需要 1 毫秒,然后处理它需要 1 毫秒。使用套接字发送数据需要 1 毫秒,但在发送完所有数据后只需 0.1 毫秒即可完成处理。

发送的数据量越大,套接字的性能增益就越大。 10秒写入所有数据,再0.1毫秒完成所有数据发送完毕。

但是,RAM 磁盘更易于使用。套接字使用数据流,这在编写代码和调试/测试方面更耗时。

另外,不要假设您需要 ram 磁盘。根据操作系统的配置,将 100MB 写入旋转盘片硬盘驱动器可能只是将其写入 RAM 缓存,然后稍后将其放入硬盘驱动器。您可以立即从临时 RAM 缓存中读取它,而无需等待数据写入 HDD。在做出性能假设之前始终进行测试。不要假设 HDD 比 RAM 慢,因为它可能会默默地为您优化。

我正在输入此内容的 Mac,它是 UNIX,就像 CentOS,目前有大约 8GB 的​​ RAM 专用于保存它猜测我将在不久的将来某个时候阅读的文件的副本。我不必手动创建 RAM 磁盘,它只是将它们启发式地放入 RAM 中。 CentOS 做同样的事情,你必须对其进行测试,看看它实际上有多快。

但是套接字绝对是最快的选择,因为您不需要写入所有数据来开始处理它。

【讨论】:

  • 不一定,你也可以将共享内存分成块。如果您共享的内容之一是读写指针(当然受跨进程信号量保护),您甚至可以像套接字一样进行操作。
  • @paxdiablo 是真的。给猫剥皮的方法有很多。我假设“RAM Disk”是指在 RAM 中创建一个 ext 文件系统并挂载它,然后写入整个数据块并提供到另一个进程的路径,如果你不这样做,这是一种简单而有效的发送数据的方法'不想花时间学习更复杂的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-19
  • 2011-07-09
  • 2014-10-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多