nginx sendfile 参数解释

nginx sendfile 参数解释转载地址: https://blog.csdn.net/renyican/article/details/50582085sendfile 现在流行的web服务器里面都提供sendfile选项用来提高服务器性能,那到底sendfile是什么,怎么影响性能的呢?sendfile实际上是Linux2.0+以后的推出的一个系统调用,web服务器可以通过调整自身的配置来决定是否利用sendfi…

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

sendfile 

现在流行的web 服务器里面都提供 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 来完成网络传输的。上面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(第4次切换了),然后 DMA 从 kernel buffer拷贝数据到协议栈(第4次拷贝了)。 

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

nginx 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 里。

nginx sendfile 参数解释

文章参考:http://www.th7.cn/system/lin/201306/41314.shtml

https://www.linuxidc.com/Linux/2014-05/102321.htm

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

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

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

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

(0)


相关推荐

  • SPPnet 详解[通俗易懂]

    SPPnet 详解[通俗易懂]RCNN系列:RCNN,SPPNet,FastRCNN,FasterRCNN,R-FCN。  前不久刚刚看完rcnn和fastrcnn,对目标检测的学习更进一步。sppNet简介:作者:何凯明  2016年加入成为FAIR(facebook微软研究员),2011年获得博士学位,主要兴趣和研究在计算机视觉和深度学习。获得cpvr和iccv多个奖项。 SP…

  • 010 docker搭建swarm集群

    010 docker搭建swarm集群

  • 时间戳转换为Date

    时间戳转换为Date本章主要讲解的是,因为数据库储存时间是以int(11)的形式去储存,后期获取之后转化成DATE形式老是与正确时间对不上。1、获取当前时间的时间戳//除以1000为了获取精确到秒的时间戳,不除以1000得到毫秒的时间戳Stringtimestamp=String.valueOf(newDate().getTime()/1000);returnInteger.va…

  • Day03,Python文件的常见操作

    Day03,Python文件的常见操作Day03,Python文件的常见操作

  • 轮询和长轮询_http长轮询

    轮询和长轮询_http长轮询轮询:说白了就是客户端定时去请求服务端,是客户端主动请求来促使数据更新;长轮询:说白了也是客户端请求服务端,但是服务端并不是即时返回,而是当有内容更新的时候才返回内容给客户端,从流程上讲,可以理解

  • 计算机组成原理第三版唐朔飞PPT_计算机组成原理第5版

    计算机组成原理第三版唐朔飞PPT_计算机组成原理第5版写在前面:恰逢期末复习,用了几天时间结合老师勾画的重点以及课件教材等,将全书重要内容做了个大整合。一方面便于自己复习记忆,另一方面po出来让更多需要的人也可以做个参考。同类梳理:《数据库系统概论》第五版(王珊版)全书知识梳理《计算机组成原理》第五版(唐朔飞考研版)全书知识梳理《数据结构》C语言版(清华严…

发表回复

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

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