原文地址:http://www.vpsee.com/2009/07/linux-sendfile-improve-performance/
现在流行的 web 服务器里面都提供 sendfile 选项用来提高服务器性能,那到底 sendfile 是什么,怎么影响性能的呢?sendfile 实际上是 Linux 2.0+ 以后的推出的一个系统调用,web 服务器可以通过调整自身的配置来决定是否利用 sendfile 这个系统调用。先来看一下不用 sendfile 的传统网络传输过程:
read(file, tmp_buf, len);
write(socket, tmp_buf, len);硬盘 >> kernel buffer >> user buffer >> kernel socket buffer >> 协议栈
一般来说一个网络应用是通过读硬盘数据,然后写数据到 socket 来完成网络传输的。上面2行用代码解释了这一点,不过上面2行简单的代码掩盖了底层的很多操作。来看看底层是怎么执行上面2行代码的:
1、系统调用 read() 产生一个上下文切换:从 user mode 切换到 kernel mode,然后 DMA 执行拷贝,把文件数据从硬盘读到一个 kernel buffer 里。
2、数据从 kernel buffer 拷贝到 user buffer,然后系统调用 read() 返回,这时又产生一个上下文切换:从kernel mode 切换到 user mode。
3、系统调用 write() 产生一个上下文切换:从 user mode 切换到 kernel mode,然后把步骤2读到 user buffer 的数据拷贝到 kernel buffer(数据第2次拷贝到 kernel buffer),不过这次是个不同的 kernel buffer,这个 buffer 和 socket 相关联。
4、系统调用 write() 返回,产生一个上下文切换:从 kernel mode 切换到 user mode(第4次切换了),然后 DMA 从 kernel buffer 拷贝数据到协议栈(第4次拷贝了)。
上面4个步骤有4次上下文切换,有4次拷贝,我们发现如果能减少切换次数和拷贝次数将会有效提升性能。在kernel 2.0+ 版本中,系统调用 sendfile() 就是用来简化上面步骤提升性能的。sendfile() 不但能减少切换次数而且还能减少拷贝次数。
再来看一下用 sendfile() 来进行网络传输的过程:
sendfile(socket, file, len);
硬盘 >> kernel buffer (快速拷贝到kernel socket buffer) >> 协议栈
1、系统调用 sendfile() 通过 DMA 把硬盘数据拷贝到 kernel buffer,然后数据被 kernel 直接拷贝到另外一个与 socket 相关的 kernel buffer。这里没有 user mode 和 kernel mode 之间的切换,在 kernel 中直接完成了从一个 buffer 到另一个 buffer 的拷贝。
2、DMA 把数据从 kernel buffer 直接拷贝给协议栈,没有切换,也不需要数据从 user mode 拷贝到 kernel mode,因为数据就在 kernel 里。
步骤减少了,切换减少了,拷贝减少了,自然性能就提升了。这就是为什么说在 Nginx 配置文件里打开 sendfile on 选项能提高 web serve r性能的原因。(参见:64MB VPS 上优化Nginx)
性能测试参考文章地址:
http://blog.csdn.net/crazyguang/archive/2008/05/09/2423708.aspx
相关推荐
简单的TCP传输程序,对初级入门的学习者应该是很好的范例教材来的
linux专门为文件传输开放的API sendfile 比你自己写的文件传输程序速度快得多
sendfile 示例代码,理解sendfile的好参考
QT5_sendfile.rar
很多时候用户需要从网站下载文件,如果文件是可以通过一个固定链接公开获取的,那么我们只需将文件存放到 webroot下的目录里就好。但大多数情况下,我们需要做权限控制,例如下载 PDF 账单,又例如下载网盘里的档案...
简单明了地告诉你,如何用java写FTP客户端程序
主要介绍了asp.net使用Socket.Send发送信息及Socket.SendFile传输文件的方法,结合实例形式分析了asp.net基于socket实现信息与文件传输的相关技巧,需要的朋友可以参考下
用Netty实现的Spring-boot-protocol将springboot的WebServer更改为NettyTcpServer,为用户扩展了网络编程的能力。...sendFile, mmap. 示例:com.github.netty.http.example.HttpZeroCopyController.java4.HttpServlet
应用于电力负控,广西通讯规约的远程升级,断点续传 本文件只适用于学习讨论!禁止用于商业!
学长写的;很棒的tcp学习软件代码;希望对大家能有所帮助
send_file Introduce一个使用 NIO + selector + send file 技术的 server + client ,专门用于服务器之间搬运文件。quick start打开 example module src 目录.运行 example.ServerDemo运行 example.ClientDemo注意: ...
主要介绍了在PHP中让文件下载更快的一个方法,那就是使用X-SendFile头实现,主流量的服务器都支持这个头文件,的朋友可以参考下
个人花大量时间整理出的实战资料,内容丰富,文档也很详细。无论做毕业设计还是用于学习技能,或工作中当做参考资料,都能发挥重要作用 亲们下载我任何一个付费资源后,即可私信联系我免费下载其他相关资源哦~ ...
通过java语言实现文件在网络上的传输,程序较为简单,供参考
python 实现文件传输 课程设计 file_transfer 包括 计算机网络课程设计 Receive File Send File Tests Test Send File 接收文件 发送文件 测试 测试发送文件
用VB写的一个串口文件传送系统,实现了串口之间文件传送的例子。很有参考价值。
对文件夹及文件的操作如FileOutputStream And DataInputStream and Socket and ServerSocket 应用!
局域网内传输文件的实例,基于点对点上传文件原理实现