问题标签 [zero-copy]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
6095 浏览

linux - 零拷贝 UDP 打包接收可能在 Linux 上吗?

我想将 UDP 数据包直接从以太网适配器复制到我的用户空间缓冲区

我的设置的一些细节:

我正在从一对千兆以太网摄像头接收数据。结合起来,我每秒接收 28800 个 UDP 数据包(每行 1 个数据包 * 30FPS * 2 个摄像头 * 480 行)。我无法切换到巨型帧,并且我已经在研究调整驱动程序级别的中断以降低 CPU 利用率。我在这里追求的是减少我复制这个 ~40MB/s 数据流的次数。

是我在这方面找到的最佳来源,但我希望有更完整的参考或证据证明这种方法在实践中行之有效。

0 投票
2 回答
2934 浏览

python - Python 是否支持零拷贝 I/O?

我有两个打开的文件对象,destsrc. 打开文件对象dest进行写入,将查找位置放置在文件内的某个偏移量处,并打开文件对象src进行读取。我需要做的只是从当前位置读取src到 EOF 并dest尽快将内容传输到。

如果我使用 Java 编程,我可以利用该FileChannel#transferTo()方法执行零拷贝文件 I/O。

Python 是否也支持零拷贝?

0 投票
2 回答
6432 浏览

linux - Linux 套接字:本地零拷贝、远程 TCP/IP

网络是我在操作系统中最糟糕的领域,所以请原谅我问了一个不完整的问题。我已经阅读了几个小时,但它有点在我脑海中游泳。(对我来说,与弄清楚网络协议相比,我觉得芯片设计很容易。)

我有一些通过套接字相互通信的网络服务。具体来说,套接字是使用创建的fd = socket(PF_INET, SOCK_STREAM, 0);,它会自动获取 TCP/IP。我需要这个作为基本情况,因为这些服务可能在不同的机器上运行。

但是对于一个项目,我们正试图将它们全部压缩到基于 Atom Z530P 的动力不足的嵌入式“设备”中,因此在我看来,内存复制开销是我们可以优化的东西。我一直在这里阅读:data-link-access-and-zero-copyLinux_packet_mmappacket_mmap

对于这种情况,可以创建类似这样的套接字:fd = socket(PF_PACKET, PF_RAW, 0);. 还有很多其他的事情要做,比如分配环形缓冲区、映射它们、将它们与套接字关联等等。看起来你被限制使用sendtorecvfrom传输数据。据我了解,由于套接字是本地的,因此您不需要可靠的“流”类型套接字,因此原始套接字是适当的接口,我环形缓冲区以页面粒度使用,其中每个数据包(或数据报)从页面边界开始。

在我花费大量时间尝试进一步调查之前,我希望一些有帮助的人可以帮助我解决一些问题:

  • 我应该期望从零拷贝套接字中获得多少性能优势?我想我最后一次检查时,我们将最多40 MB/秒的速度从一个进程移动到另一个进程,最后移动到磁盘。在最基本的场景中,数据从捕获进程移动到一对多进程(其他人可以在流上监听),再到写入磁盘的归档进程。那是两跳,不包括磁盘和内部的东西。
  • Linux 是否会自动执行这些操作,针对同一台机器上运行的进程进行优化?
  • 无论如何,我都会在 TCP 端口中有监听套接字。我可以使用它们在进程之间建立连接但仍然可以使用零拷贝吗?换句话说,我可以将 AF_INET 与 PF_PACKET 一起使用吗?
  • 带有 SOCK_RAW 的 PF_PACKET 是零拷贝套接字的唯一有效配置吗?
  • 是否有任何好的示例代码可以使用 TCP/IP 的零拷贝作为后备?
  • 检测两个进程是否在同一台机器上的最简单或最好的方法是什么?他们知道彼此的 IP 地址,所以我可以比较并为每个人使用不同的代码路径。有没有更简单的方法来做到这一点?
  • 我可以在基于数据包的套接字上使用 write() 和 read(),还是只对流有效?(重写如何建立连接会比重写所有套接字代码更简单。)
  • 我是否使事情过于复杂和/或优化了错误的事情?OProfiler 告诉我,大部分 CPU 时间都花在了两个地方:(1) zlib 和 (2) 内核,因为我使用的是不提供 vmlinux 的 CentOS 6.2,所以我无法对其进行分析。我假设内核时间是空闲时间和数据复制的组合,仅此而已。

在此先感谢您的帮助!

0 投票
2 回答
616 浏览

linux - Linux 零拷贝

我有一个需要从用户空间读写的 PCI 设备。我正在尝试使用零拷贝;有没有办法完全在用户空间内分配、固定和获取用户空间地址的物理地址,或者我是否需要一个内核模块,比如调用 virt_to_phys 或 get_user_pages?设备的内存通过 MMIO 映射到用户空间内存,因此我可以将任何需要的数据传递给它。谢谢。

0 投票
3 回答
6304 浏览

c - 具有和不具有 Scatter/Gather 操作的零拷贝

我刚刚读了一篇解释零拷贝机制的文章。

它讨论了有和没有 Scatter/Gather 支持的零拷贝之间的区别。

网卡不支持SG,数据副本如下

在此处输入图像描述

支持SG的网卡,数据副本如下

在此处输入图像描述

总之,支持 SG 的零拷贝可以消除一个 CPU 拷贝。

我的问题是为什么内核缓冲区中的数据会分散

0 投票
2 回答
957 浏览

multithreading - 套接字问题

有几个套接字问题,找不到明确的是或否,所以如果是转发,请提前道歉:) 平台是 Linux 2.6.30,C++ 应用程序。对网络还是很陌生,要跟上速度。

  1. 套接字 API 线程安全吗?例如,如果我在不使用互斥锁的情况下从多个线程进行发送,或者我必须通过使用自己的互斥锁来确保这一点?

  2. 轮询/选择以检查我的发送是否会阻塞然后进行发送,而不是仅进行发送并让发送 API 内部排队处理发送是否更好?如果线程无论如何都会阻塞(如果我不使用超时,也就是说),我真的不明白为什么需要轮询然后发送。

  3. Linux中默认情况下套接字是零副本,还是涉及副本?如果有副本,是否有大小限制(不是在 API 方面,而是在粒度方面)?如果答案是内核确实进行了复制,是否存在零复制套接字?

  4. 如果我必须在两台机器之间进行通信,我会假设多个套接字会比单个套接字更好地利用带宽。这是一个正确的假设吗?在两台常规 Linux 机器之间使用完整 BW 的最佳方式是什么?

5.你最喜欢测量接口当前带宽使用情况的工具是什么?这可能只是更多的偏好,我查看了 iptraf 等,但想看看其他人使用什么和最喜欢什么。

0 投票
2 回答
8126 浏览

java - 你如何在java中编写零拷贝?主要区别是什么

我正在阅读有关如何使用 java nio 库来利用称为“零复制”的 O/S 级别的文件传输/缓冲的信息。

那么您创建/写入文件的方式有什么区别?使用零拷贝有什么缺点吗?

0 投票
2 回答
6660 浏览

c++ - 如何在 C++ 中使用无锁循环缓冲区实现零拷贝 tcp

我有多个线程需要使用 TCP 流中的数据。我希望使用共享内存中的循环缓冲区/队列从 TCP 套接字读取。TCP 接收将直接写入循环队列。消费者将从队列中读取。

这种设计应该能够实现零拷贝和零锁定。但是这里有两个不同的问题。

  1. 从 TCP 套接字中仅读取 1 条逻辑消息是否可能/有效?如果没有,并且我阅读了超过 1 条消息,我将不得不将残差从 this 复制到 this->next。

  2. 真的可以实现无锁队列吗?我知道有原子操作,但这些也可能很昂贵。因为所有的 CPU 缓存都需要失效。这将影响我所有 24 个内核上的所有操作。

我对低级 TCP 有点生疏,并且不清楚如何判断消息何时完成。我是在寻找 \0 还是特定于实现?

0 投票
1 回答
1326 浏览

cuda - 我可以使用thrust::host_vector 还是必须使用cudaHostAlloc 进行Thrust 的零拷贝?

我想在映射内存上使用零拷贝cudaHostGetDevicePointer。我可以使用thrust::host_vector还是必须使用cudaHostAlloc(...,cudaHostAllocMapped)? 或者使用 Thrust 是否更容易?

0 投票
1 回答
115 浏览

performance - 向量参考缓冲区实现

我正在阅读来自 github 的其中一个项目的代码。我遇到了一个叫做向量引用缓冲区实现的东西。有人能遇到这个吗?这有什么实际应用。我做了一个快速的谷歌搜索,但找不到任何简单的示例实现。

一些见解会有所帮助。