nginx的sendfile指令的作用
linux为了解决对读文件产生的从应用空间到内核空间复制数据产生的效率影响引进了零拷贝。什么是零拷贝?这里就不多说了,请参考http://blog.csdn.net/crazyguang/article/details/2423708,我们主要是讲述nginx怎么是用sendfile的。
nginx通过使用sendfile指令来控制是不是用linux提供的零拷贝功能。具体配置如下:
ngx_chain_t *ngx_linux_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit){...... if (header.nelts == 0 && cl && cl->buf->in_file && send < limit) { file = cl->buf;...... if (file) {...... rc = sendfile(c->fd, file->file->fd, &offset, file_size);...... } else { rc = writev(c->fd, header.elts, header.nelts);......}可以看出如果file有值就会调用sendfile,但是在上面的if语句中cl->buf->in_file在前面判断是否读取文件内容的时候会进行修改,也就是如果要读取文件内容就会复位0,这样读取了文件内容后就直接调用writev发送数据,否则就调用sendfile发送文件到客户端。