Linux 内核有两个重要的设置,对于每秒处理上千个链接的高流量站点而言,是颇有用处的,这两个设置就是tcp_tw_recycle 和tcp_tw_reuse。这些内核设置容许咱们在有新的客户端链接时从新使用套接字(文件描述符)。尽管这两个设置看起来很类似,其实倒是大相径庭的,若不进行慎重的管理,内核会很快用完全部套接字而且会丢失相关的用户数据。因为客户端链接和断开有许多方式,因此,正如您所知道的,TCP/IP 也有多种状态。这些状态在netstat中是很明显的,如SYN_SENT、ESTABLISHED, 还有很流行的TIME_WAIT, 还有其它许多不常见的状态。linux
TIME_WAIT 状态有一个关键问题,就是它的默认值为120秒时长,它会用完全部有价值的iptables和TCP自己的资源。这样作是为了确保全部在线或经过差的网络在传输额外的数据包或从新发送的数据包时不会错误地附加到新的链接中。可是,关键的问题是,任何新的链接在这两分钟内没法使用任何套接字。尽管您能够调整窗口大小,将其设置为15-30秒,可是对于高流量系统而言,这仍旧是一个问题,由于这些站点每秒须要1000-5000个套接字,这些套接字就会处于等待状态。在此,咱们来看一下两个很是重要的内核设置。
网络
tcp_tw_reuse 设置容许在TIME_WAIT 状态下重复使用一对套接字,由内核确保不会有相似于重复序列号的问题。因为两端都使用了时间戳,因此可以避免序列号重复。也能够基于某些关闭标识如FIN(表示不会有新的流量),来重复使用套接字。tcp
与tcp_tw_reuse设置相对的是tcp_tw_recycle,这是个设置不是很慎重而且彻底取决于客户端的时间戳。这种作法对于NAT系统而言会产生问题,由于这个系统会共享套接字和时间戳,这会致使内核丢弃SYN包并忽略链接意图。这会致使随机链接错误,形成如公司或大学的NAT使用人员随机胡乱链接,甚至致使拥有许多无线链接设备的家庭也出现链接故障。ide
因此,从本质上来讲,可使用tcp_tw_reuse 来释放TIME_WAIT中的套接字,可是不要使用tcp_tw_recycle,由于这个设置会给管理员和用户带来无数问题。固然,对于大型站点而言,还有其它须要关注的关键内核设置,最重要的设置包括iptables conntrack 设置和TCP 内存设置。blog
( Authored by Steve Mushero | ChinaNetCloud CEO & CTO 本博客英文原文请点击查看 )ip