一直使用 Netdata 来作为 VPS 的监控,配合 Netdata Cloud 来作为监控面板体验一直都不错。不过最近有一台机器经常发送邮件告警:
outbound_packets_dropped_ratio
看这个告警一头雾水,虽然每个词都懂,但就是不知道表示的什么含义。所以搜罗各种资料学习一下。
什么是 outbound packets dropped ratio
详细的解释 Netdata 也给了出来:
Details: ratio of outbound dropped packets for the network interface venet0 over the last 10 minutes
过去 10 分钟内网卡 venet0 出站的流量丢包率。
那具体什么是 dropped packets 呢?在 Linux 下有很多原因会出现丢包,有可能是网络不稳提,或者网络拥堵,或者应用无法处理负载。
Linux 下显示网络接口的 dropped packet
❯ sudo netstat -i
Kernel Interface table
Iface MTU RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg
br-c834d 1500 7024713 0 0 0 5439423 0 0 0 BMU
br-f28aa 1500 446015 0 0 0 7656772 0 0 0 BMRU
br-f50ea 1500 5779300 0 0 0 6093954 0 0 0 BMRU
docker0 1500 0 0 0 0 0 0 0 0 BMU
lo 65536 38808638 0 0 0 38808638 0 0 0 LRU
venet0 1500 78213871 0 0 0 114697804 0 25737 0 BOPRU
venet0:0 1500 - no statistics available - BOPRU
vethd37c 1500 151555 0 0 0 209478 0 0 0 BMRU
vethe8b7 1500 8254 0 0 0 134561 0 0 0 BMRU
可以看到图中 venet0
这块网卡在 TX-DRP
上确实是有一定的丢包。
显示网卡的统计信息:
netstat -s
# 显示 tcp
netstat -s -t
# 显示 udp
netstat -s -u
netstat -s
的结果
Ip:
Forwarding: 1 //开启转发
31 total packets received //总收包数
0 forwarded //转发包数
0 incoming packets discarded //接收丢包数
25 incoming packets delivered //接收的数据包数
15 requests sent out //发出的数据包数
Icmp:
0 ICMP messages received //收到的ICMP包数
0 input ICMP message failed //收到ICMP失败数
ICMP input histogram:
0 ICMP messages sent //ICMP发送数
0 ICMP messages failed //ICMP失败数
ICMP output histogram:
Tcp:
0 active connection openings //主动连接数
0 passive connection openings //被动连接数
11 failed connection attempts //失败连接尝试数
0 connection resets received //接收的连接重置数
0 connections established //建立连接数
25 segments received //已接收报文数
21 segments sent out //已发送报文数
4 segments retransmitted //重传报文数
0 bad segments received //错误报文数
0 resets sent //发出的连接重置数
Udp:
0 packets received
...
TcpExt:
11 resets received for embryonic SYN_RECV sockets //半连接重置数
0 packet headers predicted
TCPTimeouts: 7 //超时数
TCPSynRetrans: 4 //SYN重传数
或者可以使用 ip
命令:
❯ ip -s link show venet0
2: venet0: <BROADCAST,POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN mode DEFAULT group default
link/void
RX: bytes packets errors dropped overrun mcast
30619319736 78217051 0 0 0 0
TX: bytes packets errors dropped carrier collsns
32292008558 114701118 0 25738 0 0
Why does linux drop packets?
为了找出 Linux 服务器为什么 drop packets 可以借助 dropwatch。这个工具可以用来诊断 Linux networking stack 的问题,主要是查看协议栈丢包问题。
dropwatch
安装必要的工具:
sudo apt-get install libpcap-dev libnl-3-dev libnl-genl-3-dev binutils-dev libreadline6-dev autoconf libtool pkg-config build-essential
安装完之后执行 libtoolize
,这会拷贝,连接必要的脚本,包括 ltmain.sh
。
然后手动编译:
git clone https://github.com/nhorman/dropwatch
cd dropwatch
./autogen.sh
./configure
make
make install
如何修改告警策略
因为我是用 docker 安装,所以需要进入 netdata 容器:
docker exec -it netdata /bin/sh
然后执行:
/etc/netdata/edit-config health.d/net.conf
其中的第 107 行即可。