你好,游客 登录 注册 搜索
背景:
阅读新闻

sendfile()对Nginx性能的提升

[日期:2014-05-26] 来源:51cto  作者:老徐_kevin [字体: ]

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

sendfile()对Nginx性能的提升 

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

sendfile()对Nginx性能的提升 

如图所示,nginx在支持了sendfile系统调用后,避免了内核层与用户层的上线文切换(content swith)工作,大大减少了系统性能的开销。

可以使用man 8 sendfile 进一步了解sendfile系统调用。

sendfile()对Nginx性能的提升

以下是对参数解释

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是可以的。

CentOS 6.2实战部署Nginx+MySQL+PHP http://www.linuxidc.com/Linux/2013-09/90020.htm

使用Nginx搭建WEB服务器 http://www.linuxidc.com/Linux/2013-09/89768.htm

搭建基于Linux6.3+Nginx1.2+PHP5+MySQL5.5的Web服务器全过程 http://www.linuxidc.com/Linux/2013-09/89692.htm

CentOS 6.3下Nginx性能调优 http://www.linuxidc.com/Linux/2013-09/89656.htm

CentOS 6.3下配置Nginx加载ngx_pagespeed模块 http://www.linuxidc.com/Linux/2013-09/89657.htm

CentOS 6.4安装配置Nginx+Pcre+php-fpm http://www.linuxidc.com/Linux/2013-08/88984.htm

Nginx搭建视频点播服务器(仿真专业流媒体软件) http://www.linuxidc.com/Linux/2012-08/69151.htm

Nginx 的详细介绍请点这里
Nginx 的下载地址请点这里

本文永久更新链接地址http://www.linuxidc.com/Linux/2014-05/102321.htm

linux
相关资讯       Nginx性能  sendfile() 
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款