2008年8月26日星期二

Freebsd的Tcp协议栈优化

A. TCP Host Cache

Host Cache (不是syncache)是用来缓存两台机器通讯过程中链接信息——例如RTT(Round Trip Time),MTU,congestion window和bandwidth-delay product(BDP)等。即使在连接中断后,也会保持一段时间,这样如果再次通信的,两台机器间的Tcp连接一开始就能以优化过性能后的参数通信。

FreeBSD中影响host cache的参数如下:

net.inet.tcp.hostcache.cachelimit: 15360 表示hostcache所能占的最大空间是hashsize和bucketlimit的乘
net.inet.tcp.hostcache.hashsize: 512
net.inet.tcp.hostcache.bucketlimit: 30
net.inet.tcp.hostcache.count: 4 当前hostcache的使用情况
net.inet.tcp.hostcache.expire: 3600 过期的秒数
net.inet.tcp.hostcache.purge: 0 当设置为1时,将当前hostcache中的缓存剪除(prune),然后再将其置0

B.TCP Extensions

net.inet.tcp.sack.enable: 1 是否默认支持TCP Extensions
net.inet.tcp.rfc1323: 1 是否 支持rfc1323,支持window scaling,在高带宽下比较有用
net.inet.tcp.rfc3042: 1 支持rfc3042,支持limited transmit mechanism,在线路质量不好的情况下有用
net.inet.tcp.rfc3390: 1 支持自动选择协商传输的窗口大小,而不是先初始化选择1
net.inet.tcp.slowstart flightsize: 1
net.inet.tcp.local slowstart flightsize: 4
net.inet.tcp.delayed ack: 1
net.inet.tcp.delacktime: 100ms
net.inet.tcp.inflight.enable: 1
net.inet.tcp.inflight.rttthresh: 10ms
net.inet.tcp.newreno: 1
net.inet.tcp.path mtu discovery: 1

这里边着重说一下delayed ack和delacktime

在tcp传输过程中,每接受到一个数据包,就需要向对方回一个ack,这样会占用互联网的带宽。那么可以定义我遇到要发生的ack先登一段时间 (delacktime所定义),如果碰到正好要想对方发送数据(往往这种情况很多),那么我就把ack回应放在回应的数据包中传输回去,就像搭了一个顺风车。如果delacktime超时,仍然等不到要发生的数据,那就需要单独的一个数据包传回。

C.Buffer

kern.ipc.nmbclusters 定义了最多有多少个mbuf clusters可以被同时使用
kern.ipc.maxsockbuf 定义了sendspace和recvspace所能使用的上限
net.inet.tcp.sendspace 定义了发送send的所使用buffer的上限
net.inet.tcp.recvspace 定义了发送recv的所使用buffer的上限

一般情况下,改变这些数值会影响到通信时,告诉给别人的window size的大小,进而影响传输速度。

例如,限制recvspace的大小,造成window size只能64k,假设传输时延为10ms,那么最高的传输速率将会是52Mbps。

D.MTU

MTU,也会决定传输速度。但是大于1500的数据包在广域网上传输会存在问题。但是在局域网传输的话,就比较有用,而能传输多大的数据包,也和网卡的支持有关系,intel pro/1000的MTU最高到16110bytes。

设定一个网卡的MTU非常简单:

ifconfig em0 10.0.0.1 mtu 9000

测试工具:

需要调整那些参数已经列举完了,但是具体的如何tunning,只要default,并没有一个authority的值。具体就需要测试工具进行测试了。

常用的测试工具有

iperf

nttcp

SIFTR

没有评论: