专栏首页IT技术精选文摘缓存服务器syns to listen sockets drop导致创建socket失败

缓存服务器syns to listen sockets drop导致创建socket失败

问题描述:

最近遇到了一个syn丢包的情况,当系统磁盘、网络、cpu都无压力的时候,系统莫名其妙出现“sync to listen sockets drop”问题;无论带宽是10M还是8G,都会出现这种这种情况。现象为:输入系统命令:netstat -s | grep LISTEN,会出现 syns to listen sockets dropped; 但是并没有times the listen queue of a socket overflowed;连接队列包括两种,一个是半连接队列(syn queue),一个是全连接队列(accept queue);根据上述描述,accept队列并没有溢出,而syn队报丢失有可能是syn队列溢出的原因,也可能是其他原因;"syns to listen sockets dropped"意思是:收到三次握手的ack包,因为各种原因导致创建socket的过程中被丢弃;

首先我们分析了一下netstat -s里面的数据,发现"passive connections rejected because of time stamp"的值和"syns to listen sockets dropped"相差不大,很多服务器他们的值都是相同的,这个让人感觉sync to listen sockets drop的原因有可能与时间戳有关;

我们检查了一下系统的配置:

or的keepalive设置为512个,总共40个cpu;系统级别的监听队列长度是65535,syn队列是26w;or的每个进程监听队列是20w;

我们的架构是上层是openresty,下层是我们的自研缓存软件;

syns to listen sockets dropped; 是由于在三次握手过程中创建socket失败,但是我们不知道是or或者cache软件作为客户端丢失syn包还是or或者cache软件作为服务器丢失syn包;于是我们做了一系列测试;

发现以下几点:

1. client(用户)访问or层,会导致or层作为服务器端的syn包丢失;

2. or作为客户端,访问cache软件时,or发出的syn包没有丢失;(or和cache软件是同一个机房);

3. cache软件作为服务器,接受到的syn包没有丢失;

4. cache软件作为客户端,发出去的syn包没有丢失(cache软件主要是给其他IDC发送http请求);

于是我们的重点是解决用户给or的syn包丢失的问题;

我们从网上查找原因,查到了最有可能的原因:

:因为2.6内核以上中tcp_timestamps默认是打开的,所以当打开 tcp_tw_recycle时会导致部分通过NAT上网client无法正确连接服务器,故障表现为client发出SYN后无法收到server返回 的SYN+ACK,推荐的解决方法是关闭tcp_tw_recycle,打开tcp_tw_reuse解决TIME-WAIT过多的问题。

我们将/proc/sys/net/ipv4/tcp_tw_recycle修改为0,drop情况就不发生了;

然后查看tw个数:

netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

下面我们总结一下: tcp_tw_recycle 设置为 1 会开启系统对 TIME_WAIT 状态的 socket 的快速回收。开启这个功能,系统就会存下 TCP 连接的时间戳,当同一个 IP 地址过来的包的时间戳小于缓存的时间戳,系统就直接丢包,“回收”这个 socket。这个选项同样需要开启 tcp_timestamp 才生效。

开启这个功能是有很大风险的,服务器端会根据同一个 IP 发送过来的包的时间戳来判断是否丢包,而时间戳是根据发包的客户端的系统时间得来的,如果服务端收到的包是同一出口 IP 而系统时间不一样的两个客户端的包,就有可能会丢包,可能出现的情况就是一个局域网内有的客户端能连接服务端,有的不能。具体原因是客户端处于NAT模式下,出口ip可能是同一个ip,不同客户端的发送的时间戳可能乱序,服务器会检查相同ip地址发送来过的包的时间戳是不是小于缓存的时间戳,如果不是,直接丢掉;

有可能drop package的情况:(服务器端tcp_tw_recycle和tcp_timestamp都开启)

1.lvs处于NAT模式(咱们是DR);

2.客户端处于NAT模式; 3.IDC处于NAT模式;有人对国内的节点做了一个可视化分析,发现有2.61%的概率出口存在NAT的这种情况;

在服务器上最好打开tcp_tw_reuse,并且关闭tcp_tw_recycle。 tcp_tw_reuse和tcp_tw_recycle区别:

1. tw_reuse,tw_recycle 必须在客户端和服务端timestamps 开启时才管用(默认打开)

2. tw_reuse 只对客户端起作用,开启后客户端在1s内回收

3. tw_recycle 对客户端和服务器同时起作用,开启后在 3.5*RTO 内回收,RTO 200ms~ 120s 具体时间视网络状况。内网状况比tw_reuse 稍快,公网尤其移动网络大多要比tw_reuse 慢,优点就是能够回收服务端的TIME_WAIT数量;

本文分享自微信公众号 - IT技术精选文摘(ITHK01)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-02-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • RabbitMQ关于吞吐量,延迟和带宽的一些理论

    你在Rabbit有一个队列,然后一些消费者从这个队列中消费。如果你根本没有设置QoS(basic.qos),那么Rabbit会把所有的队列消息都按照网络和客户端...

    用户1263954
  • 使用Kafka在生产环境中构建和部署可扩展的机器学习

    用户1263954
  • Kubernetes应用健康检查

    在实际生产环境中,想要使得开发的应用程序完全没有bug,在任何时候都运行正常,几乎 是不可能的任务。因此,我们需要一套管理系统,来对用户的应用程序执行周期性的健...

    用户1263954
  • 工信部副部长苏波:"互联网+"成产业发展新常态

    工信部副部长苏波今日出席"中国发展高层论坛2015"并表示,全球产业发展进入深度调整、深刻变革的新时期,对我国加快产业结构调整提出了紧迫要求,新一轮科技革命...

    腾讯研究院
  • Amazon关键词抓取 python之lxml(xpath)

    机器学习和大数据挖掘
  • 在没有源代码的情况下对Linux二进制代码进行模糊测试

    AFL配合DynamoRIO,没错,就是drAFL。在drAFL的帮助下,我们就可以在没有源代码的情况下对LInux二进制代码进行模糊测试了。

    FB客服
  • Python字典的介绍

    Python技术与生活认知的分享
  • awk 入门教程

    它依次处理文件的每一行,并读取里面的每一个字段。对于日志、CSV 那样的每行格式相同的文本文件,awk可能是最方便的工具。

    ruanyf
  • python基本数据类型(四)-集合与运

    用户2398817
  • Pymongo更新数据

    弄啥嘞

扫码关注云+社区

领取腾讯云代金券