继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

内核怎么会让后端变慢?

Qyouu
关注TA
已关注
手记 489
粉丝 88
获赞 414

99%的延迟问题是由用户应用逻辑引起的。这里提到的应用逻辑包括应用所使用的库和框架。不过那1%有可能是内核。这里有一个例子,通过配置TCP可以减少前后端的网络延迟。

当应用程序写入套接字连接时,无论是前端发送请求还是后端回应,原始字节数据都会从用户空间复制到内核内存,并进行TCP/IP协议处理。

每个连接都有一个接收区,来自另一方的数据会到这里接收,还有一个发送区,应用数据在发送到网络之前会先放入该发送区。发送和接收区都位于内核内存中。

应用程序写入内核的数据不会立即发送,而是会被暂时缓存。内核希望积累到足够填满一个TCP段的数据,这个大小通常约为1500字节,称为MSS或最大报文长度。

缓冲的原因在于每个分段的开销,每个分段都带有大约40字节的头部,用这么大的头部发送少量数据会浪费网络带宽。因此出现了缓冲,这在计算机科学中是典型的处理方式。

默认情况下,内核会延迟发送数据段,希望通过应用程序更多地发送数据以填满一个MSS。该算法规定何时延迟和延迟多久,这个算法也叫Nagle算法。

在创建连接时,你可以通过设置套接字选项中的TCP_NODEDELAY来禁用延迟。这会使得即使缓冲区中只有几个字节,内核也会发送这些数据。这样做很有用,因为有时候几个字节就是我们所拥有的全部。这基本上是优先考虑低延迟,而不是网络传输效率。

在后端方面,应用程序可以通过启用此选项(禁用延迟)尤其是在向客户端发送响应时,应用程序能获得好处。这是因为响应是通过发送缓冲区来传输的。仅仅因为段未满就延迟发送,这可能导致响应发送速度减慢。在此次PR中,NodeJS已经启用了这个选项。

对于前端,应用程序可以从这个选项中获益。2016年,cURL的创建者Daniel花了好几个小时调试TLS延迟问题,结果发现内核在等待一个完整的MSS到来时,卡在少量TLS数据片段上。因此,cURL项目默认开启了TCP_NODELAY选项。

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP