问题标签 [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 投票
0 回答
709 浏览

c++ - 为什么 zmq_msg_init_data() 没有释放我分配的内存?

ZeroMQ 提供了一种零复制技术,尽可能避免网络复制数据。但是它似乎不起作用(用 ZeroMQ v4.1.5 测试过)。

这是服务器代码:

这是客户端代码:

在调用每个zmq_msg_init_data之后,应该调用释放器 CustomCleanupmy_free来释放分配的内存,但在我的情况下,这不会发生。为什么?

注意:在服务器示例中,我同时使用了 new/malloc 以及字符串和 void 指针来帮助查明潜在故障,但在这两种情况下都不起作用。

0 投票
2 回答
520 浏览

opencl - 如何使用 OpenCL 直接写入零拷贝的 linux framebuffer?

我正在使用 OpenCL 进行一些图像处理,并希望使用它将 RGBA 图像直接写入帧缓冲区。工作流程如下图所示:

1) 将帧缓冲区映射到用户空间。

2) 使用带有“CL_MEM_ALLOC_HOST_PTR”标志的 clCreateBuffer 创建 OpenCL 缓冲区

3) 使用 clEnqueueMapBuffer 将结果映射到帧缓冲区。

但是,它不起作用。屏幕上什么都没有。然后我发现来自帧缓冲区的映射虚拟地址与映射OpenCL的虚拟地址不同。有没有人将数据从 GPU 零拷贝移动到帧缓冲区?关于我应该使用什么方法有什么帮助吗?

一些关键代码:

0 投票
1 回答
2008 浏览

rust - 如何使用启用 Futures 的 Hyper Chunk 的 Serde 零拷贝反序列化存储结果?

我正在使用 futures、tokio、hyper 和 serde_json 来请求和反序列化一些我需要保留到下一个请求之前的数据。我最初的想法是制作一个结构,其中包含hyper::Chunk从 中借用的 和反序列化数据Chunk,但无法获得正确的生命周期。我尝试使用出租箱,但我也无法让它工作。也许我'buffer在声明缓冲区之前使用了生命周期Vec,但也许我搞砸了其他东西:

有什么方法可以使生命周期正确,还是我应该使用DeserializeOwned并放弃零拷贝?

对于更多上下文,以下代码有效(定期从两个 URL 反序列化 JSON,保留结果,以便我们可以对它们都做一些事情)。我想更改我的XY类型以Cow<'a, str>用于他们的字段,从更改DeserializeOwnedDeserialize<'a>. 为此,我需要存储每个已反序列化的切片,但我不知道该怎么做。我正在寻找使用 Serde 的零拷贝反序列化并保留结果的示例,或者一些重组我的代码的想法。

0 投票
0 回答
114 浏览

linux-device-driver - 是否可以重用sk_buff?

在每个接收到的以太网帧驱动程序分配新的 sk_buff 缓冲区,这是低效的。是否可以在初始化时分配一堆sk_buff,在高层停止使用后重用这些sk_buff?

0 投票
0 回答
290 浏览

linux - 将数据包复制到 TAP 设备时是否可以使用零复制?

最近,我正在阅读 linux 内核中的 vhost。我找到了一个pdf,上面写着 vhost 零拷贝数据到 TAP 设备。我试图追踪源代码,但没有发现零拷贝。将数据包复制到 TAP 设备时是否可以使用零复制?如何?

0 投票
2 回答
1814 浏览

c - 在内核 4.14 中发送带有“MSG_ZEROCOPY”标志和“SO_ZEROCOPY”选项的 buf 的行为比 non_zerocpy 差

我尝试了内核 4.14 的 zero_copy,以下是内核 4.14 中 zero_copy 的详细信息。

[1] ( https://netdevconf.org/2.1/papers/netdev.pdf )

我在作为缓存代理的 squid 中对其进行了测试。我的代码与上面的代码有些不同。我使用 epoll 来处理 zerocopy 并复制磁盘文件以发送给客户端。当套接字可写时,我使用如下函数

我也按如下方式处理 EPOLLERR 以释放分配的 buf。

但是我发现 fd 经常被 EPOLLERR 唤醒,所以我在每次 send 调用后调用 recvmsg ,否则 cpu 运行得非常高。然后我使用 curl 向具有请求缓存的 squid 代理发出请求。

但结果显示 non_zero_copy 代码更快。cpu热功能分布如下:

有没有人和我一样的测试?以及为什么我的测试与上面pdf中文章的结果不同。

0 投票
1 回答
128 浏览

encoding - Netty 4 HttpContentCompressor 文件区域

我正在尝试将文件发送到响应并支持编码。代码大部分是从 Netty github 中的示例之一复制而来的。

当服务器使用 SSL 时,一切正常。当不使用 SSL 时,正在完成零拷贝文件传输,并且编码不会产生正确的输出。

我已经准备好这篇博文,似乎表明我正在尝试做的事情可以工作,但是我不明白示例代码的哪一部分可能会导致它工作。任何提示或帮助将不胜感激。

谢谢!

0 投票
1 回答
632 浏览

sendfile - FileChannel.transferTo(据说是零拷贝)没有带来任何性能提升

我正在开发一个 REST API,它有一个端点来下载一个大小可能 > 2 GB 的文件。我已经读过,FileChannel.transferTo(...)如果操作系统支持,Java 将使用零拷贝。在我的 MacBook Pro OS 10.11.6 上开发期间,我的服务器在 localhost 上运行。

我比较了以下两种将文件写入响应流的方法:

  1. 将固定数量的字节从复制FileChannelWritableByteChannel使用transferTo
  2. 从字节数组(大小为 4096)中读取固定数量的字节FileInputStream并循环写入OutputStream

使用这两种方法,一个 5.2GB 文件所需的时间在 20 到 23 秒之间。我尝试transferTo将单个传输中的固定字节数设置为以下值:4KB(即 4 * 1024)、1MB 和 50MB。在所有 3 种情况下,写入时间都在相同的范围内。

所用时间是从进入 while 循环之前到退出 while 循环之后测量的,其中从文件中读取字节。这一切都在服务器端。网络跳跃时间不计算在内。

关于原因可能是什么的任何想法?我很确定 MacOS 10.11.6 应该支持零拷贝(即sendfile系统调用)。

编辑 (2018 年 6 月 18 日)

我发现了 2015 年的以下博客文章,说sendfile在 MacOS X 上已损坏。难道这个问题还存在?

https://blog.phusion.nl/2015/06/04/the-brokenness-of-the-sendfile-system-call/

0 投票
1 回答
938 浏览

c - 是否有一种可移植的方式来从类似套接字的文件描述符中丢弃许多可读字节?

是否有一种可移植的方式来丢弃来自套接字的大量传入字节而不将它们复制到用户空间?在常规文件上,我可以使用lseek(),但在套接字上,这是不可能的。我有两种情况可能需要它:

  1. 记录流到达文件描述符(可以是 TCP、SOCK_STREAM 类型的 UNIX 域套接字或可能是管道)。每条记录前面都有一个固定大小的标头,指定其类型和长度,然后是可变长度的数据。我想先读取标题,如果它不是我感兴趣的类型,我只想丢弃下面的数据段,而不将它们转移到用户空间到一个虚拟缓冲区中。

  2. 长度可变且不可预测的记录流到达文件描述符。由于异步性质,当 fd 变得可读时,记录可能仍然不完整,或者它们可能是完整的,但是当我尝试将固定数量的字节读入缓冲区时,下一条记录可能已经存在。我想在记录之间的确切边界处停止读取 fd,因此我不需要管理我不小心从 fd 读取的部分加载的记录。因此,我使用recv()withMSG_PEEK标志读入缓冲区,解析记录以确定其完整性和长度,然后再次正确读取(从而实际上从套接字中删除数据)到确切的长度。这会复制数据两次——我想通过简单地丢弃套接字中缓冲的数据来避免这种情况。

在 Linux 上,我认为可以通过使用splice()数据并将其重定向到/dev/null而不将它们复制到用户空间来实现这一点。但是,splice()它仅适用于 Linux,并且sendfile()在更多平台上支持的类似内容不能使用套接字作为输入。我的问题是:

  1. 有没有一种便携的方式来实现这一点?可以在其他 UNIX(主要是 Solaris)上工作的东西以及没有的东西splice()

  2. 是在splice()Linux/dev/null上使用一种有效的方法来执行此操作,还是会浪费精力?

理想情况下,我希望有一个简单地从内核中的文件描述符fdssize_t discard(int fd, size_t count)中删除可读字节(即不向用户空间复制任何内容),阻塞可阻塞 fd 直到丢弃请求的字节数,或返回成功的字节数就像在非阻塞 fd 上丢弃的字节或 EAGAIN 一样。并在常规文件上推进查找位置:)read()

0 投票
1 回答
151 浏览

c++ - 特征稀疏矩阵的零拷贝构造

我有以下问题:

我有一个Eigen::SparseMatrix我需要通过网络发送,而我的网络库只支持发送原始类型的数组。

我可以通过执行以下操作来检索指向我的 SparseMatrix 的支持数组的指针(这是支持对象的代码):

现在在另一边,我可以访问这两个数组。但是 AFAIK 如果不将所有数据复制到新的 SparseMatrix 中,就无法创建 SparseArray(请参阅文档以了解构造)。

我想做类似的事情:

但这会引发编译器错误:

关于我们如何从现有的索引和数据数组进行零复制构造稀疏特征矩阵的任何想法?

我尝试过的另一种方法不起作用(这是本地的,没有通信):

当我尝试打印出来时,zero_copy_matrix它没有任何值。