以线上运行的中间件为例,我们一般监控container_network_receive_bytes_total、container_network_transmit_bytes_total、container_network_receive_errors_total、container_network_transmit_errors_total、container_network_receive_packets_dropped_total、container_network_transmit_packets_dropped_total
以上几项。
其中container_network_receive_bytes_total、container_network_transmit_bytes_total、container_network_receive_errors_total
就是网络进出流量,这很好理解。
container_network_transmit_errors_total、container_network_receive_packets_dropped_total、container_network_transmit_packets_dropped_total
这几项到底是怎么取的,如果遇到问题,该怎么排查这个错误。
首先是如何取得这几项:
/proc/<pid>/net/dev
(物理借获取方式也是/proc/net/dev
)这个pid
通过docker top dockerid
可以获得。
那么检测到drop,err
该如何排查。为了解决这个问题,我们先了解一下网络接口。
一般我们都用config
来整体看一下网络接口,这里的信息是很复杂的。它包含网络接口很复杂。
来看一台测试机器:
以上网络接口包含:物理网卡,逻辑网卡,网桥。为了厘清关系,我们先来查看物理网卡:
lspci | egrep -i --color 'network|ethernet’
存在四个物理网卡,分别是em1、em2、em3、em4
。由于em3、em4
关闭,所以只能通过ifconfig -a
来查看。
是否关闭网卡,可以在/etc/sysconfig/network-scripts
中配置。但我们无法从ifconfig -a
中去察觉。
网卡me3
配置,vim ifcfg-em3
ONBOOT=NO
代表启动时,关闭网卡;
TYPE=Ethernet
标识网卡。
网卡em1
配置,vim ifcfg-em1
ONBOOT=YES
代表启动时,开启网卡;
TYPE=Ethernet
标识网卡;
Master=bond0
,bond0
是一个虚拟网卡;
Slave=yes
, 表示角色为从;
em2
配置与em1
相同。
综上em1~em4
都是物理网卡。em1,em2
都是打开的网卡。em3,em4
关闭。我们从em1,em2
的配置中了发现em1,em2
都是bond0
的slave
。
这其实是双网卡设置主备模式:实现当一块网卡宕掉时,另外一块网卡可以自动顶替宕掉的网卡工作,保障网络正常访问。
虚拟网卡bond0
配置:
IPADDR
:网卡是工作在链路层的,提供ip我们就可以在ip层连接这个逻辑网卡。有的程序比如pika就支持配置网络接口,绑定合适的网卡。
ONBOOT=YES
代表启动时,开启逻辑网卡;
miimon
是用来进行链路监测的。比如:miimon
=1000,单位是ms
(毫秒)是1000ms,即是1秒那么系统每100ms监测一次链路连接状态,如果不通就转入其他网卡线路;
mode
共有七种(0~6),这里解释两个常用的选项。
mode
=0:表示load balancing
(round-robin
)为负载均衡方式,两块网卡都在工作。
mode
=1:表示fault-tolerance
(active-backup
)提供冗余功能,工作方式是主备的工作方式,其中一块网卡在工作(若em1
断掉),则自动切换到另一个块网卡(em2
)。
我们的测试机上采用的是第二种模式,也就是主备模式。通过ip
从外部访问,访问的是这个逻辑网卡bond0
,实际对应的是em1
。如果发现drop,err
错误。最终可以定位到em1
,通过ethtool -S em1
来分析。
采用docker
虚拟化的网络环境,这个同以上的物理环境还是有所不同。bond0
进行物理层面的冗余
brige
主要用在KVM
虚拟化环境下的冗余。比如ifconfig
中显示的docker0
其实就是bridge
。
可以通过命令brctl show
查看已经存在的网桥:
Docker
有四种网络模式,默认的就是Bridge
模式。在初始化时,就会创建bridge docker0
。
其中docker0
中的interface
就是docker ps -a
下这三个容器的对应接口。
进入docker b61e56cc73a1
内部查看网络配置:
docker exec -it b61e56cc73a1 /bin/sh
结合本机,bridge模式如图所示:
image.png
所以虚拟化网络环境与逻辑网卡一样,一旦发生drop,err
。最终还是要定位到物理网卡。经过分析,对于这台机器,最终将定位到物理网卡em1
。通过ethtool -S em1
来分析即可。帮我们进一步定位是在网卡,还是驱动,还是内核缓冲的问题(具体见上篇)。
网友评论