在apache,nginx,lighttpd等web服务器当中,都有一项sendfile相关的配置,在一些网上的资料都有谈到sendfile会提升文件传输性能,那sendfile到底是什么呢?它的原理又是如何呢? 在传统的文件传输里面(read/write方式),在实现上其实是比较复杂的,需要经过多次上下文的切换,我们看一下如下两行代码:

read(file, tmp_buf, len);

write(socket, tmp_buf, len);

以上两行代码是传统的read/write方式进行文件到socket的传输。

当需要对一个文件进行传输的时候,其具体流程细节如下:

1、调用read函数,文件数据被copy到内核缓冲区

2、read函数返回,文件数据从内核缓冲区copy到用户缓冲区

3、write函数调用,将文件数据从用户缓冲区copy到内核与socket相关的缓冲区。

4、数据从socket缓冲区copy到相关协议引擎。

以上细节是传统read/write方式进行网络文件传输的方式,我们可以看到,在这个过程当中,文件数据实际上是经过了四次copy操作:

硬盘—>内核buf—>用户buf—>socket相关缓冲区—>协议引擎

而sendfile系统调用则提供了一种减少以上多次copy,提升文件传输性能的方法。Sendfile系统调用是在2.1版本内核时引进的:

sendfile(socket, file, len);

运行流程如下:

1、sendfile系统调用,文件数据被copy至内核缓冲区

2、再从内核缓冲区copy至内核中socket相关的缓冲区

3、最后再socket相关的缓冲区copy到协议引擎

相较传统read/write方式,2.1版本内核引进的sendfile已经减少了内核缓冲区到user缓冲区,再由user缓冲区到socket相关 缓冲区的文件copy,而在内核版本2.4之后,文件描述符结果被改变,sendfile实现了更简单的方式,系统调用方式仍然一样,细节与2.1版本的 不同之处在于,当文件数据被复制到内核缓冲区时,不再将所有数据copy到socket相关的缓冲区,而是仅仅将记录数据位置和长度相关的数据保存到 socket相关的缓存,而实际数据将由DMA模块直接发送到协议引擎,再次减少了一次copy操作。

sendfile实现文件服务器,sendfile相关推荐

  1. Linux网络编程 | 零拷贝 :sendfile、mmap、splice、tee

    文章目录 传统文件传输的问题 Linux中实现零拷贝的方法 传统文件传输的问题 在网络编程中,如果我们想要提供文件传输的功能,最简单的方法就是用read将数据从磁盘上的文件中读取出来,再将其用writ ...

  2. Linux Sendfile的优势

    Sendfile函数在两个文件描写叙述符之间直接传递数据(全然在内核中操作,传送),从而避免了内核缓冲区数据和用户缓冲区数据之间的拷贝,操作效率非常高,被称之为零拷贝. Sendfile函数的定义例如 ...

  3. linux 高级IO函数之sendfile splice tee

    sendfile函数在两个文件描述符之间传递数据(完全在内核中操作),从而避免内核缓冲区和用户缓冲区之间的数据拷贝,效率很高,这被称为零拷贝.函数的定义如下: #include<sys/send ...

  4. Linux网络编程--sendfile零拷贝高效率发送文件

    本博文介绍使用sendfile函数进行零拷贝发送文件,实现高效数据传输,并对其进行验证. 那么什么是sendfile呢? linux系统使用man sendfile,查看sendfile原型如下: # ...

  5. Linux的高效传输函数sendfile

    参考手册:http://man7.org/linux/man-pages/man2/sendfile.2.html 函数原型: #include <sys/sendfile.h> ssiz ...

  6. sendfile()对nginx性能的提升

    Linux kernel 2.2之前,(如图)读写数据基本都是使用read系统调用和write系调用,以nginx来说如果一个请求建立,从磁盘的文件到网络连接之间会通过硬件(DMA)---内核层--- ...

  7. sendfile相关

    考虑将一个本地文件通过socket发送出去的问题.我们通常的做法是:打开文件fd和一个socket,然后循环地从文件fd中read数据,并将读取的数据send到socket中.这样,每次读写我们都需要 ...

  8. Socket网络编程中的sendfile传送文件

    前言 文件传送是聊天室的最后一个功能了,这篇博客依然建立在聊天室的项目背景之上. 在我们可以使用Socket套接字在两个客户端进行通信的基础上,传送文件的难点在于如何接收以及文件的离线发送. 文件发送 ...

  9. sendfile | 传说中的零拷贝(主要用于网络中文件传输)

    sendfile函数 sendfile函数简介 sendfile简单小例子 用sendfile函数简单模拟文件下载 sendfile函数简介 sendfile函数:sendfile函数是在两个文件描述 ...

最新文章

  1. pandas基于条件判断更新dataframe中特定数据列数值内容的值(Conditionally updating values in specific pandas Dataframe )
  2. Spring Boot Bean的使用,@Repository,@Service,@Controller,@Component
  3. 【PAT乙级】1048 数字加密 (20 分)
  4. SQL Server 使用OPENROWSET访问ORACLE遇到的各种坑总结
  5. Firefox 5 公开测试下载
  6. php 废弃,PHP 7 废弃特性
  7. 借攻防演习提升企业安全能力
  8. 几种软件滤波算法的原理和比较(带源码)
  9. Mybatis与Spring整合示例
  10. matplotlib制作多张图
  11. Mybatis 控制台打出Sql-Log的设置
  12. nginx的配置总结
  13. 非参数统计的Python实现——随机游程检验
  14. 为了方便在微博上看小黄图,我写了一段JS
  15. handlersocket原理和性能测试
  16. 原生js实现动态生成表格
  17. JAVA中对集合排序
  18. 微信小游戏马甲包过审策略
  19. 202102-一个小屁民的若有所思
  20. 数据库第九章习题作业

热门文章

  1. DataTable的Merge方法和添加datatable到dataset
  2. html 内嵌xml数据库,是否可以在SQLite数据库中存储XML/HTML文件?
  3. CCF201409-2 画图
  4. 深度优先搜索——单词接龙(洛谷 P1019)
  5. CS229——NODE1part1
  6. 链家大数据多维分析引擎实践
  7. 带你了解极具弹性的Spark架构的原理
  8. 鸿蒙轻内核源码分析:虚拟内存
  9. 让数据库无惧灾难,华为云GaussDB同城双集群高可用方案正式发布!
  10. 【华为云技术分享】云图说 | 容器交付流水线ContainerOps,助力企业容器化转型