Chinaunix首页 | 论坛 | 博客
  • 博客访问: 315220
  • 博文数量: 61
  • 博客积分: 365
  • 博客等级: 一等列兵
  • 技术积分: 611
  • 用 户 组: 普通用户
  • 注册时间: 2009-12-04 11:39
文章分类

全部博文(61)

文章存档

2017年(15)

2016年(13)

2015年(19)

2014年(12)

2013年(2)

我的朋友

分类: LINUX

2016-03-14 18:23:47

1、解决FIN-TAIT-1过多问题:(四次握手的原理不想多说,自己去找资料吧)
net.ipv4.tcp_keepalive_probes = 5

net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.tcp_retries2 = 5
net.ipv4.tcp_orphan_retries = 3

tcp_retries1 :默认值是3
它表示的是最大的重试次数,当超过了这个值,我们就需要检测路由表了。

tcp_retries2 :默认值为15
也是最大重试次数,只不过这个值一般要比上面的值大。和上面那个不同的是,当重试次数超过这个值,我们就必须放弃重试了。

tcp_orphan_retries 主要是针对孤立的socket(也就是已经从进程上下文中删除了,可是还有一些清理工作没有完成).对于这种socket,我们重试的最大的次数就是它。


2、解决time_wait过多的问题
具体问题具体分析吧,很多人会把recyle和reuse作为标准解决方案,其实这里面涉及的知识面相当广,很多时候光靠这个根本解决不了问题
例如并发量过大,前端转发端口不足,导致的time_wait问题
我们这里讨论的是另一个,即timestamp和tcp_tw_recycle导致的一些问题:
tcp_tw_recycle:大概意思是说TCP有一种行为,可以缓存每个连接最新的时间戳,后续请求中如果时间戳小于缓存的时间戳,即视为无效,相应的数据包会被丢弃。
Linux是否启用这种行为取决于tcp_timestamps和tcp_tw_recycle,因为tcp_timestamps缺省就是开启的,所以当tcp_tw_recycle被开启后,实际上这种行为就被激活了。
现在很多公司都用LVS做负载均衡,通常是前面一台LVS,后面多台后端服务器,这其实就是NAT,当请求到达LVS后,它修改地址数据后便转发给后端服务器,但不会修改时间戳数据,对于后端服务器来说,请求的源地址就是LVS的地址,加上端口会复用,所以从后端服务器的角度看,原本不同客户端的请求经过LVS的转发,就可能会被认为是同一个连接,加之不同客户端的时间可能不一致,所以就会出现时间戳错乱的现象,于是后面的数据包就被丢弃了,具体的表现通常是是客户端明明发送的SYN,但服务端就是不响应ACK,还可以通过下面命令来确认数据包不断被丢弃的现象:

点击(此处)折叠或打开

  1. [root@down nginx]# netstat -s |grep rejects
  2.     541157958 packets rejects in established connections because of timestamp

既然是需要同时开启tcp_timestamps和tcp_tw_recycle才会启动这种行为,那我们就应该把默认开启的tcp_timestamps关闭掉,就能解决这个问题了
net.ipv4.tcp_timestamps = 0

sysctp -p生效
阅读(3700) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~