时下各种分布式架构服务应用大行其道,微服务部署成为大多数WEB服务的标配。
所谓的分布式架构就是把服务做拆分,在我们的传统单体架构中,我们把所有的服务都写在一起,随着业务的扩大我们的代码耦合度会变得越来越高,后期维护起来也很不方便。微服务就是把模块拆分,把我们整个项目拆解分成许多独立的子项目,每个子项目之间独立开发和部署,子项目也有自己独立的功能,这些独立的子项目就形成了微服务,不同的子项目就进而形成一个服务集群。
一次工作中遇到有人反馈说我们线上的某应用出现服务不稳定的情况,绝大部分时候都正常,只有
极少数情况下会出现连接时断时续的情况。
后面经过服务监控与日志分析发现了其中一台节点存在问题。检查发现是该节点网络存在断开或掉包的情况。经过一系列各种排查发现问题在于网线。表面看网线、水晶头做的很好,没问题。
问题其实是网卡的传输速度和双工模式,双工模式不表,主要是速率,我们强制关闭掉网卡的AUTO自动侦测速度,给网卡强制降速在一个固定速度运行。
事实上,是我们发现网线的质量不是很高,没有屏蔽层,铜线较细,铜线线材可能含有杂质,造成信号传递时抗干扰能力弱,而且信号质量较差,而这种情况下出现的网络卡慢、及频繁断开问题,并非是网络完全不通,而是网络在传输过程中频繁的自动切换速率,如果千兆降为百兆的速度运行吧,信号质量又不够,速度极慢还容易断开,然后又自动降速,造成了在使用中的各种频繁断开,或者极为缓慢的情况。
我们的网线较长有20多米,还是那种没有屏蔽层 传递时抗干扰能力就很弱容易出现异常。虽然我们临时改为强制降速固定速度运行,但最好尽快换成带有屏蔽层的.优质线材保证信号质量!
排查过程中我们使用到了今天的主角也是针对网络和系统管理员的必备利器,它就是netstat。
netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics),masquerade 连接,多播成员 (Multicast Memberships) 等等。
一般用于检验本机各端口的网络连接情况。netstat是在内核中访问网络及相关信息的程序,它能提供TCP连接,TCP和UDP监听,进程内存管理的相关报告。
netstat命令的一般格式:
netstat [1][-a][-e][-n][-o][-p Protocol][-r][-s][Interval]
netstat [参数选项]
-a或–all:显示所有连线中的Socket,默认不显示LISTEN相关;
-A<网络类型>或–<网络类型>:列出该网络类型连线中的相关地址;
-c或–continuous:每隔一个固定时间,执行该netstat命令。
-C或–cache:显示路由器配置的快取信息;
-e或–extend:显示网络其他相关信息;
-F或–fib:显示FIB;
-g或–groups:显示多重广播功能群组组员名单;
-h或–help:在线帮助;
-i或–interfaces:显示网络界面信息表单;
-l或–listening:显示监控中的服务器的Socket;
-M或–masquerade:显示伪装的网络连线;
-n或–numeric:直接使用ip地址,而不通过域名服务器;
-N或–netlink或–symbolic:显示网络硬件外围设备的符号连接名称;
-o或–timers:显示计时器;
-p或–programs:显示正在使用Socket的程序识别码和程序名称;
-r或–route:显示Routing Table;
-s或–statistice:显示网络工作信息统计表;
-t或–tcp:显示TCP传输协议的连线状况;
-u或–udp:显示UDP传输协议的连线状况;
-v或–verbose:显示指令执行过程;
-V或–version:显示版本信息;
-w或–raw:显示RAW传输协议的连线状况;
-x或–unix:此参数的效果和指定”-A unix”参数相同; –ip或–inet:此参数的效果和指定”-A inet”参数相同。
从输出的整体上看,netstat的输出结果可以分为两个部分:
就是我们常说的连接状态。
在原模式中没有状态,在用户数据报协议中也经常没有状态,于是状态列可以空出来。
若有状态,通常取值为:
LISTEN: 侦听来自远方的TCP端口的连接请求
SYN-SENT: 在发送连接请求后等待匹配的连接请求
SYN-RECEIVED : 在收到和发送一个连接请求后等待对方对连接请求的确认
ESTABLISHED: 代表一个打开的连接
FIN-WAIT-1: 等待远程TCP连接中断请求,或先前的连接中断请求的确认
FIN-WAIT-2: 从远程TCP等待连接中断请求
CLOSE-WAIT:等待从本地用户发来的连接中断请求
CLOSING: 等待远程TCP对连接中断的确认
LAST-ACK: 等待原来的发向远程TCP的连接中断请求的确认
TIME-WAIT: 等待足够的时间以确保远程TCP接收到连接中断请求的确认
CLOSED:没有任何连接状态
在 netstat 输出中显示 PID 和进程名称 netstat -p
netstat -p 与其它参数一起使用就可以添加 “PID/进程名称” 到 netstat 输出中,这样 debugging 的时候可以很方便的发现特定端口运行的程序。
netstat -pt
当你不想让主机,端口和用户名显示,使用 netstat -n。将会使用数字代替那些名称。
netstat -an
netstat -c将每隔一秒输出网络信息。
netstat -interval 隔interval秒显示一次,ctrl+c结束。
使用netstat -rn显示数字格式,不查询主机名称。
netstat -i
并不是所有的进程都能找到,没有权限的会不显示,使用 root 权限查看所有的信息。
netstat -an | grep ‘:80’
netstat -tunlp | grep 80 | awk ‘{print $7}’ | cut -d/ -f1
netstat -o 可以与-a -n -p联合使用
查看连接某服务端口最多的的IP地址
netstat -nat | grep "27.158.127.108:8327" |awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -nr|head -25
netstat -nat |awk '{print $6}' 或 netstat -n | awk '/^tcp/{++S[$NF]}END{for(i in S) print i,S[i]}'
netstat -nat |awk ‘{print $6}’|sort|uniq -c
最后的命令如下:
netstat -nat |awk ‘{print $6}’|sort|uniq -c|sort -rn
如果你的计算机有时候接收到的数据包导致出错数据或故障,你不必感到奇怪,TCP/IP可以容许这些类型的错误,并能够自动重发数据包。但如果累计的出错情况数目占到所接收的IP数据报相当大的百分比,或者它的数目正迅速增加,那么你就应该使用netstat查一查为什么会出现这些情况了。