如何排查网卡丢包及ping延迟等网络问题?
摘要:引言 在运维过程中,出现网络问题是非常棘手的,当访问某服务出现时通时不通的情况时,我们应该如何排查?是不是网卡配置有问题?是不是内核参数有问题?是多网卡吗?有没有做bond?复杂的网络环境经常搞得人晕头转向,本文就列举笔者运维中遇到过的典型
引言
在运维过程中,出现网络问题是非常棘手的,当访问某服务出现时通时不通的情况时,我们应该如何排查?是不是网卡配置有问题?是不是内核参数有问题?是多网卡吗?有没有做bond?复杂的网络环境经常搞得人晕头转向,本文就列举笔者运维中遇到过的典型的的网络问题现象,来记录一下其排查的思路和步骤。
问题现象
服务器丢包、网络时断时续、Ping时响应时间忽快忽慢、网卡接收流量正常返回流量失败等网络问题,都可以使用以下通用的排查步骤,再结合自身环境的情况,逐一排查怀疑点,最终定位问题所在。
排查工具及案例分析
我们首先搞清楚数据包从网卡接收,一直到应用程序收到,其中间都发生了什么?
基本流程如下:
数据包进入网卡 --> 网卡硬件缓存FIFO --> 驱动缓冲区(Ring Buffer) ---> 协议栈处理缓冲区(sk_buff) --> 传输层缓冲区(TCP/UDP接收窗口) --> Socket接收队列 --> 用户态应用缓冲(应用程序)
大致流程图如下:
数据到达网卡后,会先存在网卡硬件缓存FIFO,然后通过DMA传输到Ring Buffer指向的skb数据缓冲区(用于存储网络数据包的结构体,包含了数据包的内容和元信息),也就是sk_buff。之后触发cpu硬中断。然后是协议栈(TCP/IP)的处理,内核从Ring Buffer中取出skb,调整指针,发送至传输层缓冲区。然后发送至socket接收缓冲区。最后用户态的应用程序调用recv()将数据包取出。
排查工具介绍
网卡层面排查工具
通过ifconfig查看
# ifconfig em1
em1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.30.210.199 netmask 255.255.255.0 broadcast 172.30.210.255
inet6 fe80::7693:5725:5504:e974 prefixlen 64 scopeid 0x20<link>
ether 1c:83:41:93:20:46 txqueuelen 1000 (Ethernet)
RX packets 271922 bytes 29995005 (28.6 MiB)
RX errors 0 dropped 3396 overruns 0 frame 0
TX packets 325387 bytes 132126535 (126.0 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
device interrupt 94
RX(receive)表示接收报文,TX(transmit)表示发送报文。
对于接收数据,重点需要关注errors、dropped和overruns三个参数值的大小:
RX errors:表示总的收包的错误数量,这包括too-long-frames错误,Ring Buffer溢出错误,crc校验错误,帧同步错误,FIFO overruns以及missed pkg等等。
RX dropped:表示数据包已经进入了Ring Buffer,但是由于内存不够等系统原因,导致在拷贝到内存的过程中被丢弃。
