首页 > 编程知识 正文

sendfile nginx,nginx 文件下载

时间:2023-05-03 11:46:50 阅读:19381 作者:3325

转载来源: https://www.Jian Shu.com/p/CAC 0a 92b 9530

优化Nginx配置:

sendfile on; tcp_nopush on; tcp_nodelay on; 1、TCP_NODELAY

如何强制套接字向缓冲区发送数据?

一种解决方案是TCP栈的TCP_NODELAY选项。 这样可以立即发送缓冲区中的数据。

如果使用Nginx的TCP_NODELAY选项,则在打开新套接字时会添加TCP_NODELAY选项。

但是,在这种情况下,会发生以下情况。

终端APP应用程序每次操作都会发送一个数据包,但通常一个数据包有1字节的数据和40字节的头,会产生4000%的重载,很容易使网络拥塞。

为了避免这种情况,TCP堆栈提供了0.2秒的数据等待,因此它会将其间的数据变成较大的数据包,而不是在操作后发送数据包。 该机制由Nagle算法保证。

Nagle化后来被标准化,很快在网上实现了。 现在是默认配置,但在某些情况下,您可能需要关闭此选项。 现在,假设一个APP应用程序提出了发送小块数据的请求。 您可以选择立即发送数据,也可以等待生成更多数据,然后再发送一次。

如果立即发送数据,交互式APP应用程序和基于客户端/服务器的APP应用程序将带来巨大的好处。 如果马上发送请求的话,响应时间也会变快。 可以通过设置套接字的TCP_NODELAY=on选项执行上述操作,禁用Nagle算法。 (无需等待0.2s )

2、tcp_nopush

在nginx上,tcp_nopush配置和tcp_nodelay“互斥”。 可以设置一次发送的数据的数据包大小。 也就是说,数据包累计到一定大小后发送,而不是在0.2秒后发送数据包。 在nginx上,tcp_nopush必须与sendfile结合使用。

3、sendfile

当前流行的web服务提供了sendfile选项来提高服务性能,但什么是sendfile呢? 它是如何影响性能的呢? sendfile实际上是Linux2.0或更高版本的系统调用,web服务器可以通过调整其配置来决定是否使用sendfile系统调用。 首先,让我们看看不使用sendfile的传统网络传输过程。

读取(file,tmp_buf,len );

write (套接字,tmp_buf,len );

hddkernelbufferuserbufferkernelsocketbuffer协议栈

通常,网络APP应用程序通过读取硬盘上的数据并将数据写入套接字来完成网络传输。 上面两行用代码说明了这一点,而上面两行简单的代码掩盖了很多基础操作。 看看下面的图层是如何运行上面两行代码的:

1、系统调用读取) )生成上下文开关。 从用户模式切换到kernel模式,DMA执行复制并将文件数据从硬盘读取到kernel buffer。

2、数据从kernel buffer复制到user buffer,系统调用读取) )返回。 此时,会出现从kernel mode切换到user mode的上下文开关。

3、系统调用write ) )从用户模式切换到kernel模式,将步骤2中读入到用户缓冲器的数据复制到kernel缓冲器中(数据是第二次复制到kernel缓冲器中)

4、系统调用write ()返回,发生上下文开关。 从kernel mode切换到用户模式)第四次切换),然后DMA将数据从kernel buffer复制到协议栈)第四次复制)。

在上面的四个步骤中,我们发现如果有四个上下文交换机、四个副本,并且可以减少交换机和复制次数,则性能会得到有效提高。 在kernel 2.0版中,系统调用sendfile ()用于简化上述步骤以提高性能。 sendfile ()不仅可以减少切换次数,还可以减少复制次数。

让我们看看在sendfile ()中进行网络传输的过程。

sendfile(socket,file,len );

hddkernelbuffer (快速复制到kernelsocketbuffer )协议栈

1、系统调用sendfile ()通过DMA将硬盘数据复制到kernel buffer,然后数据通过kernel直接复制到另一个socket相关的kernel buffer。 这里没有用户模式和密钥模式的切换,而是直接进行了从作为密钥的缓冲器到另一个缓冲器的复制。

2、DMA将数据直接从kernelbuffer复制到协议栈,无需切换,无需将数据从用户模式复制到kernel模式。 因为数据在kernel上。

减少步骤、减少切换、减少副本,性能自然会提高。 因此,在Nginx配置文件中启用sendfile on选项可以提高web服务器的性能。参考:Nginx sendfile配置:https://www.jianshu.com/p/6aa4cc5336e2

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。