云服务器价格_云数据库_云主机【优惠】最新活动-搜集站云资讯

分布式存储_华为云服务登录帐号_企业0元试用

小七 141 0

针对HTTP/2性能的NGINX结构增强

简介我的团队:Cloudflare协议团队负责终止Cloudflare网络边缘的HTTP流量。我们处理与以下内容相关的特性:TCP、QUIC、TLS和安全证书管理、HTTP/1和HTTP/2。在第一季度,我们负责实施Cloudflare在Speed期间发布的增强的HTTP/2优先级产品周。这个是一个非常令人兴奋的项目,也是一个令人倍感兴奋的项目,但是在项目的过程中,我们对NGINX有许多有趣的认识:Cloudflare目前在其上部署软件基础设施的面向HTTP的服务器。我们很快就确定了,如果NGINX的内部工作不成功,我们的增强HTTP/2优先级项目甚至不能取得中等的成功更改。到期为了实现这些目标,我们着手对NGINX的内部结构进行了一些重大的改变,同时也对核心优先级产品进行了工作。这篇博文描述了结构变化背后的动机,我们如何处理这些变化,以及它们产生了什么影响。我们还确定了计划添加到路线图中的其他更改,我们希望它能提高性能进一步背景增强HTTP/2优先级处理的目的是对客户端和服务器之间的web流量执行一项操作:它提供了一种方法,当许多HTTP/2流从上游(服务器端或源端)流入一个流向下游(客户端)的HTTP/2连接时,它提供了一种方法来塑造这些流HTTP/2优先级划分允许站点所有者和Cloudflare边缘系统规定如何将各种对象组合到单个HTTP/2连接中的规则:某个特定对象是否应具有优先级并控制该连接并尽快到达客户端,或者一组对象是否应该平均地分担连接的容量,并更加强调平行度因此,增强的HTTP/2优先级使站点所有者能够解决客户端和服务器之间存在的两个问题:如何控制对象的优先级和顺序,和:如何最大限度地利用有限的连接资源,这可能会受到许多因素的限制,如带宽、流量和CPU工作负载在路径上的各个阶段连接。什么我们看到了吗?优先级排序的关键是能够比较两个或多个HTTP/2流,以便确定下一个流中哪个帧将进入管道。增强的HTTP/2优先级项目必然将我们引入到NGINX的核心代码库中,因为我们的意图是从根本上改变NGINX在HTTP/2数据帧被写回客户。非常在分析阶段的早期,当我们翻阅NGINX的内部结构以调查我们提出的特性的位置时,我们注意到NGINX本身的结构中有许多缺点,特别是:它如何将数据从上游(服务器端)移动到下游(客户端),以及它如何在其各个内部阶段临时存储(缓冲)这些数据。我们对NGINX早期分析的主要结论是,它基本上没有给流数据帧任何"接近度"。流要么是在nginxhttp/2层独立地连续处理,要么是不同流的帧在同一个地方花费很少的时间:例如共享队列。净效应是减少了有用的机会比较一下。我们创造了一个新的,几乎不科学但有用的度量:潜力,用来描述增强的HTTP/2优先级策略(甚至是默认的NGINX优先级)如何有效地应用于排队的数据流。潜力与其说是衡量优先次序本身的有效性,不如说这个指标将留待以后在项目中使用,它更多的是衡量算法应用过程中的参与程度。简单地说,它考虑优先级迭代中包含的流及其帧的数量,流越多,帧越多,优先级越高潜力。什么我们从早期就可以看出,默认情况下,NGINX显示的潜力很低:从浏览器中呈现优先级指令,与传统的HTTP/2优先级模型或我们增强的HTTP/2优先级产品中的情况相同没用什么是吗?为了改善与潜在问题相关的具体问题,同时提高系统的总吞吐量,我们确定了NGINX中的一些关键痛点。下面将介绍这些要点,它们或者已经作为增强HTTP/2优先级的初始版本的一部分进行了处理和改进,我们现在将自己的精力投入到少数有意义的工程中去月.HTTP/2frame write queue reclamationWrite queue reclamation是在我们发布的增强HTTP/2优先级的基础上成功发布的,具有讽刺意味的是,它并不是对原始NGINX的更改,事实上,当我们完成项目的一部分时,它是针对增强的HTTP/2优先级实现所做的更改,它是一个很好的例子,可以称之为:数据保存,这是一个很好的增加方法潜力。类似对于最初的NGINX,我们增强的HTTP/2优先级算法将放置一个队列将HTTP/2数据帧放入写入队列,这是对其应用优先级策略的迭代结果。写入队列的内容将被指定写入下游TLS层。同样与原始NGINX类似,由于来自暂时达到写入的网络连接的背压,写队列只能部分写入TLS层容量。早在我们的项目中,如果写入队列仅部分写入TLS层,我们只需将帧留在写队列中,直到积压工作被清除,然后我们将在未来的写入迭代中重新尝试将数据写入网络,就像原始的一样NGINX。那个原始NGINX采用这种方法是因为写队列是唯一存储等待数据帧的地方。然而,在我们为增强HTTP/2优先级而修改的NGINX中,我们有一个原始NGINX所缺少的独特结构:每流数据帧队列,我们在应用优先级算法之前临时存储数据帧他们。我们意识到在部分写入的情况下,我们能够将未写入的帧恢复到每流队列中。如果是一个后续的数据队列落后于部分未写入的数据队列,那么先前未写入的框架可以参与另一轮优先级比较,从而提高了我们算法下图说明了这一点过程:我们很高兴发布增强的HTTP/2优先级,其中包括回收功能,因为这个单一的增强极大地增加了潜力,并弥补了我们不得不推迟速度周的下一个增强的事实美味.HTTP/2帧写入事件重新排序在Cloudflare基础设施中,我们将单个HTTP/2连接的多个流从眼球映射到多个HTTP/1.1连接到上游Cloudflare控件飞机注:我们这样降低协议的等级似乎有违直觉,当我透露我们也在这些上游连接上禁用HTTP keepalive时,这可能看起来有双重违反直觉的行为,导致每个连接只有一个事务,但是这种安排有很多优点,特别是在CPU工作负载得到改善的情况下分发。什么时候NGINX监视它的上游HTTP/1.1连接的读活动,它可以检测到其中许多连接的可读性,并在一个批处理中处理它们。但是,在该批处理中,每个上游连接都是按顺序处理的,一次一个,从头到尾:从HTTP/1.1连接读取,到HTTP/2流中的帧,再到HTTP/2到TLS的连接写入层。那个现有的NGINX工作流如图所示图表:通过提交每个流的帧到TLS第一层流一次,在下游连接上的背压允许帧队列建立之前,许多帧可以完全通过NGINX系统,为这些帧提供了接近的机会,并允许应用优先级逻辑。这会对潜力产生负面影响,并降低优先顺序。TheCloudflare增强的HTTP/2优先级修改NGINX旨在将上述内部工作流重新安排为以下内容模特:虽然我们继续在每个上游的单独迭代中将上游数据帧化为HTTP/2数据帧连接,我们不再在每次迭代中将这些帧提交到单个写入队列,而是将帧排列到前面描述的每流队列中。然后,我们将单个事件发布到每个连接迭代的末尾,并对该事件中所有流的HTTP/2数据帧进行优先级排序、排队和写入事件。这个单一事件查找数据队列,方便地存储在各自的每流队列中,所有这些数据都非常接近,这大大增加了边缘优先化的潜力算法一个更接近实际代码的表单,这个修改的核心看起来有点像此:ngx_http_v2_进程数据(ngx_http_v2_连接*h2_连接,ngx_http_v2_流*h2_流,ngx_buffer*缓冲器){同时(!ngx_buffer_empty(缓冲区){ngx_http_v2_帧数据(h2连接,h2流->帧,缓冲器);}ngx_http_v2_优先级(h2连接->队列,h2_流->帧);ngx_http_v2_write_队列(h2连接->队列);}到此:ngx_http_v2_进程数据(ngx_http_v2_连接*h2_连接,ngx_http_v2_流*h2_流,ngx_buffer*缓冲器){同时(!ngx_buffer_empty(缓冲区){ngx_http_v2_帧数据(h2连接,