方法3.为BandwidthDelayProduct调节TCP窗口TCP的性能取决于几个方面的诱因。两个最重要的诱因是链接带宽(linkbandwidth)(报文在网路上传输的速度)和往返时间(round-triptime)或RTT(发送报文与接收到另一端的响应之间的延时)。这两个

方法3.为BandwidthDelayProduct调节TCP窗口

TCP的性能取决于几个方面的诱因。两个最重要的诱因是链接带宽(linkbandwidth)(报文在网路上传输的速度)和往返时间(round-triptime)或RTT(发送报文与接收到另一端的响应之间的延时)。这两个值确定了称为BandwidthDelayProduct(BDP)的内容。

给定链接带宽和RTT以后,您就可以估算出BDP的值了,不过这代表哪些意义呢?BDP给出了一种简单的方式来估算理论上最优的TCPsocket缓冲区大小(其中保存了排队等待传输和等待应用程序接收的数据)。假如缓冲区太小,这么TCP窗口就不能完全打开,这会对性能导致限制。假如缓冲区太大,这么宝贵的显存资源都会导致浪费。倘若您设置的缓冲区大小恰好合适,这么就可以完全借助可用的带宽。下边我们来看一个反例:BDP=link_bandwidth*RTT倘若应用程序是通过一个100Mbps的局域网进行通讯,其RRT为50ms,这么BDP就是:100MBps*0.050sec/8=0.625MB=625KB注意:此处乘以8是将位转换成通讯使用的字节。

为此,我们可以将TCP窗口设置为BDP或1.25MB。并且在Linux2.6上默认的TCP窗口大小是110KB,这会将联接的带宽限制为2.2MBps,估算方式如下:

throughput=window_size/RTT

110KB/0.050=2.2MBps

假如使用前面估算的窗口大小linux tcp缓冲区大小,我们得到的带宽就是12.5MBps,估算方式如下:

625KB/0.050=12.5MBps

差异的确很大,而且可以为socket提供更大的吞吐量。因而如今您就晓得怎样为您的socket估算最优的缓冲区大小了。并且又该怎么来改变呢?

解决方案

SocketsAPI提供了几个socket选项,其中两个可以用于更改socket的发送和接收缓冲区的大小。清单2展示了怎样使用SO_SNDBUF和SO_RCVBUF选项来调整发送和接收缓冲区的大小。

注意:虽然socket缓冲区的大小确定了通告TCP窗口的大小,并且TCP还在通告窗口内维护了一个串扰窗口。为此linux 分区,因为这个串扰窗口的存在,给定的socket可能永远都不会借助最大的通告窗口。

int ret, sock, sock_buf_size; 

sock = socket( AF_INET, SOCK_STREAM, 0 );

sock_buf_size = BDP;

ret = setsockopt( sock, SOL_SOCKET, SO_SNDBUF,
(char *)&sock_buf_size, sizeof(sock_buf_size) );

ret = setsockopt( sock, SOL_SOCKET, SO_RCVBUF,
(char *)&sock_buf_size, sizeof(sock_buf_size) );

清单2.自动设置发送和接收socket缓冲区大小

在Linux2.6内核中,发送缓冲区的大小是由调用用户来定义的,并且接收缓冲区会手动加倍。您可以进行getsockopt调用来验证每位缓冲区的大小。

就windowscaling来说,TCP最初可以支持最大为64KB的窗口(使用16位的值来定义窗口的大小)。采用windowscaling(RFC1323)扩充以后,您就可以使用32位的值来表示窗口的大小了。GNU/Linux中提供的TCP/IP栈可以支持这个选项(以及其他一些选项)。

提示:Linux内核还包括了手动对这种socket缓冲区进行优化的能力(请参阅下边表1中的tcp_rmem和tcp_wmem),不过这种选项会对整个栈导致影响。倘若您只须要为一个联接或一类联接调节窗口的大小,这么这些机制似乎不能满足您的须要了。

方法4.动态优化GNU/LinuxTCP/IP栈

标准的GNU/Linux发行版企图对各类布署情况都进行优化。这意味着标准的发行版可能并没有对您的环境进行特殊的优化。

linux tcp缓冲区大小_tcp 数据包 大小_tcp的拥塞窗口cwnd大小

解决方案

GNU/Linux提供了好多可调节的内核参数,您可以使用这种参数为您自己的用途对操作进行动态配置。下边我们来了解一下影响socket性能的一些更重要的选项。

在/proc虚拟文件系统中存在一些可调节的内核参数。这个文件系统中的每位文件都表示一个或多个参数64位linux,它们可以通过cat工具进行读取,或使用echo进行更改。清单3展示了怎样查询或启用一个可调节的参数(在这些情况中,可以在TCP/IP栈中启用IP转发)。

[root@camus]# cat /proc/sys/net/ipv4/ip_forward 
0
[root@camus]# echo "1" > /poc/sys/net/ipv4/ip_forward
[root@camus]# cat /proc/sys/net/ipv4/ip_forward
1
[root@camus]#

清单3.调优:在TCP/IP栈中启用IP转发

与任何调优努力一样,最好的方式实际上就是不断进行实验。您的应用程序的行为、处理器的速率以及可用显存的多少还会影响到那些参数影响性能的方式。在个别情况中,您觉得有益的操作可能恰恰是有害的(反之亦然)。为此,我们须要逐一试验各个选项,之后检测每位选项的结果。换而言之,我们须要相信自己的经验,并且对每次更改都要进行验证。

linux tcp缓冲区大小_tcp的拥塞窗口cwnd大小_tcp 数据包 大小

提示:下边介绍一个有关永久性配置的问题。注意,假若您重新启动了GNU/Linux系统,这么您所须要的任何可调节的内核参数就会恢复成默认值。为了将您所设置的值作为这种参数的默认值linux tcp缓冲区大小,可以使用/etc/sysctl.conf在系统启动时将这种参数配置成您所设置的值。

GNU/Linux工具

GNU/Linux对我特别有吸引力,这是由于其中有好多工具可以使用。虽然其中大部份都是行工具,而且它们都十分有用,并且十分直观。GNU/Linux提供了几个工具——有些是GNU/Linux自己提供的,有些是开放源码软件——用于调试网路应用程序,检测带宽/吞吐量,以及检测链接的使用情况。

ping这是用于检测主机的可用性的最常用的工具,而且也可以用于辨识带宽延时产品估算的RTT。

traceroute复印某个联接到网路主机所经过的包括一系列路由器和网段的路径(路由),进而确定每位hop之间的延时。

netstat确定有关网路子系统、协议和联接的各类统计信息。

tcp的拥塞窗口cwnd大小_linux tcp缓冲区大小_tcp 数据包 大小

tcpdump显示一个或多个联接的合同级的报文跟踪信息;其中还包括时间信息,您可以使用这种信息来研究不同合同服务的报文时间。

netlog为应用程序提供一些有关网路性能方面的信息。

nettimer为困局链接带宽生成一个测度标准;可以用于合同的手动优化。

Ethereal以一个便于使用的图形化界面提供了tcpump(报文跟踪)的特点。

iperf检测TCP和UDP的网路性能;检测最大带宽,并汇报延时和数据报的遗失情况。

结束语

尝试使用本文中介绍的方法和技术来增强socket应用程序的性能,包括通过禁用Nagle算法来降低传输延时,通过设置缓冲区的大小来提升socket带宽的借助,通过最小化系统调用的个数来增加系统调用的负载,以及使用可调节的内核参数来优化Linux的TCP/IP栈。

在进行优化时还须要考虑应用程序的特点。诸如,您的应用程序是基于LAN的还是会通过Internet进行通讯?倘若您的应用程序仅仅会在LAN内部进行操作,这么减小socket缓冲区的大小可能不会带来太大的改进,不过启用巨帧却一定会极大地改进性能!

最后,还要使用tcpdump或Ethereal来检测优化过后的结果。在报文级听到的变化可以帮助展示使用这种技术进行优化过后所取得的成功疗效。

本文原创地址://lrxjmw.cn/tjtcktdxnqjy.html编辑:刘遄,审核员:暂无