TCP 应答时间参数对网络性能的影响

时间:2022-05-05
本文章向大家介绍TCP 应答时间参数对网络性能的影响,主要内容包括TCP 应答延迟的概念、AIX 中的应答延迟参数、测试 intr_rate 参数设置对网络性能的影响、tcp_nodelayack 参数、fasttimo 参数、如何监控网卡的响应时间、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。

TCP 应答延迟的概念

TCP 应答延迟是 TCP 传输层的一个优化策略,为了降低网络数据包压力,减少小数据包而进行的一个处理,称之为 Nagle 演算法。从本质上讲,几个 应答响应可能结合在一起,成一个响应,减少协议开销。然而,在某些情况下,该技术可以降低应用程序的性能。

通常情况下,在服务器之间收发数据包,依据 TCP 协议,节点 A 向节点 B 发送一个数据报文 , 节点 B 收到这个数据报文以后,会向节点 A 返回一个 acknowledge 信息。然后,对于 A 节点向 B 节点发送的数据报文,可能只是简单的信息传递,也有可能是请求信息,对于请求信息,B 节点还需要返回相应的数据报文。

默认当客户端向服务器端发出一个数据报文之后,希望得到服务器端的确认。在一些交互式应用中,比如 telnet,当客户端输入一个字符串命令时,该字符串是以单个字节被传送到服务器,服务器 TCP 进程收到来自的客户端的数据之后向客户端发送一个 ACK 确认已经收到来自客户端的数据,之后将数据交给应用层 telnet。服务器应用层需要将收到的数据回显到客户端屏幕,于是服务器将需要回显的数据交由 TCP 进程发送。服务器 TCP 进程再将需要回显的数据发往客户端,客户端收到来自的服务器端的数据之后需要发送一个 ACK 来向服务器确认数据已经收到。之后客户端再次发送 telnet 字符串命令的下一个字节。

这个过程中,TCP 连接共产生了 4 个报文。在这个模型中,我们可以将服务器往客户发送的数据字节确认报文和数据字节回显报文合并成一个报文,这样,上述 TCP 连接就只需交换 3 个报文。

于是,下面引入延迟 ACK 机制:TCP 在接收到数据时不立即向发送方返回 ACK,而是延迟发送。一般延迟时间是 200ms。在等待发送 ACK 期间,TCP 收集需要往另一端发送的数据,直到收集的数据大小超过 MSS 的定义或者延迟时间超时,TCP 才将 ACK 信息和需要发送的数据合并成一个报文一起发送。这样有利于减少网络中的数据包,避免网络拥塞。

TCP 应答的延迟的时间统计是从收到包开始统计的,因此,对于包较小的情况 tcp_nodelayack 的效果要明显大于包比较大的情况。

例如,节点 A 向节点 B 发包,B 在接收到包的时候,就开始计算 ACK 延迟时间,由于包较小,很快可以接收完毕,接收完毕以后,查看应答延迟,如果延迟时间 - 收包的时间 <=0, 那么 B 节点会马上将 ACK 返回给 A 节点。

举个例子,例如 a 应答延迟设置成 100ms,B 节点收包用了 50ms,把么 B 节点将会在收完网络包以后的 50ms 后,再向 A 节点发送 ack。

节点 A 向节点 B 发比较大的网络包,B 在接收到包的时候,就开始计算 ACK 延迟时间,由于包较大,接收需要一定的时间,网络包接收完毕以后,查看应答延迟,如果延迟时间 - 收包的时间 <=0, 那么 ACK 会返回给 A 节点。在这种情况下,即使 tcp_nodelayack 设置为 1,也就是没有延迟,由于网络包较大,接收时间较长,延迟还是比接收小的数据包要大一些。

举个例子,例如 a 应答延迟设置成 100ms,B 节点收包用了 150ms,由于 100-150<0,B 节点会马上将 ack 返回给 A 节点。因此,可以说,对于包较小的情况,tcp_nodelayack 的效果要大于包比较大的情况明显。

AIX 中的应答延迟参数

网卡的 intr_rate 参数设置

对于物理网卡而言,我们可以通过设置 intr_rate 来设置网卡的最大中断频率。需要注意的是,虚拟网卡和 IVE 网卡是没有这个参数的。

图 1. 网卡的参数设置

intr_rate 代表着每秒网卡中断的次数,默认的数值是 10000 次。通过对网卡最大中断次数的限制,网卡会将多个小的网络包聚集在一起,一次发送。这样带来的好处是提高网卡的性能,带来的缺点是降低了网卡的响应时间。

我们可以将 intr_rate 设置成 0-10000 中的任何一个数值

 #chdev -l ent0 -a intr_rate=100 – P
图 2. 网卡的 intr_rate 参数设置

如果将这个值设置成 0,就是从系统层面将网卡中断次数的限制关闭,即收发网络包没有延迟。

测试 intr_rate 参数设置对网络性能的影响

我们通过一个脚本,增加网络压力。

图 3. 网络加压脚本

为了保证网络压力,执行这个脚本 30 次:

 /.ftp $1 25.39 $2 15000000&

查看此时的网络流量:

图 4. 网卡的网络性能

此时,将 ent0 的网卡 intr_rate 的数值从默认 1000 修改为 0:

图 5. 修改网卡的参数

观察网络流量的变更:

图 6. 观察网卡的性能

网卡流量和接收包的数量略有增加,但并不显著。

查看此段时间收集的 nmon,网卡的网络包的数量并未有显著变化。因此,对于 intr_rate 参数,通常情况下我们使用默认的参数即可,即 10000。

图 7. 观察 nmon 结果输出

tcp_nodelayack 参数

如下图所示,在 AIX 6.1 中,可以使用 no -a 命令对 tcp_nodelayack 参数进行查看,这个参数默认设置为 0。

图 8. tcp_nodelayack 参数值

在 AIX 系统中,默认的 TCP 应答的延迟的 200ms,如果将 tcp_nodelayack 设置为 1,将没有延迟。对于 packet 较小的系统,将 tcp_nodelayack 设置为 1,将会造成网卡发包数量的大幅增加。这个参数可以动态调整:

 # no -o tcp_nodelayack=1 
 Setting tcp_nodelayack to 1

我们继续采用上小节中的实验场景,启动八个 ftp 脚本,在参数修改前,网络情况如下图:

图 9. 观察网络性能

此时,我们将 tcp_nodelayack 参数设置为 1:

然后观察网卡的性能,并没有太显著的变化:

图 10. 观察网络性能

此时,我们将对端服务器,也就是 172.16.15.56 服务器的参数设置为 1,再观察网络性能:

图 11. 观察网络性能

此时网卡接收网络包的数量大幅增加。在网卡吞吐量基本不变的情况下,接收网络包的数量大度增加,会提高数据的传输速度,从而提高网络性能。

fasttimo 参数

如果我们想将应答延迟设置成 0-200ms 之间的数值,可以将 tcp_nodelayack 设置为 0,然后调整如下数值(例如调整为 50ms):

#no -o fasttimo=50
 Setting fasttimo to 50

需要注意的是,应答延迟的设置,尽量在收发端设置为一致。而参数设置为多少,要结合应用的类型和网路包的类型,而不是简单地设置成 0 或者 200。

如何监控网卡的响应时间

使用 ping

我们可以使用 ping,大概计算一下从一个服务器向对端网卡发包的速度。

 # date;ping -c 10000 -f 172.16.15.56;date
图 12. ping 命令的使用

由于目前网络上没有压力,因此从上面的结果,大致可以判断发 10000 个网络包用了 2s 的时间,网卡响应很快。round-trip 可以作为网卡响应时间的衡量值。

执行脚本:

#/.ftp $1 15.56 $2 15000000
图 13. 执行网络加压脚本

此时监控网卡的响应时间,同样 10000 个网络包,需要 4 秒钟才能完成,round-trip 中的 max 值也从上一个场景的 0 增加到了 3。

图 14. 执行 ping 命令

启动三个 FTP 脚本,再监控网卡的响应时间:

图 15. 执行三个网络加压脚本

查看 ping 结果:

图 16. ping 命令执行结果

我们可以看到包的传输时间和网卡的响应时间最大值都有所增减。

使用 netstat -in 我们通过写一个简单的循环,可以监控网卡收发队列中的包的数量:

图 17. netstat 脚本

执行脚本:

图 18. netstat 脚本输出

从上图可以看出,本机网卡的接收队列为 0,发送队列的包数量比较多,可以粗略地判断本机网卡的影响时间和性能没有存在太大的问题,而如果发送队列中长期积压很多的网络包,则需要从对端网卡进行分析,即目标地址:172.16.15.56 的网卡。