干翻 nio ,王炸 io_uring 来了 ,史上最详细说明及最全图解!!

Image
大趋势:全链路异步化,性能提升10倍+ 随着业务的发展,微服务应用的流量越来越大,使用到的资源也越来越多。 在微服务架构下,大量的应用都是 SpringCloud 分布式架构,这种架构总体上是 全链路同步模式 。 全链路同步模式 不仅造成了资源的极大浪费,并且在流量发生激增波动的时候,受制于系统资源而无法快速的扩容。 全球后疫情时代,降本增效是大背景。如何降本增效?一条好的路径: 全链路同步模式  ,升级为  全链路异步模式 。 全链路异步模式 改造 具体的内容,请参考尼恩的深度文章: 全链路异步,让你的 SpringCloud 性能优化10倍+ 先回顾一下全链路同步模式架构图 全链路同步模式  ,如何升级为  全链路异步模式 , 就是一个一个 环节的异步化。 40岁老架构师尼恩,持续深化自己的3高架构知识宇宙,当然首先要去完成一次牛逼的 全链路异步模式 微服务实操,下面是尼恩的实操过程、效果、压测数据(性能足足提升10倍多)。 全链路异步模式 改造 具体的内容,请参考尼恩的深度文章: 全链路异步,让你的 SpringCloud 性能优化10倍+ 并且,上面的文章,作为尼恩 全链路异步的架构知识,收录在《 尼恩Java面试宝典 》V52版的架构专题中 注:本文以 PDF 持续更新,最新尼恩 架构笔记、面试题 的PDF文件,请从这里获取: 语雀 或者 码云 全链路异步化的最终目标 全链路异步化的最终目标,如下图所示: 应用层:编程模型的异步化 框架层:IO线程的异步化 OS层:IO模型的异步化 一:应用层:编程模型的异步化 这个请大家去看 尼恩的 《 响应式 圣经 PDF 》电子书 随着 云原生时代的到来, 底层的 组件编程 越来越 响应式、流化, 从命令式 编程转换到 响应式 编程,在非常多的场景 ,是大势所趋。 而响应式编程, 学习曲线很大, 大家需要多看,多实操。 二:框架层:IO线程的异步化 这个大家 都选择 具有异步 回调功能的 异步线程模型,如 Reactor 线程模型 这个是面试的绝对重点 IO的王者组件,Netty框架,整体就是一个 Reactor 线程模型 实现 也是非常核心的知识,这里不做展开,请大家去看尼恩的畅销书《Java 高并发核心编程卷 1 加强版》。 三:OS层:IO模型的异步化 目前的一个最大难题,...

TCP_NODELAY & Nagle 算法

如何用TCP_NODELAY、Nagle算法、QUICKACK和更多设置来优化TCP,以获得更好的TC......。


如果你想真正了解TCP优化技术,如何决定使用哪些技术,以及如何实施这些技术,你就来对地方了。这篇文章太长太丰富了,我们决定把它分成几个部分,并给它一个目录。请欣赏!


1. TCP背景信息,为什么要实施Nagle算法和延迟ACK,以及它们如何相互作用

今天的互联网是一个大型的全球性TCP/IP网络,它可以远距离地发送网页和各种类型的巨大文件。自互联网建立之初,小型学术和政府网络主要使用Telnet和网络控制程序(NCP)协议以来,发生了很多变化。互联网自成立以来已经成倍增长,随着更多类型的流量、设备和协议的上线,有效管理这些流量的重要性也随之增加。


当TCP/IP协议栈在20世纪80年代初成为主导协议时,将Telnet留给了更专业的用途,终于有了优化流量、避免拥堵和数据丢失的设置。不过,即使是现在,要知道何时和如何使用这些设置也是很困难的。本文将明确常见TCP优化设置和技术的一些最佳使用情况,特别是Nagle算法、TCP_NODELAY、延迟ACK和TCP_QUICKACK。


以其创造者John Nagle命名的Nagle算法,是通过减少网络上发送的小数据包数量来提高TCP效率的一种机制。其目的是在应用程序向套接字提供数据相当缓慢的情况下,防止一个节点传输许多小包。如果一个进程导致许多小数据包被传送,它可能会造成不适当的网络拥堵。如果一个数据包的有效载荷比TCP头数据小,这一点尤其正确。


你不会为了搬一个梳妆台而租一整辆搬家车。为什么要在一个40字节的TCP数据包中发送一个1字节的Telnet指令?


这就好比把一个梳妆台装进一辆巨大的搬家卡车,然后开到整个城市。除非这个梳妆台需要立即到达那里,否则你还不如等待,把卡车装满。这就是Nagle算法的作用。Nagle算法是用来优化数据传输的,它将多个小的请求字节合并到一个TCP段中,这样头数据和有效载荷的比例就更有效率。TCP头占用了40个字节,有很多应用程序可以发出一个字节的有效载荷。如果你的环境被配置为立即发送数据,你最终可能会发送一个41字节的数据包,其中只有一个字节的实际有效载荷。


TCP延迟确认或延迟ACK是TCP的一些实现所使用的另一种技术,目的是为了提高网络性能和减少拥堵。延迟ACK的发明是为了减少确认分段所需的ACK数量,并减少协议的开销。延迟ACK是指目的地为延迟ACK计时器的值保留ACK段,大约为200-500ms。延迟ACK意味着TCP不会立即确认每一个收到的TCP段。几个ACK响应可以合并为一个响应,减少协议开销。延迟ACK基本上是由目的地押注200-500毫秒,新的数据包将在延迟ACK定时器到期前到达。虽然在某些情况下,该技术会导致应用性能的降低。


当你决定实施哪种TCP优化方法时,了解其对你的应用的性能影响是很重要的。


Nagle's Algorithm和Delayed ACK是在同一时间创建的,但由于创建者之间缺乏合作,他们提供了一个不完整的、有时是相互冲突的解决方案。John Nagle本人在Hacker News的一个主题中对这种情况表示沮丧,他说。


"这仍然让我恼火。真正的问题不是tinygram的预防。它是ACK延迟,以及那个愚蠢的固定计时器。它们都是在同一时间进入TCP的,但都是独立的。我做了tinygram预防(Nagle算法),伯克利做了延迟ACK,都是在1980年代早期。两者的结合是可怕的。"


2. Nagle算法和延迟ACK在TCP/IP网络中不能很好地配合使用

默认情况下,Nagle算法和延迟ACK在整个网络中被广泛实施,包括互联网。Nagle's算法在任何时候都只允许一个数据包在网络上积极传输,由于Nagle's算法和延迟ACK之间的相互作用,这往往会阻碍流量。因此,Nagle的算法在高度互动的环境中是不可取的。


比如说。如果可以的话,延迟ACK会试图在每个网段中发送更多的数据。但Nagle算法的一部分依赖于ACK来发送数据。Nagle的算法和延迟ACK一起造成了一个问题,因为延迟ACK在等待发送ACK,而Nagle的算法则在等待接收ACK!这就造成了200-300个随机停顿。这就造成了200-500ms的随机停顿,而这些段本来是可以立即发送并交付给接收方栈和上面的应用程序的。


在你需要你的数据立即被传送并且单向延迟很重要的情况下,例如当使用Telnet将用户交互(如按键或鼠标移动)从客户端传送到中央服务器时,关闭Nagle算法可以带来更好的用户体验。但是,对于几乎所有其他的事情,只有往返的时间是重要的,而不是单向的,那么关闭Nagle算法可能没有帮助。


延迟ACK在某些情况下是有帮助的,比如在Telnet中使用字符回波选项时。如果ACK很小,而且不使用很多带宽,那么延迟ACK就没有什么帮助。这些错综复杂的问题使得我们很难判断何时使用Nagle算法、延迟ACK和其他TCP优化选项。


TCP中没有任何东西可以自动关闭Nagle's algorithm或Delayed ACK,所以你必须充分了解你的网络,选择能够提供最佳性能的选项。

3. 什么是TCP_NODELAY和TCP_QUICKACK,它们是做什么的?

了解Nagle算法和延迟ACK之间的相互作用是非常重要的。TCP_NODELAY套接字选项允许你的网络通过禁用Nagle算法绕过Nagle延迟,并在数据可用时立即发送。启用TCP_NODELAY迫使套接字发送其缓冲区内的数据,无论数据包大小如何。要禁用Nagle的缓冲算法,请使用TCP_NODELAY socket选项。要禁用延迟ACK,请使用TCP_QUICKACK套接字选项。


启用TCP_NODELAY选项可以关闭Nagle的算法。如果是交互式应用或有大量握手的聊天协议,如SSL、Citrix和Telnet,Nagle算法会导致性能下降,而启用TCP_NODELAY可以提高性能。


在任何请求-响应应用协议中,请求数据可能大于一个数据包,这可能会人为地在请求者和响应者之间造成几百毫秒的延迟,即使请求者已经适当缓冲了请求数据。在这种情况下,请求者应通过启用TCP_NODELAY来禁用Nagle的算法。如果响应数据可能大于一个数据包,响应者也应该通过启用TCP_NODELAY来禁用Nagle算法,以便请求者能够及时收到整个响应。


4. 关于Nagle延迟、延迟ACK、Tinygrams和傻子窗口综合症的更多资源


5. 我应该启用TCP_NODELAY吗?

这真的取决于你的具体工作负荷和服务上的主导流量模式是什么。通常情况下,局域网(LANs)与广域网(WANs)相比,流量拥堵的问题较少。

如果你正在处理非交互式流量或批量传输,如SOAP、XMLRPC、HTTP/Web流量,那么启用TCP_NODELAY以禁用Nagle算法是不必要的。

在一些情况下,Nagle的算法没有帮助,应该启用TCP_NODELAY。

与中央服务器通信的高度互动的应用程序(Citrix、网络视频游戏等)。
与Telnet连接的设备 使用聊天协议的应用(Telnet、SSL)。

6. 如何计算出我是否应该启用TCP_NODELAY?

没有简单的经验法则,因为这与你的流量模式和应用组合有很大关系,但如果你有ExtraHop,你可以做一个很好的测试。让ExtraHop Discover设备运行以获得一些基线数据,然后看一下关键开关下的TCP统计。你是否看到大量的 "tinygrams"(与传输数据所需的头信息相关的开销相比,包含相对较小的有效载荷的数据包)。

如果你看到大量的微小颗粒或大量的Nagle延迟占总流量的百分比,那么禁用TCP_NODELAY,这将允许Nagle的算法减少微小颗粒的数量。再次让EDA运行一段时间,然后看一下tinygram数字,如果这个数字仍然很高,那么就启用TCP_NODELAY,表明Nagle的算法没有减少tinygrams。

调试往往是一个反复的过程。要知道你是否应该启用TCP_NODELAY,需要做一些实验,而且你的需求会随着你的网络堆栈和应用的增长和变化而变化。

7. 我如何知道TCP_NODELAY是否有帮助?

在启用TCP_NODELAY禁用Nagle算法并进行调整后,如果你看到Nagle Delays的数量占总流量的百分比非常低,而且tinygrams的数量也非常低,那么你就知道启用TCP_NODELAY有帮助。

相反,如果你看到Nagle Delays占总流量的百分比很高,而tinygrams的数量却很高,那么启用TCP_NODELAY可能不是最适合你的使用情况。

8. 如何解决Nagle算法和Delayed ACKs引起的问题?

如果你已经经历了调整过程,但仍然看到网络拥堵的问题,你可能有一些问题是无法通过调整套接字设置来解决的。然而,在放弃之前,还有一些事情可以尝试。

启用TCP_NODELAY,通过服务器上的全局套接字选项禁用Nagle的算法
在代理服务器和负载平衡器上进行配置文件调整。如果你运行的应用程序或环境只是有时有高度互动的流量和健谈的协议,这一点就特别重要。通过在负载均衡器层面动态切换Nagle算法和TCP_NODELAY的开关,你甚至可以保持高度异质的流量组合的最佳运行状态。
减少你的服务器和负载均衡器上的Delayed ACK计时器。有时,这种优化是在软件中处理的,在应用层面,但当情况不是这样时,你仍然可以在服务器或负载均衡器层面动态地管理ACK计时器。
当你做这些改变时,请仔细观察你的网络流量,看看每个调整对拥堵的影响。

在ExtraHop,我们详细了解了许多巨大的企业网络,你会惊讶地发现,一个大公司经常不必要地购买数十万美元的额外网络设备,因为他们的核心协议,即TCP/IP协议栈,并没有针对他们的应用流量组合进行优化。在向问题投掷更多的硬件之前,尝试优化你目前的环境确实是值得的。

Comments

Popular posts from this blog

便宜好用又稳定的VPN-桔子云,性价比极高!

V2rayN 电脑客户端如何在 win7/win10/win11上 实现全局代理

免费V2Ray节点在线订阅链接,亲测可用 - 22年7月更新