1) 主动探测类工具
iCMP协议探测工具ping
ping工具是基于icmp协议的网络探测工具,通过发送icmp报文来检测网络的连通性与延迟,通常我们都会使用ping来判断网络是否联通,除此以外还有一些其他的用途:
# 通过指定包的大小来测试网络拥塞程度 ▶ ping -s 1000 alibaba-inc.com # 通过发送指定数量的包来测试网络的延迟程度 ▶ ping -c 20 10.1.63.253
在排查网络问题时,ping的主要作用有两个:
● 最常用的功能,使用ping验证端到端的网络层的连通性。
● 在排查偶发延迟问题时,使用ping验证延迟是否发生在网络层以下。
支持多协议的应用层探测工具cURL
curl工具是一个支持许多应用层协议的客户端工具,功能非常多,在网络问题排查中,通常使用curl来判断应用层是否正常工作,在使用curl时,他的常见用法如下:
# 下载远程服务器渲染后的html文件到本地 curl -o thatpage.html http://www.example.com/ # 访问ipv6的远程服务端 curl http://[2001:1890:1112:1::20]/overview.html # 指定访问的域名的方式访问远程服务器 curl -H "Host:" www.server.com
curl在问题排查过程中主要的作用是用于定界问题的边界,通常如果curl可以正常访问,说明用户的问题不涉及网络,主要是用户应用程序的问题。
TCP连接探测工具telnet
telnet是一个基于tcp的用于调试的协议,同时提供了telnet客户端,在排查问题的过程中,通常用于谭政tcp连接是否可靠,是否会中断,他的常见用法如下:
# 访问一个tcp远端,端口为80,不会输入任何信息 telnet www.example.com 80
telnet的curl具有很多相同的作用,包括确认tcp连接的正常等等,但是telnet在问题排查中也具有一些独特的用法,主要原因是telnet仅仅建立tcp连接,并不会和curl一样发送应用层的报文,因此可以用作:
● 验证tcp连接的超时或者应用层的超时设置是否正常生效。
● 模拟长时间不发包的场景,验证连接是否会中断。
2) 当前状态捕获类
网络状态分析工具netstat
netstat工具是net-tools工具集提供的查看网络相关的状态信息的工具,他的数据来源主要是procfs虚拟文件系统,通过解析和聚合网络相关的信息来查看网络状态。
通过以下几个常用的命令可以很快掌握netstat的用法:
# 查看当前netns下的tcp/udp的本地信息,不显示域名 ❯ netstat -tulpn # 查看当前netns下的snmp统计信息 ❯ netstat -s
套接字状态分析工具ss
ss是iproute2工具集提供的查看套接字信息的工具,很大程度上可以取代netstat工具,ss通过netlink机制从内核中获取套接字的当前状态,因此可以获得比netstat更加详实的信息,包括keepalive定时器的剩余时间,tcp套接字的拥塞控制状态以及窗口选择算法等。
通过以下几个常用的命令可以很快掌握ss的用法:
# 获取当前所有存活的tco套接字,其中p参数会额外获取到套接字所属的进程和用户 ss -natp # 查看不同类型的套接字的统计信息 ss -s # 查看不同 ss -mt # 查看所有存货的套接字信息,并且将keepalive定时器信息输出 ss -o
相比于netstat,ss命令是比较全面的提升,主要体现在使用了netlink协议之后在对系统的负载压力方面的减轻以及信息的增多,在排查工作中尽量使用ss命令,尤其是在涉及到tcp keepalive相关的问题的排查中,能够更好的获取到有价值的信息。
句柄占用查找工具lsof
lsof命令用于查找套接字监听相关的进程,通常我们也可以依赖ss命令获取到想用的信息,不过lsof命令的适用范围要远比我们常用的广泛,通过以下几个命令可以比较快的掌握lsof的使用方法:
# 查看当前netns下,tcp的22端口绑定的进程 lsof -i TCP:22 # 查看当前存在的网络连接信息,这里不会显示具体的地址端口信息,但是会有句柄相关的信息 lsof -i
通过lsof,我们可以在排查问题时比较快的找出产生网络干扰的进程。
网络配置查看工具ip
ip命令是iproute2工具集提供的网络配置工具,和ss命令类似的是,ip命令主要依靠netlink协议与底层Linux内核进行通信,ip命令能够很快的获取网络当前的配置,常见的使用方法如下:
# 查看相同netns下的eth0网卡的信息 ip a show dev eth0 # 查找/var/run/netns路径下的具名netns文件并打印,对于containerd,可以查找到所有pod的netns,对于docker,由于其netns具名文件路径在/var/run/docker/netns,因此无法获取到 ip netns ls # 将某个pod中的路由信息输出 ❯ ip netns exec cni-d7108c65-eb71-3294-2b10-e1517eec0a32 ip r default via 10.0.0.23 dev eth0 mtu 1450 10.0.0.23 dev eth0 scope link # 查看某个pod中网络层出方向的路由是否可达 ❯ ip netns exec cni-d7108c65-eb71-3294-2b10-e1517eec0a32 ip r get 10.1.17.192 10.1.17.192 via 10.0.0.23 dev eth0 src 10.0.0.18 uid 0 cache mtu 1450 # 切换netns到指定的pod中,与nsenter功能类似 ip netns exec cni-d7108c65-eb71-3294-2b10-e1517eec0a32 bash # 查看相同netns下的arp表及邻居节点的可达状态 ip neigh
ip命令能够让我们在排查问题时较快的掌握排查的网元的状态信息,尤其是在容器场景,ip命令对netns的适配能够让我们快速在多个pod之间进行切换,提升排查的效率。
实时流量观察工具sar
sar工具是一个sysstat工具集提供的功能强大的性能分析工具,能够对网络流量进行实时的监控和分析,与iftop等工具相比,sar覆盖的范围更广泛,他的主要使用方法如下:
# 观察网卡设备的流量,每隔1s进行采样,一共采样5次 sar -n DEV 1 5 # 查看块设备的io情况,每隔1s采样,持续3次,输出到文件中,这个保存是二进制的 sar -b 1 3 -o blockio.log # 将上面保存的块设备速率文件转换成可读的方式输出到csv文件中 sadf -d blockio.log | sed 's/;/,/g' > blockio.csv # 查看cpu调度队列的情况,用法与其他场景类似 sar -q 1 3