Linux丢包问题排查思路

这篇具有很好参考价值的文章主要介绍了Linux丢包问题排查思路。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Linux丢包问题排查思路

判断问题与网络丢包有关

通过抓tcpdump,通过wireshark提示查看数据包状态。比如客户端重传多次失败,服务端提示丢包等错误,均是可能由于丢包导致的异常。

linux网络丢包排查,linux,服务器,网络

丢包可能存在的位置

网络丢包在交互过程中的每一个环节都有可能出现。主要环节如下:

  • 两端服务器:主要表现在网卡异常、服务器资源限制(负载,TCP连接数等)、软件异常、服务器配置等导致的丢包
  • 网络链路(包括链路层、网络层、传输层):主要是TCP/UDP传输过程中出现异常导致,比如:arp表溢出、路由过滤、防火墙拦截、tcp分片重组超时重组异常失败、MTU丢包、限速限流、带宽占满等导致的丢包。
  • 应用层:主要表现在应用在处理socket连接时的异常。

丢包原因分析

网络链路丢包

网络链路的丢包主要通过网络链路的监控、以及客户端抓包数据完整、但服务端收包内容有截取等判断,需要考虑链路中的防火墙等安全设备的影响,首先排除掉安全设备的原因。

我们在实际生产中有遇到过nginx响应请求返回400/499,经分析,存在WAF过滤报文中部分信息、大包未分片导致超过MTU限值的情况。

应用层丢包

应用层丢包主要出现在应用使用线程池化的模式处理请求连接池,当池化不合理导致池满未释放,无法建立新连接时容易出现。

服务器上的丢包情况

接下来着重讨论应该如何在服务器上排查丢包情况。

请求在服务器内部的流程

linux网络丢包排查,linux,服务器,网络

  • 首先网络报文通过物理网线发送到网卡

  • 网络驱动程序会把网络中的报文读出来放到 ring buffer 中,这个过程使用 DMA(Direct Memory Access),不需要 CPU 参与

  • 内核从 ring buffer 中读取报文进行处理,执行 IP 和 TCP/UDP 层的逻辑,最后把报文放到应用程序的 socket buffer 中

  • 应用程序从 socket buffer 中读取报文进行处理

通过如上图,可看出,在每一个环节都有存在丢包的可能性。接下来逐一分析。

网卡、网卡驱动丢包

首先可通过命令查看,是否网卡有丢包。

# ifconfig
#RX(receive 接收报文):packets 正确的数据包数, bytes 数据量字节,errors 产生错误的数据包数,dropped 丢弃的数据包数, overruns 速度过快丢失的数据包数,frame 发生frame错误而丢失的数据包数。
#TX(transmit 发送报文):packets, bytes ,errors,dropped,overruns 与接收一致。carrier 发生carrier错误而丢失的数据包数。collisions 冲突信息包的数目。
[root@gavin ~] ifconfig ens33
ens33: flags=4163<UP ,BROADCAST,RUNNING,IULTICAST> mtu _1500
       inet 192.168.76.3 netmask 255.255.255.0 broadcast 192.168.76.255
       inet6 fe80::3dc2:5ebd:8970:475a prefixlen 64scopeid 0x20<link>
       ether 00:0c:29:d0:ef:9e txqueuelen 1000 (Ethernet)
       RX packets 3001 bytes 3447676(3.2 MiB)
       Rx errors 0 dropped 0 overruns 0 frame 0
       TX packets 949 bytes 62837(61.3 KiB)
       TX errors dropped 0 overruns 0 carrier 0 collisions 0 

#netstat
#netstat -i 打印网卡信息
#Iface:网卡名
#MTU:最大传输单元
#RX-OK:接收时,正确的数据包数
#RX-ERR:接收时,产生错误的数据包数
#RX-DRP:接收时,丢弃的数据包数
#RX-OVR:接收时,由于过速而丢失的数据包数
#TX-OK:发送时,正确的数据包数
#TX-ERR:发送时,产生错误的数据包数
#TX-DRP:发送时,丢弃的数据包数
#TX-OVR:发送时,由于过速而丢失的数据包数
[root@gavin ~]# netstat -i
Kernel Interface table
Iface             MTU    RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR Flg
ens33            1500    14586      0      0 0          7943      0      0      0 BMRU
ens37            1500      400      0      0 0            64      0      0      0 BMRU
lo              65536       50      0      0 0            50      0      0      0 LRU
privbr0          1500      399      0      0 0            64      0      0      0 BMRU
virbr0           1500        0      0      0 0             0      0      0      0 BMU

#netstat -s 统计个协议信息

[root@gavin ~]# netstat -s
Ip:
    Forwarding: 1
    16333 total packets received
    15 with invalid addresses
    0 forwarded
    0 incoming packets discarded
    15955 incoming packets delivered
    9039 requests sent out
    139 dropped because of missing route
Icmp:
    2 ICMP messages received
    0 input ICMP message failed
    ICMP input histogram:
        destination unreachable: 2
    2 ICMP messages sent
    0 ICMP messages failed
    ICMP output histogram:
        destination unreachable: 2
IcmpMsg:
        InType3: 2
        OutType3: 2
Tcp:
    46 active connection openings    
    2 passive connection openings
    28 failed connection attempts
    3 connection resets received
    3 connections established
    15484 segments received
    8871 segments sent out
    0 segments retransmitted
    0 bad segments received
    30 resets sent
Udp:
    251 packets received
    2 packets to unknown port received
    0 packet receive errors
    194 packets sent
    0 receive buffer errors
    0 send buffer errors
    IgnoredMulti: 250
UdpLite:
TcpExt:
    8 TCP sockets finished time wait in fast timer
    17 delayed acks sent
    Quick ack mode was activated 2 times
    15228 packet headers predicted
    24 acknowledgments not containing data payload received
    58 predicted acknowledgments
    2 connections reset due to early user close
    IPReversePathFilter: 304
    TCPRcvCoalesce: 36
    TCPAutoCorking: 4
    TCPOrigDataSent: 89
    TCPDelivered: 105
IpExt:
    InMcastPkts: 141
    OutMcastPkts: 81
    InBcastPkts: 250
    InOctets: 17680346
    OutOctets: 385931
    InMcastOctets: 13407
    OutMcastOctets: 9914
    InBcastOctets: 72750
    InNoECTPkts: 18122
MPTcpExt:

#ethtool
# 有错误说明有丢包
[root@gavin ~]# ethtool -S ens33 | grep rx_ | grep errors
     rx_errors: 0
     rx_length_errors: 0
     rx_over_errors: 0
     rx_crc_errors: 0
     rx_frame_errors: 0
     rx_missed_errors: 0
     rx_long_length_errors: 0
     rx_short_length_errors: 0
     rx_align_errors: 0
     rx_csum_offload_errors: 0


buffer满导致的丢包

主要是ring buffer 和socket buffer满导致的丢包

ring buffer:环形缓冲器,在通信程序中,经常使用环形缓冲器作为数据结构来存放通信中发送和接收的数据。环形缓冲区是一个先进先出的循环缓冲区,可以向通信程序提供对缓冲区的互斥访问。

socket buffer:套接字缓存,Linux网络核心数据结构。它代表一个要发送或处理的报文,并贯穿于整个协议栈。

#查看是否因ring buffer 满导致的丢包
#ethtool 或 /proc/net/dev 
[root@gavin ~]# ethtool -S ens33|grep rx_fifo
[root@gavin ~]# cat /proc/net/dev
Inter-|   Receive                                                |  Transmit
 face |bytes    packets errs drop fifo frame compressed multicast|bytes    packets errs drop fifo colls carrier compressed
    lo:   46780     774    0    0    0     0          0         0    46780     774    0    0    0     0       0          0
 ens33: 18909713   22098    0    0    0     0          0         0   697617    9849    0    0    0     0       0          0
 ens37: 1125961    3788    0    3    0     0          0         0     8591      68    0    0    0     0       0          0
privbr0: 1069444    3768    0    0    0     0          0       635     8363      68    0    0    0     0       0          0
virbr0:       0       0    0    0    0     0          0         0        0       0    0    0    0     0       0          0
virbr0-nic:       0       0    0    0    0     0          0         0        0       0    0    0    0     0       0          0

#查看ring buffer 设置
[root@gavin ~]# ethtool -g ens33
Ring parameters for ens33:
Pre-set maximums:
RX:		4096
RX Mini:	n/a
RX Jumbo:	n/a
TX:		4096
Current hardware settings:
RX:		256
RX Mini:	n/a
RX Jumbo:	n/a
TX:		256

#修改大小
ethtool -G ens33  rx 4096 tx 4096

# socket buffer 丢包一般由于系统高负载,导致 socket buffer占满丢包
#可通过命令判断
[root@gavin ~]# netstat -s | grep "buffer errors"
    0 receive buffer errors
    0 send buffer errors
#socket buffer 调整需要通过修改内核参数的方式
net.ipv4.tcp_wmem
net.ipv4.tcp_rmem
net.ipv4.tcp_mem
net.core.rmem_default
net.core.rmem_max
net.core.wmem_max

服务器TCP连接、连接数限制等导致建连失败丢包

此情况一般是查看TCP连接数和状态,确认服务器最大文件打开数,tcp 线程数限制等。

#统计TCP各连接状态的数量
netstat -an | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

#修改limit 限制、最大文件打开数,最大进程数、最大连接数,针对用户。非针对系统服务的资源
 /etc/security/limits.conf
 # - core - limits the core file size (KB)    限制内核文件的大小。
# - data - max data size (KB)    最大数据大小
# - fsize - maximum filesize (KB)    最大文件大小
# - memlock - max locked-in-memory address space (KB)    最大锁定内存地址空间
# - nofile - max number of open file descriptors 最大打开的文件数(以文件描叙符,file descripter计数) 
# - rss - max resident set size (KB) 最大持久设置大小
# - stack - max stack size (KB) 最大栈大小
# - cpu - max CPU time (MIN)    最多CPU占用时间,单位为MIN分钟
# - nproc - max number of processes 进程的最大数目
# - as - address space limit (KB) 地址空间限制 
# - maxlogins - max number of logins for this user    此用户允许登录的最大数目
# - maxsyslogins - max number of logins on the system    系统最大同时在线用户数
# - priority - the priority to run user process with    运行用户进程的优先级
# - locks - max number of file locks the user can hold    用户可以持有的文件锁的最大数量
# - sigpending - max number of pending signals
# - msgqueue - max memory used by POSIX message queues (bytes)
# - nice - max nice priority allowed to raise to values: [-20, 19] max nice优先级允许提升到值

 
 #设置内核最大的文件句柄数
/proc/sys/fs/file-max  

#设置进程最大的文件句柄数,不能超过1
/proc/sys/fs/nr_open  
时间戳和TCP连接复用配置导致的连接丢包

主要是 tcp_tw_recycle,tcp_timestamps造成的影响。

  • net.ipv4.tcp_tw_recycle:用于快速回收处于TIME_WAIT 状态的socket 连接;(通常在开启net.ipv4.tcp_timestamps 时有效,1代表开启,0代表关闭)

  • net.ipv4.tcp_timestamps:启用时间戳,默认缺省值为1,开启;该值必须为单调递增,否则接受到的包可能会被丢掉。

TCP协议中有一种机制,缓存了每个主机(即ip)过来的连接最新的timestamp值。这个缓存的值可以用于PAWS(Protect Against Wrapped Sequence numbers,是一个简单的防止重复报文的机制)中,来丢弃当前连接中可能的旧的重复报文。在tcp_tw_recycle/tcp_timestamps都开启的条件下,60s内同一源ip主机的tcp 链接请求中的timestamp必须是递增的。

这两个值开启与否需要根据实际情况进行判断,我们在生产中曾经遇到过未开启而导致三次握手中最后一次握手丢包的情况,也存在开启后,导致第一次握手无应答的情况。文章来源地址https://www.toymoban.com/news/detail-610726.html

到了这里,关于Linux丢包问题排查思路的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 深入分析 Linux 网络丢包问题

    深入分析 Linux 网络丢包问题

    热门IT课程【视频教程】-华为/思科/红帽/oracle https://xmws-it.blog.csdn.net/article/details/134398330 所谓丢包,是指在网络数据的收发过程中,由于种种原因,数据包还没传输到应用程序中,就被丢弃了。这些被丢弃包的数量,除以总的传输包数,也就是我们常说的丢包率。丢包率是网

    2024年01月23日
    浏览(9)
  • (六)关于Linux中服务器磁盘爆满问题的几个解决思路

    (六)关于Linux中服务器磁盘爆满问题的几个解决思路

    在监控服务器性能的时候,发现服务器的磁盘占用很大,几乎快要爆满,具体的表现可能如下: 1、应用服务访问卡顿甚至失败; 2、数据库访问失败; 3、文件上传失败 等等 通过命令 df -h 查看磁盘占用情况,发现如下: 这里的占用是清除过的,所以并不算特别高。 这种现

    2024年02月04日
    浏览(12)
  • linux主机宕机排查问题方法
1 排查思路

    linux主机宕机排查问题方法 1 排查思路

    1.1 查看宕机的时间记录和历史登陆还有重启时间 1)查看历史重启 2)查看历史异常登录用户 1.2 首先查看系统日志 linux下的/var/log/下的log日志,包括message,内核报错日志demsg等等,sa记录,是记录cpu,内存等运行的性能文件,记录着运行时的cpu的运行状态等。 1)利用sa文件

    2024年02月16日
    浏览(13)
  • 【Linux技术专题】「夯实基本功系列」带你一同学习和实践操作Linux服务器必学的Shell指令(排查问题指令 - 上)

    【Linux技术专题】「夯实基本功系列」带你一同学习和实践操作Linux服务器必学的Shell指令(排查问题指令 - 上)

    在线上排查问题时,查询日志、查看系统配置和分析操作系统信息是至关重要的。这些操作可以帮助我们深入了解软件和服务的兼容性,并解决潜在的问题。在本次学习中,我们将介绍并深入学习一些我在处理类似问题时常用的指令。通过掌握这些指令,你将能够更加高效地

    2024年01月16日
    浏览(21)
  • Linux服务器配置SSH免密码登录后,登录仍提示输入密码(一次真实的问题排查解决记录)

    Linux服务器配置SSH免密码登录后,登录仍提示输入密码(一次真实的问题排查解决记录)

    我们知道两台Linux服务器机器之间如果使用ssh命令登录或scp/rsync命令传输文件每一次都需要输入用户名相对应的密码,如果要免密码,则需要对两台Linux服务器机器之间进行SSH互信。 虽然这是废话,也希望大家了解一下。 SSH(Secure Shell)是一种安全的传输协议,它可以让Lin

    2024年02月09日
    浏览(15)
  • Linux系统中负载高问题排查思路与解决方法

    Load 是对计算机干活多少的度量,Load Average 是一段时间(1分钟、5分钟、15分钟)内平均Load。 一、Load分析: 情况1:CPU高、Load高 通过top命令查找占用CPU最高的进程PID; 通过top -Hp PID查找占用CPU最高的线程TID; 对于java程序,使用jstack打印线程堆栈信息(可联系业务进行排查定

    2024年02月16日
    浏览(8)
  • Linux系统CPU占用率较高问题排查思路

    Linux系统CPU占用率较高问题排查思路

    作为工程师,在日常工作中我们会遇到 Linux服务器上出现CPU负载达到100%居高不下的情况,如果CPU 持续跑高,则会影响业务系统的正常运行,带来企业损失。 对于CPU过载问题通常使用以下两种方式即可快速定位: 方法一 第一步:使用 top命令,然后按shift+p按照CPU排序 找到占

    2024年02月07日
    浏览(7)
  • 【博客573】linux内核层丢包排查方法汇总

    命令1: ifconfig xxx 解析: RX errors: 表示总的收包的错误数量,这包括 too-long-frames 错误,Ring Buffer 溢出错误,crc 校验错误,帧同步错误,fifo overruns 以及 missed pkg 等等。 RX dropped: 表示数据包已经进入了 Ring Buffer,但是由于内存不够等系统原因,导致在拷贝到内存的过程中被丢

    2024年02月16日
    浏览(9)
  • Linux开机rc.local不自启动执行脚本问题的排查思路及问题解决

    Linux开机rc.local不自启动执行脚本问题的排查思路及问题解决

    问题 Linux系统中,在rc.local里面配置的启动命令等不能能够在开机的时候进行自启动 问题解决 解决问题排查中最大的麻烦,需要进行reboot重启 查看rc-local的运行状态 systemctl status rc-local 如果是loaded或者是faild类似,说明启动确实出现了问题 首先查看检查是否还有rc.local的软连

    2024年02月16日
    浏览(11)
  • 一文解决ethtool 原理介绍和解决网卡丢包排查思路

    一文解决ethtool 原理介绍和解决网卡丢包排查思路

    之前记录过处理因为 LVS 网卡流量负载过高导致软中断发生丢包的问题, RPS 和 RFS 网卡多队列性能调优实践 [1],对一般人来说压力不大的情况下其实碰见的概率并不高。这次想分享的话题是比较常见服务器网卡丢包现象排查思路,如果你是想了解点对点的丢包解决思路涉及面

    2023年04月18日
    浏览(9)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包