排查网络故障思路总结

2020-06-29 16:41:47 浏览数 (2)

今日看了一篇文章, 感觉写的不错, 主要是讲的服务间调用超时的故障排查经历.

因为这中间涉及很多系统命令的一些使用, 延伸出一些知识点, 以下为简单的记录:

1. 问题现象

每次一发版导致服务A调用B服务超时, B没有任何请求记录日志, 初次定位到为网络问题

2. 分析服务A网络

使用 netstat -anp 查看网络情况连接正常

代码语言:javascript复制
netstat -anp命令简单说明:
-a,显示所有
-n,不用别名显示,只用数字显示
-p,显示进程号和进程名

LISTEN 表示正在监听
ESTABLISHED 表示已连接

上面是当前具体的情况, 如果查看历史统计情况可以使用 netstat -s

可以重点关注统计数字展示异常

3. 分析服务B

上面分析的服务A. 看着很正常, 分析服务B看一下。

服务B使用 dmesg 查看发现这条信息

代码语言:javascript复制
possible SYN flooding on port 20880. Sending cookies.
possible SYN flooding on port 20880. Sending cookies.
possible SYN flooding on port 20880. Sending cookies.
possible SYN flooding on port 20880. Sending cookies.
possible SYN flooding on port 20880. Sending cookies.

之前我们文章分析过, 这个报警明显syn_flood攻击.

使用 netstat -s查看 在TpcExt 同样发现了异常数据

代码语言:javascript复制
TcpExt:
	...
	1607 times the listen queue of a socket overflowed
	...

最终文中断定原因为服务B tcp_backlog 溢出, 机器backlog设置过小

代码语言:javascript复制
SYN queue队列长度配置 
/proc/sys/net/ipv4/tcp_max_syn_backlog

Accept queue(ESTABLISHED)队列长度配置
/proc/sys/net/core/somaxconn

tcp_max_syn_backlog是指定所能接受SYN同步包的最大客户端数量,即半连接上限;
somaxconn是指服务端所能accept即处理数据的最大客户端数量,即完成连接上限。

在linux2.2后 SYN_RECEIVED队列的大小由proc/sys/net/ipv4/tcp_max_syn_backlog系统参数指定

ESTABLISHED队列由backlog和/proc/sys/net/core/somaxconn中较小的指定。

dmesg 命令用法

代码语言:javascript复制
dmesg | tail

这里展示的是最近 10 条系统消息日志,如果系统消息没有就不会展示。
主要是看由于性能问题导致的错误。
例如包含了杀死 OOM 问题的进程,丢弃 TCP 请求的问题。

dmesg用来显示内核环缓冲区(kernel-ring buffer)内容,内核将各种消息存放在这里。在系统引导时,内核将与硬件和模块初始化相关的信息填到这个缓冲区中。内核环缓冲区中的消息对于诊断系统问题 通常非常有用。在运行dmesg时,它显示大量信息。通常通过less或grep使用管道查看dmesg的输出,这样可以更容易找到待查信息

0 人点赞