既然零拷贝直接内存这么快,这么好为啥不都用?

2020-05-25 09:21:53 +08:00
 aiqier

零拷贝省去了从内核缓冲区到进程缓冲区的时间,这么好的优化没有在任何地方使用,我猜测一定有什么弊端才会导致不会所有读写都使用零拷贝,但是究竟是啥弊端,个人只想到是内核缓冲区和进程缓冲区没有分开,不方便管理。

8989 次点击
所在节点    程序员
46 条回复
xxzs
2020-05-25 10:50:33 +08:00
D 这个问题就类似于 DPDK 性能好,为什么大部分人不用,还是继续用 kernel 提供的 socket? 本质上就是兼容移植通用代码的额外负担。PS4 这些机器性能 PC 但游戏性能比 PC 强也是如此
feather12315
2020-05-25 11:00:51 +08:00
DMA 提供在外设和存储器之间或者存储器和存储器之间的高速数据传输,无法在 A 内存地址的数据拷贝至 B 内存地址时候用吧?

是这样的话:CPU 总耗时会降低,但是内核执行( sys )时间会增加,服务器多数为非抢占式调度,此情况下拷贝数据过多不就产生假死了吗?
ShadowStar
2020-05-25 11:03:20 +08:00
@yulitian888 和内存共享上锁没有必然关联。
零拷贝,本质上是硬件可以直接写内存( DMA );而不需要内核从硬件读取、再写入内存。
当硬件直接将数据写入内存后,可以通过直接映射物理内存到用户空间的方式,来绕过内核。

楼主所说的“不都用”的问题,我觉得主要原因是早期的硬件,以及目前的部分硬件不支持这种 DMA 操作。
scnace
2020-05-25 11:21:09 +08:00
用 unsafe 的操作,就要自己做好 unsafe 的准备
fihserman123
2020-05-25 11:32:16 +08:00
Java 和 JVM 的意义是什么?封装 C++/C 对底层的操作,让程序员专心于业务逻辑。直接内存已经是反 JVM 设计思想了。对 JVM 来说直接内存并没有什么特别的,从 JDK1.0 就有了。 直接内存只是 JDK1.4 JVM 给程序员开的一个口子。不要总以为直接内存好,JVM 的 GC 管理它不香吗?
fihserman123
2020-05-25 11:33:02 +08:00
啊 我好像看错题了.....
fihserman123
2020-05-25 11:35:53 +08:00
楼主说的关乎于权限问题。如果一般应用都能直接读取内核区,那操作系统如何确保应用程序的安全性?
dartabe
2020-05-25 11:39:38 +08:00
@feather12315 dma 可以的 总线地址都能访问

dma 的问题是适合大批量 连续的地址的数据 不然如果分成各种小段的话还是需要 cpu 下不同的指令
emeab
2020-05-25 11:40:18 +08:00
性能 !== 绝对
feather12315
2020-05-25 11:47:15 +08:00
@feather12315 #22

我找了下资料,标准的 x86 不支持内存与内存之间的 DMA 拷贝 ( ARM 支持),但也有 IOAT DMA 这种方式支持。
DMA 无法使用 CPU cache,存在一致性问题。

如果仅仅想“把文件 A 的内容拷贝到文件 B”那里,我记得看过一篇文章,有开发者提议合并 open()、read()、wirte()、close()四个系统调用,因为系统调用耗时也高。

Reference:
1. https://www.zhihu.com/question/266921250
2. https://biscuitos.github.io/blog/DMA/
lewis89
2020-05-25 11:47:54 +08:00
@fihserman123 #27 Netty 的直接内存区域泄漏 估计搞得很多 Javaer 神经质了..
fihserman123
2020-05-25 12:01:27 +08:00
@lewis89 <<<<<<QAQ<<<<<<<<
ljzxloaf
2020-05-25 12:07:54 +08:00
不好同步吧,共享读,副本写
zhuangzhuang1988
2020-05-25 12:20:01 +08:00
为何 c++性能这么高, 为何重视性能的后端还都用 java.
bitdepth
2020-05-25 12:58:07 +08:00
1. 小尺寸無優勢,這邊有一份郵件表明 512KiB 下無意義,很多變數都是如此,甚至 Copy on write 的開銷都太高了
2. 設備相容和資料對齊問題(多數可解決)
3. CPU cache 和 MMU 建表開銷很大,反正都是要過 CPU 不如一開始就用 CPU (場景決定)

大致考量如此
mogami18
2020-05-25 13:48:31 +08:00
这么好的优化没有在任何地方使用
回楼主,我是搞 RDMA 相关 research 的,TensorFlow 大规模集群 training 的时候,如果后台指定了 RDMA 通信,Tensor 们的传输就是 zero-copy 了。相关实现请看 https://github.com/tensorflow/networking/tree/master/tensorflow_networking/verbs,用 ibverbs 做的
ivechan
2020-05-25 13:51:37 +08:00
@ShadowStar 说的没错。其实现在 类 DMA 也挺常见的了。
比如 RDMA 在各种云计算厂商底层里会作为一个优化手段使用,
阿里云去年还发表了一篇 X-RDMA 的文章,也有相关的 talk 。
不过,底层领域大多数人不关心,所以不了解也挺正常。
mogami18
2020-05-25 13:56:20 +08:00
@ivechan 基本上系统顶会 osdi, sosp, nsdi 什么的,从 15 年就 RDMA 就开始流行了。Datacenter RPCs can be General and Fast, NSDI'19 。这篇 paper 讲了很多基于可 DMA 的网卡优化 Datacenter 中 RDMA 连接池性能等问题
chinuno
2020-05-25 14:01:09 +08:00
我觉得最大的问题是限制了应用场景吧。如果你只是需要读文件直接通过网络传输,那用零拷贝是最好的。
但是业务场景往往都是需要应用对数据进行处理才把数据送出去,比如数据先加密再进行传输。而做这步操作必然需要把数据从拷贝到用户态缓冲区来处理,所以无法利用上零拷贝的优势
RubyJack
2020-05-25 15:06:43 +08:00
大部分场景 瓶颈不在这里的拷贝

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/675081

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX