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. 引擎会将数据直接从内核缓冲区拷贝到协议引擎中

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

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

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

(0)
上一篇 2022年5月16日 上午9:00
下一篇 2022年5月16日 上午9:20


相关推荐

  • 常见的python连接数据库包

    常见的python连接数据库包在日常的工作学习中 重复的在数据库中抽取数据 然后使用 python 读取处理 不仅繁琐 且效率低下 那么如果有条件直接使用 python 读取数据 效率就会有明显提高 同时在一些公司 为了某些数据的保密性 使用线上数据线上处理也变的比较流行了 下面汇总了一些常见的数据库连接使用方法 希望可以在一定程度上帮助大家 常见的数据库及连接包下表中是常用的数据库及连接表使用的包 数据库连接数据库 python 包 hivepyhive 或 impylamysqlP

    2026年3月16日
    2
  • get和post的区别

    get和post的区别

    2021年8月30日
    55
  • Eureka集群配置

    Eureka集群配置eureka作为注册中心,生产环境必须多节点部署,保证其高可用性。现以两台服务器来完成集群部署。服务器A:172.16.21.34服务器B:172.16.21.35方式一:使用ip形式完成。服务器A:172.16.21.34server:port:7777spring:application:name:register#指定eureka客户端的登录账户security:user:…

    2022年5月1日
    47
  • java cap理论_架构思想之CAP原理

    java cap理论_架构思想之CAP原理由于自己负责后端的设计已经有一段时间,对设计的一些思想和理论有一些理解,但最近被问到什么是CAP时,却一脸懵逼,下来后专门针对CAP架构思想进行了一些专题学习,在这里也将这个概念引入给大家,大家可以有意识地了解和学习这个思想理念,帮助自己在后续设计功能时有更好的参考。分布式领域CAP理论,Consistency(一致性),数据一致更新,所有数据变动都是同步的Availability(可用性),…

    2022年5月19日
    46
  • 基于ssm的个人博客系统的设计与实现(含源文件)

    基于ssm的个人博客系统的设计与实现(含源文件)欢迎添加微信互相交流学习哦!项目源码:https://gitee.com/oklongmm/biye进入二十一世纪,以Internet为核心的现代网络积水和通信技术已经得到了飞速的发展和广泛的应用,各种网络交流互动工具也应运而生。其中以论坛、博客、社区、空间最为受广大网民朋友的欢迎,也是目前为止发展的比较成熟的信息交流工具。在网络技术逐渐渗入社会生活各个层面的今天,传统的交流方式也面临着变革,而网络博客则是一个很重要的方向。基于Web技术的网络考试系统可以借助于遍布全球的Internet进行,因

    2022年7月21日
    16
  • 炸翻AI圈!智谱GLM-5硬核开源,市值狂飙500亿,AI编程直接开挂

    炸翻AI圈!智谱GLM-5硬核开源,市值狂飙500亿,AI编程直接开挂

    2026年3月12日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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