设为首页 收藏本站
查看: 637|回复: 0

[经验分享] sendfile()对nginx性能的提升

[复制链接]

尚未签到

发表于 2018-11-8 06:14:21 | 显示全部楼层 |阅读模式
  Linux kernel 2.2之前,(如图)读写数据基本都是使用read系统调用和write系调用,以nginx来说如果一个请求建立,从磁盘的文件到网络连接之间会通过硬件(DMA)---内核层---用户层多次读写系统来完成文件数据的复制传输:从内核层用read系统调用读到用户层,再从用户层用write系统调用写到内核层,每一次用户层到内核层的进行一次上下文转换,这种代价是非常昂贵的。甚至在没有数据变化时这种复制尤其显得多余。如果nginx接受大量并发请求,这种系统调用就会非常频繁,服务器的性能就会下降。
DSC0000.jpg

  在Linux kernel2.2版本之后出现了一种叫做“零拷贝(zero-copy)”系统调用机制,目前很多应用服务器如apache、samba、nginx都支持sendfile。注意:sendfile系统调用是一种文件传输的系统调用和kernel系统调用关系不大。
DSC0001.jpg

  如图所示,nginx在支持了sendfile系统调用后,避免了内核层与用户层的上线文切换(content swith)工作,大大减少了系统性能的开销。
  可以使用man 8 sendfile 进一步了解sendfile系统调用。
DSC0002.jpg

  以下是对参数解释
out_fd  

  
a file descriptor, open for writing, for the data to be written
  

  
in_fd
  

  
a file descriptor, open for reading, for the data to be read
  

  
offset
  

  
the offset in the input file to start transfer (e.g. a value of 0 indicates the beginning of the file). This is passed into the function and updated when the function returns.
  

  
count
  

  
the number of bytes to be transferred
  正常情况下函数会返回被写入的字节数,如果出错就返回-1
  我们都知道在linux系统里文件描述符fd,可以是一个真实的文件或者是一个设备,例如一个网络socket,(当然linux世界里一切皆文件,这里只是具体区别一下。)senfile需要输入的文件描述符是一个支持mmap的真实文件或者设备,那么socket就不能作为输入的fd,而输出的fd是可以的。
  具体在nginx的使用中可以通过在配置文件nginx.conf中增加参数使用sendfile
  http {
  sendfile on;
  tcp_nopush on;
  tcp_nodelay on;
  ...........................
  }



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-632050-1-1.html 上篇帖子: nginx优化 下篇帖子: Consul + Nginx实现自动扩容平台
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表