【问题标题】:Linux: what is the most efficient way of reading a file from a NAS and sending over a socketLinux:从 NAS 读取文件并通过套接字发送的最有效方法是什么
【发布时间】:2011-05-15 00:54:51
【问题描述】:

我想编写一个从 NAS 读取文件并将其发送出去的服务器 一个插座。最快的方法是什么?

谢谢!

【问题讨论】:

  • 需要更多详细信息。 :) 您一次只为一个文件执行此操作吗?或者你的服务器应该是c10k-ready?您可以使用nginx 或Apache httpd 并完成它吗? 也许一个简单的标准 while(1) { select() ...} 循环可以工作,但是如果 NAS 负载过重或网络中断,则 NAS 上的 read(2) 调用可能会阻塞 - 在这种情况下,可能是 aio.h(7posix) ( aio_read(3)) 例程会是更好的选择。不确定哪些 NAS 文件系统支持 AIO(如果有)。更多细节! :D
  • 谢谢,萨诺德。我需要一个自定义服务器来通过 UDP 套接字提供 jpeg2000 压缩文件。它需要扩展。 AIO 听起来是个好主意。我可能需要使用 CIFS 来访问 NAS。

标签: linux performance sockets nas


【解决方案1】:

认为标准 CIFS 挂载支持文件上的mmap(2)(如果我没看错,direct mode 必须关闭)。

如果是这样,您最快的选择可能是照常发送open(2) 文件,并使用sendfile(2) 通过您的UDP 套接字发送文件数据。 (sendfile(2) 要求文件可映射,这并不总是得到保证,但内核中的 CIFS 客户端代码 (fs/cifs/file.c:cifs_file_strict_mmap()) 似乎支持mmap(2)。)

Pat Patterson reports an 8% speedup with sendfile(2) vs write(2)。但如果它有效,它将为您省去自己处理 AIO 操作的麻烦——内核将负责从文件中请求内存页面,在套接字缓冲区允许时通过套接字发送它们,并希望允许您的应用程序代码又短又甜。

【讨论】:

  • 太棒了!谢谢,萨诺德。我喜欢这种方法,有点痴迷于性能。
【解决方案2】:

假设两边的网络接口都是 1Gbit 以太网或更慢,你可以做任何你喜欢的事情。您的机器将能够填满它们。

【讨论】:

  • 谢谢,马克R。快速,我的意思是需要最少的 CPU,而不是网络吞吐量。所以,在这种情况下,sendfile 会更好。
  • “快速”是指需要最少的开发时间来生成正确的实现。根据摩尔定律,如果你再等两个月,同样价格的硬件无论如何都会快 8%。这 8% 的性能(由@sarnold 引用)对您来说是否重要到可以牺牲正确的实现(不使用 sendfile 等)?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-25
  • 2011-07-28
  • 2012-05-11
  • 2023-03-02
  • 2014-12-17
  • 2014-01-12
相关资源
最近更新 更多