`

nginx中sendfile配置的作用

 
阅读更多

 

转自:https://blog.csdn.net/zhusixun/article/details/81702380

 

那么sendfile是什么东西,他是怎么影响性能的… …  sendfile实际上是 Linux2.0+以后的推出的一个系统调用,web服务器可以通过调整自身的配置来决定是否利用 sendfile这个系统调用。先来看一下不用 sendfile的传统网络传输过程:

read(file,tmp_buf, len);

write(socket,tmp_buf, len);

硬盘 >> kernel buffer >> user buffer>> kernel socket buffer >>协议栈

 

一个基于socket的服务,首先读硬盘数据,然后写数据到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 ,然后 DMA 从 kernel buffer拷贝数据到协议栈。

 

上面4个步骤有4次上下文切换,有4次拷贝,我们发现如果能减少切换次数和拷贝次数将会有效提升性能。在kernel2.0+ 版本中,系统调用 sendfile() 就是用来简化上面步骤提升性能的。sendfile() 不但能减少切换次数而且还能减少拷贝次数。

 

再来看一下用 sendfile()来进行网络传输的过程:

sendfile(socket,file, len);

硬盘 >> kernel buffer (快速拷贝到kernelsocket buffer) >>协议栈



  

1、 系统调用sendfile()通过 DMA把硬盘数据拷贝到 kernel buffer,然后数据被 kernel直接拷贝到另外一个与 socket相关的 kernel buffer。这里没有 user mode和 kernel mode之间的切换,在 kernel中直接完成了从一个 buffer到另一个 buffer的拷贝。

2、DMA 把数据从 kernelbuffer 直接拷贝给协议栈,没有切换,也不需要数据从 user mode 拷贝到 kernel mode,因为数据就在 kernel 里。

 

简单说,sendfile是个比 read 和 write 更高性能的系统接口, 不过需要注意的是,sendfile 是将 in_fd 的内容发送到 out_fd 。而 in_fd 不能是 socket , 也就是只能文件句柄。 所以当 Nginx 是一个静态文件服务器的时候,开启 SENDFILE 配置项能大大提高 Nginx 的性能。 但是当 Nginx 是作为一个反向代理来使用的时候,SENDFILE 则没什么用了,因为 Nginx 是反向代理的时候。 in_fd 就不是文件句柄而是 socket,此时就不符合 sendfile 函数的参数要求了。

 

  • 大小: 18.3 KB
分享到:
评论

相关推荐

    Windows下Nginx的安装与配置

    Windows 下 Nginx 的安装与配置 Nginx 是一款高性能的、轻量级的 HTTP Web 服务器和反向代理服务器及电子邮件 IMAP/POP3/SMTP 代理服务器。其稳定性、丰富的功能集、示例配置文件和低系统资源的消耗使得其广泛应用...

    在Nginx中使用X-Sendfile头提升PHP文件下载的性能(针对大文件下载)

    配置Nginx使用X-Sendfile时,首先要在Nginx配置文件中创建一个内部访问的location,比如`/protected/`,并设置相应的根目录,确保只有Nginx可以访问这些文件: ```nginx location /protected/ { internal; root /...

    Nginx 配置文件 nginx.conf 详解

    Nginx 配置文件 nginx.conf 详解 Nginx 配置文件 nginx.conf 是 Nginx...文件传输是 Nginx 服务器处理文件传输的重要组件,我们可以通过 `sendfile` 指令来设置文件传输,例如 `sendfile on;`,这将开启文件传输功能。

    nginx nginx.conf配置

    sendfile on; # 开启高效文件传输模式 keepalive_timeout 65; # 客户端连接保持活动状态的时间 } ``` 5. **server块** server块是配置虚拟主机的地方,通过监听不同的端口或设置不同的服务器名称来处理不同的...

    nginx配置步骤详细

    Nginx 配置是 Web 服务器中的一种重要配置,需要根据实际情况进行调整和优化。以下是 Nginx 配置步骤详细的知识点总结: 一、worker_processes 配置 * worker_processes 指令指定了 Nginx 的 worker 进程数量,...

    Nginx+keepalived核心配置文件

    在这里,你可以设置通用的HTTP指令,如默认的服务器类型(default_type)、文件缓存(sendfile)等。 4. **server块**: 每个server块代表一个虚拟主机,可以配置监听的IP地址和端口,以及对应的SSL证书等。还可以...

    nginx配置教程

    #sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件, #对于普通应用,必须设为 on, #如果用来进行下载等应用磁盘IO重负载应用,可设置为 off, #以平衡磁盘与网络I/O处理速度,降低...

    Nginx配置文件详解

    本文将详细解析Nginx配置文件中的各个组成部分及其作用。 #### 二、Nginx配置文件整体结构 Nginx配置文件主要由以下几部分组成: 1. **全局块**:包含Nginx的基础配置信息。 2. **events块**:定义Nginx如何处理...

    window下nginx配置

    sendfile on; tcp_nopush on; keepalive_timeout 65; server { listen 80; server_name localhost; location / { root html; index index.html index.htm; } } } ``` 3. **关键配置项解析**: - `...

    nginx配置.zip

    sendfile on; keepalive_timeout 65; include /etc/nginx/conf.d/*.conf; } ``` - `conf.d`目录下的一个示例配置文件`example.conf`: ``` server { listen 80; server_name example.com; root /var/...

    开源电子书:Nginx 开发手册文档.pdf

    9. sendfile 支持:Nginx 支持 sendfile 函数,可以提高文件传输的效率。 Nginx 的安装和配置: 1. 安装 Nginx:可以在 Windows、FreeBSD、Ubuntu、Fedora 等多种操作系统上安装 Nginx。 2. 配置 Nginx:可以使用...

    nginx-1.9.0+配置.zip

    sendfile on; keepalive_timeout 65; server { listen 80; server_name localhost; location / { root html; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x....

    nginx配置+https

    - `sendfile on; tcp_nopush on; tcp_nodelay on;` 提高了数据传输效率。 - `keepalive_timeout 65;` 设置了持久连接的超时时间。 - `types_hash_max_size 2048; include /etc/nginx/mime.types; default_type ...

    linux下Nginx+tomcat整合的安装与配置

    在Nginx的`nginx.conf`中添加代理配置,指向Tomcat实例,例如: ``` location / { proxy_pass http://localhost:8080; } ``` #### 启动服务与验证 最后,分别启动Nginx和Tomcat服务,通过访问Nginx监听的端口来...

    nginx安装及配置

    Nginx还具备sendfile、sendfile64特性,用于优化文件传输,以及支持异步I/O(AIO)和内存映射(mmap)技术,进一步提升性能。 **Nginx的主要功能** 1. **静态资源服务**:Nginx擅长处理静态文件请求,如HTML、CSS...

    liunx下nginx 配置&重启

    本文将详细讲解如何在Linux系统中配置Nginx以及如何重启服务,以确保网站的正常运行。 首先,我们要了解Nginx的配置文件`nginx.conf`。它是Nginx的核心配置文件,位于`/etc/nginx/`目录下(具体路径可能因系统差异...

    张宴版Nginx学习 以及配置

    本文将基于“张宴版Nginx学习 以及配置”这一主题,深入探讨Nginx的基础知识、配置技巧以及在实际应用中的各种模块和优化策略。 1. **Nginx基本配置与优化** - Nginx的核心配置文件是`nginx.conf`,其中包含了全局...

    nginx-proxy-manager中的Nginx配置

    `include`指令用于导入其他配置文件,`sendfile`和`keepalive_timeout`分别设置文件传输方式和TCP连接的空闲超时时间。 **4. server块** server块定义了一个虚拟主机,通常与主机名或IP地址绑定。在Nginx Proxy ...

    nginx中文文档

    它支持sendfile、sendfile64、sendfilev等技术,支持文件AIO和DIRECTIO,还支持Accept-filters和TCP_DEFER_ACCEPT。在性能上,10000个非活跃的HTTP keep-alive连接仅占用约2.5M内存,它尽量避免数据拷贝操作。 ...

Global site tag (gtag.js) - Google Analytics