问题标签 [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.
linux - 零拷贝 UDP 打包接收可能在 Linux 上吗?
我想将 UDP 数据包直接从以太网适配器复制到我的用户空间缓冲区
我的设置的一些细节:
我正在从一对千兆以太网摄像头接收数据。结合起来,我每秒接收 28800 个 UDP 数据包(每行 1 个数据包 * 30FPS * 2 个摄像头 * 480 行)。我无法切换到巨型帧,并且我已经在研究调整驱动程序级别的中断以降低 CPU 利用率。我在这里追求的是减少我复制这个 ~40MB/s 数据流的次数。
这是我在这方面找到的最佳来源,但我希望有更完整的参考或证据证明这种方法在实践中行之有效。
python - Python 是否支持零拷贝 I/O?
我有两个打开的文件对象,dest
和src
. 打开文件对象dest
进行写入,将查找位置放置在文件内的某个偏移量处,并打开文件对象src
进行读取。我需要做的只是从当前位置读取src
到 EOF 并dest
尽快将内容传输到。
如果我使用 Java 编程,我可以利用该FileChannel#transferTo()
方法执行零拷贝文件 I/O。
Python 是否也支持零拷贝?
linux - Linux 套接字:本地零拷贝、远程 TCP/IP
网络是我在操作系统中最糟糕的领域,所以请原谅我问了一个不完整的问题。我已经阅读了几个小时,但它有点在我脑海中游泳。(对我来说,与弄清楚网络协议相比,我觉得芯片设计很容易。)
我有一些通过套接字相互通信的网络服务。具体来说,套接字是使用创建的fd = socket(PF_INET, SOCK_STREAM, 0);
,它会自动获取 TCP/IP。我需要这个作为基本情况,因为这些服务可能在不同的机器上运行。
但是对于一个项目,我们正试图将它们全部压缩到基于 Atom Z530P 的动力不足的嵌入式“设备”中,因此在我看来,内存复制开销是我们可以优化的东西。我一直在这里阅读:data-link-access-and-zero-copy和Linux_packet_mmap和packet_mmap。
对于这种情况,可以创建类似这样的套接字:fd = socket(PF_PACKET, PF_RAW, 0);
. 还有很多其他的事情要做,比如分配环形缓冲区、映射它们、将它们与套接字关联等等。看起来你被限制使用sendto
和recvfrom
传输数据。据我了解,由于套接字是本地的,因此您不需要可靠的“流”类型套接字,因此原始套接字是适当的接口,我猜环形缓冲区以页面粒度使用,其中每个数据包(或数据报)从页面边界开始。
在我花费大量时间尝试进一步调查之前,我希望一些有帮助的人可以帮助我解决一些问题:
- 我应该期望从零拷贝套接字中获得多少性能优势?我想我最后一次检查时,我们将最多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,所以我无法对其进行分析。我假设内核时间是空闲时间和数据复制的组合,仅此而已。
在此先感谢您的帮助!
linux - Linux 零拷贝
我有一个需要从用户空间读写的 PCI 设备。我正在尝试使用零拷贝;有没有办法完全在用户空间内分配、固定和获取用户空间地址的物理地址,或者我是否需要一个内核模块,比如调用 virt_to_phys 或 get_user_pages?设备的内存通过 MMIO 映射到用户空间内存,因此我可以将任何需要的数据传递给它。谢谢。
c - 具有和不具有 Scatter/Gather 操作的零拷贝
我刚刚读了一篇解释零拷贝机制的文章。
它讨论了有和没有 Scatter/Gather 支持的零拷贝之间的区别。
网卡不支持SG,数据副本如下
支持SG的网卡,数据副本如下
总之,支持 SG 的零拷贝可以消除一个 CPU 拷贝。
我的问题是为什么内核缓冲区中的数据会分散?
multithreading - 套接字问题
有几个套接字问题,找不到明确的是或否,所以如果是转发,请提前道歉:) 平台是 Linux 2.6.30,C++ 应用程序。对网络还是很陌生,要跟上速度。
套接字 API 线程安全吗?例如,如果我在不使用互斥锁的情况下从多个线程进行发送,或者我必须通过使用自己的互斥锁来确保这一点?
轮询/选择以检查我的发送是否会阻塞然后进行发送,而不是仅进行发送并让发送 API 内部排队处理发送是否更好?如果线程无论如何都会阻塞(如果我不使用超时,也就是说),我真的不明白为什么需要轮询然后发送。
Linux中默认情况下套接字是零副本,还是涉及副本?如果有副本,是否有大小限制(不是在 API 方面,而是在粒度方面)?如果答案是内核确实进行了复制,是否存在零复制套接字?
如果我必须在两台机器之间进行通信,我会假设多个套接字会比单个套接字更好地利用带宽。这是一个正确的假设吗?在两台常规 Linux 机器之间使用完整 BW 的最佳方式是什么?
5.你最喜欢测量接口当前带宽使用情况的工具是什么?这可能只是更多的偏好,我查看了 iptraf 等,但想看看其他人使用什么和最喜欢什么。
java - 你如何在java中编写零拷贝?主要区别是什么
我正在阅读有关如何使用 java nio 库来利用称为“零复制”的 O/S 级别的文件传输/缓冲的信息。
那么您创建/写入文件的方式有什么区别?使用零拷贝有什么缺点吗?
c++ - 如何在 C++ 中使用无锁循环缓冲区实现零拷贝 tcp
我有多个线程需要使用 TCP 流中的数据。我希望使用共享内存中的循环缓冲区/队列从 TCP 套接字读取。TCP 接收将直接写入循环队列。消费者将从队列中读取。
这种设计应该能够实现零拷贝和零锁定。但是这里有两个不同的问题。
从 TCP 套接字中仅读取 1 条逻辑消息是否可能/有效?如果没有,并且我阅读了超过 1 条消息,我将不得不将残差从 this 复制到 this->next。
真的可以实现无锁队列吗?我知道有原子操作,但这些也可能很昂贵。因为所有的 CPU 缓存都需要失效。这将影响我所有 24 个内核上的所有操作。
我对低级 TCP 有点生疏,并且不清楚如何判断消息何时完成。我是在寻找 \0 还是特定于实现?
泰
cuda - 我可以使用thrust::host_vector 还是必须使用cudaHostAlloc 进行Thrust 的零拷贝?
我想在映射内存上使用零拷贝cudaHostGetDevicePointer
。我可以使用thrust::host_vector
还是必须使用cudaHostAlloc(...,cudaHostAllocMapped)?
或者使用 Thrust 是否更容易?
performance - 向量参考缓冲区实现
我正在阅读来自 github 的其中一个项目的代码。我遇到了一个叫做向量引用缓冲区实现的东西。有人能遇到这个吗?这有什么实际应用。我做了一个快速的谷歌搜索,但找不到任何简单的示例实现。
一些见解会有所帮助。