Nginx sendfile原理详解[通俗易懂]

Nginx sendfile原理详解[通俗易懂]配置语法语法:sendfileon|off;默认值:sendfileoff;上下文:http,server,location,ifinlocation说明sendfile值为on,指定使用sendfile系统调用来传输文件。sendfile系统调用在两个文件描述符之间直接传递数据(完全在内核中操作),从而避免了数据在内核缓冲区和用户缓冲区之间的拷贝,操作效率很高,被…

大家好,又见面了,我是你们的朋友全栈君。

配置语法

语法: sendfile on | off;
默认值: sendfile off;
上下文: http,server,location,if in location

说明

sendfile值为on,指定使用sendfile系统调用来传输文件。

sendfile系统调用在两个文件描述符之间直接传递数据(完全在内核中操作),从而避免了数据在内核缓冲区和用户缓冲区之间的拷贝,操作效率很高,被称之为零拷贝。

示例

http {
    # ...
    sendfile    on;
    # ...
}

原理

read/write

在传统的文件传输方式(read、write/send方式),具体流程细节如下:

  1. 调用read函数,文件数据拷贝到内核缓冲区
  2. read函数返回,数据从内核缓冲区拷贝到用户缓冲区
  3. 调用write/send函数,将数据从用户缓冲区拷贝到内核socket缓冲区
  4. 数据从内核socket缓冲区拷贝到协议引擎中

在这个过程当中,文件数据实际上是经过了四次拷贝操作:
硬盘—>内核缓冲区—>用户缓冲区—>内核socket缓冲区—>协议引擎
在这里插入图片描述

sendfile

sendfile系统调用则提供了一种减少拷贝次数,提升文件传输性能的方法。

  1. sendfile系统调用利用DMA(直接存储器访问:外部设备不通过CPU而直接与系统内存交换数据的接口技术)将数据拷贝到内核缓冲区,之后数据被拷贝到与socket相关的内核缓冲区。这里没有 用户态和核心态 之间的切换,在内核中直接完成了从一个 buffer 到另一个 buffer 的拷贝
  2. DMA擎将数据从内核socket缓冲区拷贝到协议引擎中

这里没有用户态和内核态之间的切换,也没有内核缓冲区和用户缓冲区之间的拷贝,大大提升了传输性能。
这个过程数据经历的拷贝操作如下:
硬盘—>内核缓冲区—>内核socket缓冲区—>协议引擎
在这里插入图片描述

带有DMA收集拷贝功能的sendfile

对于带有DMA收集拷贝功能的sendfile系统调用,还可以再减少一次内核缓冲区之间的拷贝。具体流程如下:

  1. dfile系统调用利用DMA引擎将文件数据拷贝到内核缓冲区,之后,将带有文件位置和长度信息的缓冲区描述符添加到内核socket缓冲区中
  2. 引擎会将数据直接从内核缓冲区拷贝到协议引擎中

这个过程数据经历的拷贝操作如下:
硬盘—>内核缓冲区—>协议引擎

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/145942.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • python+pycharm安装(pycharm最新版安装教程)

    下载Python官网下载地址:Python下载不同参数解释,小伙伴们根据自己情况进行下载即可(此处博主用的是3.7.3版本):–web-basedinstaller:在线安装。下载的是一个exe可执行程序,双击后,该程序自动下载安装文件进行安装。网络安装版,需联网–executableinstaller:程序安装。下载的是一个exe可执行程序,双击进行安装。本地安装,可执行程序(***)–embeddablezipfile:解压安装。下载的是一个压缩文件,解压后即表示安装完成。嵌入式版

  • VMware 虚拟机的三种网络连接方式「建议收藏」

    VMware 虚拟机的三种网络连接方式「建议收藏」VMware的虚拟机有三种网络连接方式,分别是桥接(Bridged)模式、NAT模式和仅主机(Host-only)模式。在安装VMware之后,宿主机上会出现几个相关的虚拟设备,每个设备的功能如下:VMnet0:桥接(Bridge)模式下的虚拟交换机。VMnet1:仅主机(Host-only)模式下的虚拟交换机。VMnet8:NAT模式下的虚拟交换机。VMwareNetworkAdapterVMnet1:宿主机与Host-only虚拟网络进行通信的虚拟网卡。VMwareN

  • 文章系列:响应式JavaScript

    文章系列:响应式JavaScript

  • java保留两位小数不四舍五入_java截取两位小数

    java保留两位小数不四舍五入_java截取两位小数首先让我们来定义三个变量 doublex=5.112; doubley=5.118; doublez=5.1; 前两个用于演示四舍五入, 最后一个用于演示一位小数的情况方法一:使用String.format方法(四舍五入) System.out.println(String.format(“%.2f”,x)); System.out.println(S…

  • mongodb笔记_mongodb objectid

    mongodb笔记_mongodb objectid注册表中查找B1159E65-821C3-21C5-CE21-34A484D54444中的子项4FF78130,删除其下的三个子项即可。这样剩余时间又会回到15天前。[img]http://dl.iteye.com/upload/attachment/0077/4713/021bf1d3-48db-3aef-a948-e8ae5b5b9ec3.png[/img]…

  • sql中对嵌套查询的处理原则_sql的多表数据嵌套查询

    sql中对嵌套查询的处理原则_sql的多表数据嵌套查询在做嵌套查询时,如果嵌套的条件在另一张表中没有数据,则会报错。这时候可以用:

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号