搜索
简帛阁>技术文章>Nginx中sendfile的作用

Nginx中sendfile的作用

那么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 函数的参数要求了。

那么sendfile是什么东西,他是怎么影响性能……sendfile实际上是Linux20+以后推出一个系统调用,web服务器可以通过调整自身配置来决定是否利用sendfile这个系统调用。先
很多时候用户需要从网站下载文件,如果文件是可以通过一个固定链接公开获取,那么我们只需将文件存放到webroot下目录里就好。但大多数情况下,我们需要做权限控制,例如下载PDF账单,又例如下载网盘
Nginx是干嘛用?一、静态HTTP服务器首先,Nginx是一个HTTP服务器,可以将服务器上静态文件(如HTML、图片)通过HTTP协议展现给客户端。配置:server{listen80;端口
Sendfile函数在两个文件描写叙述符之间直接传递数据(全然在内核操作,传送),从而避免了内核缓冲区数据和用户缓冲区数据之间拷贝,操作效率非常高,被称之为零拷贝。Sendfile函数定义例如
剖析腾讯课堂技术架构,Nginx在互联网产品起到作用nginx与html/js/css等静态网页处理nginx与动态数据处理nginx与音视频处理nginx模块开发Nginx在互联网产品
首先,一起来看看传统IO执行流程:当我们用程序读取文件时候,会从用户态切换为内核态,同时基于DMA引擎将磁盘文件拷贝到内核缓冲区。那么问题又来了,什么是用户态和内核态,什么是DMA拷贝?????
nginx为了实现反向代理需求而增加了一个ngx_http_proxy_module模块。其中proxy_set_header指令就是该模块需要读取配置文件。在这里,所有设置含义和http请
文只针对Nginx在不加载第三方模块情况能处理哪些事情,由于第三方模块太多所以也介绍不完。Nginx能做什么——反向代理——负载均衡——HTTP服务器(动静分离)——正向代理以上就是我了解到Ng
一般来说,我们可以通过直接让URL指向一个位于DocumentRoot下面文件,来引导用户下载文件但是,这样做,就没办法做一些统计,权限检查,等等工作于是,很多时候,我们采用让PHP来做转发,为用
1Sticky工作原理:Sticky是nginx一个模块,它是基于cookie一种nginx负载均衡解决方案,通过分发和识别cookie,来使同一个客户端请求落在同一台服务器上,默认标识名为r