Linux 丢包分析可能的原因分析

有很多情况都会导致linux将报文丢弃。学习了一些常见的场景,作为知识储备。

负载过大导致的的丢包

流量监控(每秒出入多少个报文(PPS))
1)sar工具
yum install sysstat
sar -n DEV 1 1000
表示监控所有设备接收报文和发送报文的情况。时间间隔为1S,重复1000次。

2)脚本

#!/bin/bash
##name :PPS.sh
####
#example: sh PPS.sh 10 
####
INTERVAL="1"  # update interval in seconds
if [ "$1" != "" ]
then
    INTERVAL=$1
fi

 
while true
do
    R1=$(cat /sys/devices/virtual/net/venet0/statistics/rx_packets)
    T1=$(cat /sys/devices/virtual/net/venet0/statistics/tx_packets)
    sleep $INTERVAL
    R2=$(cat /sys/devices/virtual/net/venet0/statistics/rx_packets)
    T2=$(cat /sys/devices/virtual/net/venet0/statistics/tx_packets)
    
    RX_TOTAL=$((T2 - T1))
    TX_TOTAL=$((R2 - R1))
    
    #
    TXPPS=$(( RX_TOTAL/ INTERVAL))
    RXPPS=$(( TX_TOTAL/ INTERVAL))
    echo "TXPPS: $TXPPS   RXPPS: $RXPPS" | tee /tmp/pps.log
done

可以通过find命令来查找文件位置:
find / -name rx_pakcets

但是,一般的虚拟机PPS达到多少才能认为负载非常大?没啥概念。
网上看到有说服务器正常工作时可能也才几万。100万可能是单核linux机器的极限。
自己没跑任何业务的小机器上,PPS一般都在个位数。

rp_filter

这个是我目前遇到过最多的情况了。
现象表现为tcpdump可以抓到包,但是应用程序却无法收到。
rp_filter的意思是反向路径校验。
rp_filter - INTEGER
0 - No source validation.
1 - Strict mode as defined in RFC3704 Strict Reverse Path
Each incoming packet is tested against the FIB and if the interface is not the best reverse path the packet check will fail. By default failed packets are discarded.
2 - Loose mode as defined in RFC3704 Loose Reverse Path
Each incoming packet’s source address is also tested against the FIB and if the source address is not reachable via any interface the packet check will fail.

Current recommended practice in RFC3704 is to enable strict mode to prevent IP spoofing from DDos attacks. If using asymmetric routing or other complicated routing, then loose mode is recommended.

The max value from conf/{all,interface}/rp_filter is used when doing source validation on the {interface}.
Default value is 0. Note that some distributions enable it in startup scripts.

只有在多网卡的机器上才可能出现这个问题。

因为rp_filter校验不通过被丢弃的报文的数量,可以通过netstat -s | grep -i IPReversePathFilter 查看。
发现在suse上有这个统计项,centos上没有。

可以通过设置net.ipv4.conf.all.log_martians=1, 然后在操作系统日志/var/log/messages中查看到对应信息:
martian source 222.73.xxx.255 from 222.73.xxx.173, on dev eth1
ll header: ff:ff:ff:ff:ff:ff:00:15:17:13:33:66:08:00
以上日志表示:
222.73.xxx.255 目的ip
222.73.xxx.173 源ip
eth1 接收到报文的网卡
ff:ff:ff:ff:ff:ff 源mac
15:17:13:33:66 目的mac
08:00 上层协议号(0800 IPv4, 08dd IPv6, 0806 arp packet)

但是需要注意的是除了rp_filter校验不通过之外,源地址全0等其他情况也会导致会出现火星包日志。

参考:
https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt

3

你可能感兴趣的:(linux)