Linux:从 NAS 读取文件并通过套接字发送的最有效方法是什么
我想编写一个从 NAS 读取文件并将其发送出去的服务器 一个插座。最快的方法是什么?
谢谢!
I would like to write a server that reads in a file from a NAS and sends it out over
a socket. What is the fastest way of doing this?
Thanks!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我认为标准 CIFS 在文件上安装支持
mmap(2)
(如果我没读错的话,direct
模式 必须关闭)。如果是这样,最快的选择可能是照常
open(2)
文件,并使用sendfile(2)
通过 UDP 套接字发送文件数据。 (sendfile(2)
要求文件可映射,这并不总是能保证,但内核中的 CIFS 客户端代码 (fs/cifs/file.c:cifs_file_strict_mmap()) 似乎支持
mmap(2)
。)Pat Patterson 报告说,使用以下命令可实现 8% 的加速
sendfile(2)
与write(2)
。但如果它有效,它会帮你省去自己处理 AIO 操作的麻烦——内核将负责从文件中请求内存页面,在套接字缓冲区允许时通过套接字发送它们,并希望允许你的应用程序代码简短而甜蜜。I think standard CIFS mounts support
mmap(2)
on the files (if I read correctly,direct
mode must be off).If so, your fastest option is probably to
open(2)
files as normal, and usesendfile(2)
to send the file data over your UDP sockets. (sendfile(2)
requires the file to mappable, which isn't always guaranteed, but the CIFS client code in the kernel (fs/cifs/file.c:cifs_file_strict_mmap()
) appears to supportmmap(2)
.)Pat Patterson reports an 8% speedup with
sendfile(2)
vswrite(2)
. But if it works, it'd save you the hassle of handling AIO operations yourself -- the kernel would be in charge of requesting memory pages from the file, sending them over the socket when the socket buffers allow, and hopefully allow your application code to be short and sweet.假设双方的网络接口都是 1Gbit 以太网或更慢,则可以执行任何您喜欢的操作。您的机器将能够填满它们。
Assuming your network interfaces on both sides are 1Gbit ethernet or slower, just do anything you like. Your machine will be able to fill them up.