【发布时间】:2012-08-27 03:43:39
【问题描述】:
在我正在开发的应用程序中,我在 Linux 上使用 splice 进行套接字到套接字的数据传输。
- 其他操作系统(至少是 Windows、OS X 和 FreeBSD)是否实现
splice或等效解决方案? - 是否可以在 Windows 上使用
sendfile¹ +memmap¹ 模拟套接字到套接字的数据spliceing?
¹ 两者都以不同的名称存在于 Windows 上,我不记得了。
更新
您可以看到splice 与 Linux 上的用户空间缓冲区相比的性能改进。
-
DF,DR,F,MF,MR是我在不同隧道模式下的应用程序,NX是 NGINX Web 服务器 -
-p+t使用 Linux 系统调用splice -
+p-t使用带有用户空间缓冲区的可移植实现 -
+p+t使用带有用户空间缓冲区和多个操作系统线程的可移植实现 - 条形代表每秒千兆字节秒的吞吐量
- 一个 1 GB(1048576000 字节)的文件被 4 个并发客户端请求了 4 次
【问题讨论】:
-
对此我有一些想法。但在我回答之前,让我问一下,“你真正想做什么?”您是否试图将数据流或数据包从一个套接字回显到另一个套接字?发送前是否需要检查数据?
-
仅回声回声。我正在开发一个名为PortFusion 的简单隧道解决方案,它不需要检查数据流(但如果需要,我可以切换到将数据带到用户空间的便携式实现)。
-
@selbie 我刚刚添加了一个图表来说明为什么我对其他操作系统中的
splice-equivalents 感兴趣。
标签: sockets operating-system implementation system-calls splice