0

0

如何在Linux中排查网络拥塞?

舞夢輝影

舞夢輝影

发布时间:2025-09-23 12:44:01

|

837人浏览过

|

来源于php中文网

原创

答案:排查Linux网络拥塞需先定位瓶颈,依次检查系统资源、网卡状态、网络链路。通过ping、mtr测试连通性与路径延迟,用top、free、iostat分析CPU、内存、磁盘负载,利用ip -s、ethtool、netstat -s查看网卡错误与TCP重传,iftop、nload监控带宽占用,ss命令检查连接队列,tcpdump抓包分析传输细节,结合sysctl调优TCP参数,最后通过dmesg和日志排查硬件或驱动问题。若本地无异常,则借助mtr判断外部链路丢包点,联系ISP解决。整个过程从内到外,逐层剥离,精准定位性能瓶颈。

如何在linux中排查网络拥塞?

在Linux环境下排查网络拥塞,核心思路就是定位瓶颈:是你的机器资源不足,网卡层面有问题,还是网络链路本身出了状况?通常,我们会从本地系统表现入手,逐步向外围网络链路延伸,通过一系列工具和观察,找出那个拖慢速度的罪魁祸首。

解决方案

当你的Linux系统感觉网络卡顿、响应迟缓时,可以按照以下步骤进行排查:

  1. 初步判断与连通性测试:

    • ping <目标IP或域名>:最直接的测试,看是否有丢包和延迟。如果ping本地网关(ip route | grep default 找到的IP)都有问题,那很可能是本地网络配置或硬件故障。
    • traceroute <目标IP或域名>mtr <目标IP或域名>mtrpingtraceroute 的结合体,能实时显示数据包在每个跳点(hop)的延迟和丢包情况,这对于判断问题出在哪个网络节点上至关重要。
  2. 检查本地系统资源:

    • tophtop:看看CPU、内存使用率。如果某个进程CPU占用过高,或者系统在大量使用交换空间(Swap),可能会间接影响网络性能,因为系统整体响应变慢了。
    • free -h:确认内存使用情况。
    • iostat -x 1:检查磁盘I/O。高磁盘I/O可能导致应用程序无法及时处理网络数据。
  3. 检查网络接口统计:

    • ip -s link show <interface_name> (或 ifconfig <interface_name>):查看网卡发送/接收的错误包(errors)、丢弃包(dropped)数量。这些数字如果持续增长,说明网卡驱动、硬件或上层协议可能存在问题。
    • ethtool -S <interface_name>:提供更详细的网卡统计信息,比如校验和错误、缓冲区溢出等,这些往往能指向硬件层面的问题。
    • netstat -s:查看TCP/UDP协议栈的全局统计,比如TCP重传段(retransSegs)、接收/发送队列溢出等。高重传率是网络拥塞的明确信号。
  4. 监控实时带宽使用:

    • iftop -i <interface_name>:实时显示哪个IP地址或端口正在占用你的带宽,非常直观。
    • nloadvnstat:提供更简单的实时带宽使用概览。
    • sar -n DEV 1:系统活动报告工具,可以历史性地查看网卡流量、错误等。
  5. 分析TCP连接状态和套接字信息:

    • ss -s:显示套接字(socket)的汇总统计,包括TCP连接数、各种状态的连接数量。
    • ss -natp (或 netstat -natp):列出所有TCP连接,关注 Recv-Q (接收队列) 和 Send-Q (发送队列)。如果这些队列持续堆积大量数据,可能意味着应用程序处理慢,或者网络拥塞导致数据发送不出去/接收不进来。
    • ss -i:查看TCP连接的详细信息,包括拥塞控制算法、往返时间(RTT)、重传次数、发送/接收窗口大小(wscale)。过小的窗口或频繁重传都是拥塞的迹象。
  6. 深入数据包层面:

    • tcpdump -i <interface_name> host <目标IP> -n:抓取特定流量的数据包。通过分析抓到的包,可以观察TCP握手、数据传输、重传(标记为 [R])、窗口更新等,从而更精确地诊断问题。比如,如果看到大量重传,且接收窗口一直很小,可能是接收端处理不过来。
  7. 检查系统网络参数:

    • sysctl -a | grep net.ipv4.tcp_:查看TCP相关的内核参数,比如TCP缓冲区大小 (tcp_rmem, tcp_wmem)、拥塞控制算法 (tcp_congestion_control)。不合理的参数设置有时也会导致性能瓶颈
  8. 查看系统日志:

    • dmesg:检查内核消息,看是否有网卡驱动错误、硬件中断问题等。
    • /var/log/syslogjournalctl -xe:系统日志中可能会有网络服务相关的错误信息。

为什么我的网络突然变慢了?

网络突然变慢,这事儿太常见了,原因真是五花八门,有时候我都觉得像是“网络玄学”。不过,从我自己的经验来看,大致可以归结为几类。最直接的,可能是你的机器本身出了问题,比如某个程序突然开始狂吃CPU,或者内存不够用了,系统开始频繁地进行硬盘交换,这都会拖慢整个系统的响应,自然也包括网络请求。我遇到过一次,一个开发中的服务代码写得不够严谨,内存泄漏严重,直接把服务器拖垮了,网络自然也就“慢如蜗牛”了。

再者,就是你的网卡或者网络驱动层面的问题。比如网卡物理故障,或者驱动程序不兼容、bug导致数据包处理效率低下,甚至直接丢包。这些在 dmesg 或者 ip -s link 的错误统计里能找到端倪。

当然,更多时候,问题出在你的机器之外。可能是你的局域网里有“带宽杀手”,比如有人在下载大文件、看高清视频,或者有设备在进行大量的数据同步。我见过一个案例,公司的备份服务器在夜间开始全量备份,直接把内网带宽占满了,第二天早上大家上班都抱怨网络慢。再往外,就是路由器、交换机过载,或者你的ISP(互联网服务提供商)网络链路拥塞,甚至目标服务器本身响应慢。所以,判断问题在哪,就像是剥洋葱,得一层层来。

百宝箱
百宝箱

百宝箱是支付宝推出的一站式AI原生应用开发平台,无需任何代码基础,只需三步即可完成AI应用的创建与发布。

下载

如何判断是本地问题还是网络链路问题?

区分本地问题和网络链路问题,是排查网络拥塞的关键一步,也是我个人最先会做的事情。这就像医生问诊,得先确定病灶是在体内还是体外。

首先,用 pingmtr 来做初步判断。

  • 本地问题:

    • ping 127.0.0.1:这是你的回环地址,如果ping这里都出现高延迟或丢包,那几乎可以肯定问题出在你机器内部,跟网卡驱动、TCP/IP协议栈、系统资源耗尽等有关。
    • ping <你的本地网关IP>:如果你ping本地网关(通常是你的路由器IP)也出现高延迟或丢包,但ping 127.0.0.1 正常,那问题可能在你的网卡、网线,或者你的机器到路由器的这一小段局域网链路。这时候我会检查网线有没有松动,或者用 ip -s link 看看网卡有没有大量的错误包。
    • 同时,观察 topfree -hiostat 等命令,看是否有资源瓶颈。如果CPU、内存、磁盘I/O任何一个飙高,都可能间接导致网络变慢,因为系统没法及时处理网络数据了。
  • 网络链路问题:

    • 如果你ping本地网关正常,但ping一个外部的可靠IP(比如Google的DNS 8.8.8.8)出现高延迟或丢包,那么问题就很有可能在你的本地网络之外了。
    • 这时候 mtr <外部IP> 就成了你的“神探”。mtr 会显示数据包从你的机器到目标IP路径上每一个跳点的延迟和丢包情况。
      • 如果丢包或高延迟从你的网关开始出现,那可能是你的路由器过载,或者ISP给你的出口带宽不足。
      • 如果问题出现在中间某个跳点,那通常就是ISP或者更上游的网络运营商的问题了。我通常会截取 mtr 的结果,然后联系ISP客服,让他们帮忙排查。
    • 另外,用 iftop 看看你的网卡带宽是否已经被跑满了。如果本地网卡流量已经达到上限,即使 mtr 看起来没丢包,你也会感觉网络很慢,这通常是你自己的应用或设备在大量消耗带宽。

通过这些步骤,你就能比较清晰地界定问题是“近在咫尺”还是“远在天边”了。

TCP重传和丢包意味着什么?我该怎么处理?

TCP重传和丢包,这两个词一出来,就说明网络肯定“病”得不轻了。它们是网络拥塞最直接、最核心的症状。

TCP重传 (TCP Retransmissions): 这指的是发送方发送了一个TCP数据包,但没有在预期的超时时间内收到接收方的确认(ACK),于是发送方会认为这个数据包丢失了,然后再次发送这个数据包。

  • 意味着什么? 意味着数据包在网络传输过程中很可能丢失了,或者传输延迟太高导致超时,迫使发送方重复劳动。每一次重传都意味着无效的带宽占用和额外的延迟,直接导致有效吞吐量下降。想象一下,你寄快递,快递员送了一次没到,还得再送一次,效率肯定就低了。
  • 可能原因:
    1. 实际丢包: 最常见的原因,网络路径上的路由器、交换机因拥塞而丢弃数据包。
    2. 高延迟: 网络延迟太高,ACK包没能在发送方超时前返回。
    3. 接收方问题: 接收方的TCP缓冲区满了,无法接收新数据,或者接收方处理速度慢,导致ACK延迟。

丢包 (Packet Loss): 这个就更直接了,就是数据包根本没能到达目的地。

  • 意味着什么? 这是网络拥塞最直接的体现。网络设备负载过高,缓冲区溢出,或者链路质量差(比如无线信号干扰、网线故障),都会导致数据包被直接丢弃。丢包率高了,TCP层就会频繁重传,UDP应用则会直接丢失数据。

我该怎么处理?

  1. 定位丢包源头:

    • mtr <目标IP>:这是你的首选工具。仔细观察 mtr 的输出,它会清楚地显示在哪个跳点开始出现丢包。如果丢包从你的网关开始,那问题可能在你家路由器或ISP。如果是在更远的跳点,那通常是ISP或骨干网的问题。
    • ip -s link show <interface_name>:检查你的本地网卡统计,rx_droppedtx_dropped 如果持续增长,说明你的网卡或驱动程序可能存在问题,或者系统无法及时处理进出的数据包。
    • netstat -s:关注 retransSegs (TCP重传段)和 inDiscards (接收丢弃)。这些数值过高都指向本地协议栈或网卡层面的问题。
  2. 优化本地TCP参数:

    • 如果发现本地重传率高,且 ss -i 显示发送/接收窗口过小,可以考虑调整内核参数。sysctl -a | grep net.ipv4.tcp_ 可以看到当前设置。
    • net.ipv4.tcp_rmemnet.ipv4.tcp_wmem 控制TCP接收和发送缓冲区的大小。在高速、高延迟网络中,适当增大这些值(例如 sysctl -w net.ipv4.tcp_rmem="4096 87380 67108864")有时能改善性能,减少重传。但也要注意,过大的缓冲区会占用更多内存。
    • net.ipv4.tcp_congestion_control:Linux有多种拥塞控制算法(如 Cubic, BBR)。BBR在某些场景下(尤其是高延迟、高带宽链路)表现更好。可以尝试切换 (sysctl -w net.ipv4.tcp_congestion_control=bbr)。
  3. 检查应用层:

    • 有时候,重传不是网络真的丢包,而是应用程序处理数据太慢,导致接收缓冲区满,系统不得不丢弃新到达的数据包。用 ss -natp 观察 Recv-QSend-Q,如果它们持续堆积,可能就是应用层的问题。
  4. 联系ISP或网络管理员:

    • 如果 mtr 明确指出问题出在你的ISP或更上游的网络设备上,那你就需要联系他们,提供你的 mtr 结果和详细描述,让他们进行排查和处理。这是最直接也最有效的办法,毕竟你无法控制他们的网络设备。

处理TCP重传和丢包,就像是侦探破案,需要耐心和细致的分析。每一步的检查都可能揭示问题的冰山一角。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1926

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

656

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2395

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

47

2026.01.19

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

443

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

605

2023.08.10

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

443

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

605

2023.08.10

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 10.5万人学习

Git 教程
Git 教程

共21课时 | 4.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号