开发者社区> 枫凡> 正文

Linux OS||不响应SYN总结

简介: 背景 对外提供TCP服务的进程,在压测时发现,TCP连接SYN响应慢,甚至不响应。导致无法正常接收新的请求,影响业务。 抓包分析:  如上有大量的重传,有时能够正常的响应请求,有时就无法响应请求。
+关注继续查看

背景

对外提供TCP服务的进程,在压测时发现,TCP连接SYN响应慢,甚至不响应。导致无法正常接收新的请求,影响业务。

抓包分析:

c1ca68e268bdb792bb818bda0540c93e4539e63a


如上有大量的重传,有时能够正常的响应请求,有时就无法响应请求。

排查思路

1、系统负载是否过高

2、是否有安全软件(比如安全狗,安骑士等)

3、是否开启防火墙

4、Snat问题 

5、TCP相关参数:net.ipv4.tcp_max_syn_backlog\net.ipv4.tcp_syncookies\fs.file-max等

6、系统最大文件打开数是否有限制

7、进程最大文件打开数是否有限制

8、业务程序是否有相关的安全限制

9、协议栈异常

10、网络安全设备原因


12月2日增加:

1、由于服务端收包时checksum错误,内核会默认丢弃该报文;


[root@xxxx ~]# netstat -s | grep -i sum
    InCsumErrors: 105
    InCsumErrors: 32

2、列队满了

[root@xxxxx ~]# ss -tanl
State       Recv-Q Send-Q                             Local Address:Port                                            Peer Address:Port
LISTEN      0      128                                            *:80                                                         *:*

其中Recv-Q表示当前accept queue中的连接数量,Send-Q表示accept queue的最大长度。如上:可以看到进程的accept queue默认是128,因为受到系统net.core.somaxconn=128的限制。


排查过程

根据排查思路中的几个关键点,进行逐一仔细确认:

1、检查系统负载是否正常

2、是否有安全软件:关闭安骑士服务,检查系统进程是否有其他安全软件进程

3、关闭系统防火墙:排除由于防火墙安全配置导致的问题。

4、Snat问题:根据问题环境判断,是否有该问题,如有根据案例方式处理。

5、检查TCP相关参数:调大相关参数:

net.ipv4.tcp_max_syn_backlog\net.ipv4.tcp_syncookies\fs.file-max等

6、系统最大文件打开数是否有限制:


[root@xxxx ~]# ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 3895
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 65535
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 3895
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
[root@xxxx ~]#


主要关注open files信息

7、查看进程最大文件打开数限制


[root@XXXXXX ~]# ps -ef | grep nginx
root      4867     1  0 Apr20 ?        00:00:00 nginx: master process /usr/sbin/nginx
nginx     4868  4867  0 Apr20 ?        00:00:00 nginx: worker process
root     20159 20105  0 09:59 pts/0    00:00:00 grep --color=auto nginx
[root@XXXXXX ~]# cat /proc/4868/limits
Limit                     Soft Limit           Hard Limit           Units
Max cpu time              unlimited            unlimited            seconds
Max file size             unlimited            unlimited            bytes
Max data size             unlimited            unlimited            bytes
Max stack size            8388608              unlimited            bytes
Max core file size        0                    unlimited            bytes
Max resident set          unlimited            unlimited            bytes
Max processes             3895                 3895                 processes
Max open files            1024                 4096                 files
Max locked memory         65536                65536                bytes
Max address space         unlimited            unlimited            bytes
Max file locks            unlimited            unlimited            locks
Max pending signals       3895                 3895                 signals
Max msgqueue size         819200               819200               bytes
Max nice priority         0                    0
Max realtime priority     0                    0
Max realtime timeout      unlimited            unlimited            us
[root@XXXXXXX ~]#


进程的调整方法:


echo -n 'Max open files=10000:10000' > /proc/3622/limits


如果上述方法无法使用,或者不生效,则:


写一个简单的shell,在里面启动命令之前写入
ulimit -n
然后写入启动命令。
测试启动没有问题后,执行脚本观察下。



prlimit要2.6.36版本+才行

http://xiezhenye.com/tag/prlimit

8、业务程序是否有相关的限制(联系用户确认)

9、协议栈异常;尝试初始化。

最后那三板斧

1、协议栈跟踪,参考
2、程序跟踪和抓包,参考


附录

针对问题:TCP连接失败
分析:netstat -s输出中和连接失败相关的参数
`202270382 invalid SYN cookies received 
--- 三次握手ack包,syncookies校验没通过;

13700572 resets received for embryonic SYN_RECV sockets 
---syn_recv状态下,收到非重传的syn包,则返回reset

1123035 passive connections rejected because of time stamp
---开启sysctl_tw_recycle,syn包相应连接的时间戳 小于 路由中保存的时间戳;

14886782 failed connection attempts 
--- syn_recv状态下,socket被关闭; 或者 收到syn包(非重传)

438798 times the listen queue of a socket overflowed
---收到三次握手ack包,accept队列满

438798 SYNs to LISTEN sockets ignored 
---收到三次握手ack包,因各种原因(包括accept队列满) 创建socket失败`
注:转载至:http://blog.sina.com.cn/s/blog_781b0c850101pu2q.html

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
30433 0
linux入门总结
linux的核心概念知识:     linux软件是开源免费的,而linux是由Unix演变而成,Unix是由MINIX演变而成。2000年以后,linux系统日趋成熟,涌现大量基于linux服务平台的应用并广泛用于ARM技术嵌入式系统之中。
951 0
阿里云服务器安全组设置内网互通的方法
虽然0.0.0.0/0使用非常方便,但是发现很多同学使用它来做内网互通,这是有安全风险的,实例有可能会在经典网络被内网IP访问到。下面介绍一下四种安全的内网互联设置方法。 购买前请先:领取阿里云幸运券,有很多优惠,可到下文中领取。
23157 0
总结工作中常用到的linux命令
常用解压命令 tar.bz2 命令: tar -jxvf  *.tar.bz2 tar.z   命令: tar -zxvf  *.tar.z tar.gz   命令: tar -Zxvf  *.
6653 0
linux多线程信号总结
  linux 多线程信号总结(一) 1. 在多线程环境下,产生的信号是传递给整个进程的,一般而言,所有线程都有机会收到这个信号,进程在收到信号的的线程上下文执行信号处理函数,具体是哪个线程执行的难以获知。
906 0
+关注
枫凡
专注于云计算相关的安全问题以及网络问题。坚信:“不忘初心,方得始终”
31
文章
38
问答
来源圈子
更多
作为全球云计算的领先者,阿里云为全球230万企业提供着云计算服务,服务范围覆盖200多个国家和地区。我们致力于为企业、政府等组织机构提供安全可靠的云计算服务,给用户带来极速愉悦的服务体验。
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载