1、网络拥堵
网络拥塞是指网络中的数据流量超过可用带宽,导致网络性能下降,例如数据包丢失、延迟增加和吞吐量下降。
产生原因
高流量应用:需要高带宽的应用,例如视频流、文件传输和在线游戏。恶意攻击,例如试图通过大量请求使网络过载的DDoS 攻击。网络配置不正确:您的路由器、交换机或其他网络设备配置不正确。硬件限制:网络设备或服务器网卡的性能限制。网络拓扑:网络架构不合理造成瓶颈。
判断依据
高延迟和丢包:使用ping 命令测试延迟和丢包。
pingwww.baidu.com
网络带宽使用情况:
使用ifstat 命令查看网络接口的实时带宽使用情况。
ifstat eth0 1
使用iftop 命令实时监控网络流量。
iftop -i eth0
网络连接和接口统计信息:使用netstat命令查看网络连接和接口统计信息。
网络统计-i
网络统计-s
网络路径和时延:使用traceroute命令可以查看数据包的传输路径和时延。
Traceroute www.baidu.com
网络抓包:使用tcpdump命令抓包,使用wireshark观察TCP是否有大量重复ACK包和重传包。
解决方案
流量控制和带宽管理:使用tc 命令管理流量。
sudo tc qdisc add dev eth0 root tbf 速率1mbit 突发32kbit 延迟400ms
# 对网络接口eth0应用流控规则,限制其平均发送速度为1Mbps,允许突发流量为32Kbit,最大延迟为400ms。
优化网络配置:调整TCP/IP参数,更改/etc/sysctl.conf文件中的参数(例如增加TCP缓冲区)。
# TCP接收缓冲区大小最小接收缓冲区大小为4096字节,最大接收缓冲区大小为6291456字节。
net.ipv4.tcp_rmem=4096 87380 6291456
#TCP发送缓冲区大小、最小发送缓冲区大小、默认发送缓冲区大小、最大发送缓冲区大小、单位字节
net.ipv4.tcp_wmem=4096 16384 4194304
# 最大套接字接收缓冲区大小(以字节为单位)设置TCP/IP 协议栈允许的最大接收缓冲区大小。
net.core.rmem_max=16777216
# 套接字发送缓冲区的最大大小(以字节为单位)。该值设置TCP/IP 协议栈允许的最大传输缓冲区大小。
网络核心.wmem_max=16777216
应用更改
sudo sysctl -p
升级你的硬件。
更换旧的路由器、交换机和防火墙,使用千兆位以太网或更高带宽的网络设备,增加服务器网卡的数量和带宽,并使用多个网卡绑定(NIC bond)来实现带宽和冗余网络设备的升级,包括改进。到网络设备。
负载均衡:使用负载均衡器并配置它(Nginx、HAProxy 等)来分配流量。
安全措施:防御DDoS攻击,限制不必要的网络访问,添加防火墙规则限制外部网络访问。
模拟场景
使用tc工具模拟网络拥塞场景的命令是:
sudo tc qdisc add dev eth0 root 句柄1:0 netem 延迟1000ms 速率1mbit
# 引入100ms 延迟并将带宽限制为1 Mbps
通过Wireshark工具抓包(使用ping命令)
使用tcp.analysis.duplicate_ack 过滤重复的ACK 数据包。
使用tcp.analysis.retransmission 过滤重传的数据包
模拟完成后,请务必使用sudo tc qdisc del dev eth0 root 清除此设置。
2、网络丢包
网络丢包(packet loss)是指网络设备在数据传输过程中未能将一个或多个数据包成功投递到目标位置。丢包会降低网络性能并影响应用程序响应速度和稳定性。
产生原因
网络拥塞:网络中过多的数据流量可能会压垮网络设备并导致数据包丢失。
硬件故障:路由器、交换机、网卡等网络设备出现故障或损坏。
网络干扰:无线网络容易受到电磁干扰,信号强度差,导致数据包丢失。
网络配置不当:网络设备配置错误,例如MTU(最大传输单元)设置不正确,导致数据包被截断。
网络设备过载:网络设备过载,无法处理所有传入和传出的数据包。
链路质量差:物理链路质量问题,例如电缆陈旧或损坏。
判断依据
使用ping 命令:您可以使用ping 命令测试目标主机的连通性和丢包率。
ping -c 10 www.baidu.com
使用traceroute命令:traceroute命令显示数据包到目的主机的路径,帮助您检测每一跳的响应时间和数据包丢失情况。
Traceroute www.baidu.com![在此插入图片描述](https://img-blog.csdnimg.cn/direct/27efe052ec684dcea0a5afe7c79f80fc.png#pic_center)
![在此插入图片描述](https://img-blog.csdnimg.cn/direct/07b85fba5c7241e69e0d1544f87b09c0.png#pic_center)
![在此插入图片描述](https://img-blog.csdnimg.cn/direct/8c37fa319dd24a6fb05d2c82b62fc67a.png#pic_center)
![在此插入图片描述](https://img-blog.csdnimg.cn/direct/9332dbc3e3be40d2bc9ad10445aee8c6.png#pic_center)
![在此插入图片描述](https://img-blog.csdnimg.cn/direct/0f64ce4418004b169158177830e8cb91.png#pic_center)
使用netstat命令。 netstat命令可以显示网络接口统计信息,包括丢包统计信息。检查输出的RX-ERR 和TX-ERR 列。这些表示发送和接收数据包时的错误数。
网络统计-i
**通过网络捕获数据包:** 使用tcpdump 命令捕获数据包并使用wireshark 监控是否有任何通过TCP 丢失的数据包。
解决方案
优化网络配置
调整MTU:为避免数据包被截断,请确保所有网络设备的MTU(最大传输单元)指向网络接口上可以发送的最大数据包(消息)大小(以字节为单位)。
ifconfig eth0 mtu 1500 #设置MTU值为1500
配置流量控制:使用tc工具来管理流量并避免网络拥塞。
sudo tc qdisc add dev eth0 root tbf 速率1mbit 突发32kbit 延迟400ms
#rate 1mbit: 将eth0 接口的平均传输速率限制为1Mbps。该参数确保接口不超过该速率。
#burst 32kbit: 允许突发大小为32 kbit。突发量是指短时间内能够发送超过速率限制的数据量,适合应对突发的流量高峰。
#latency 400ms: 将允许的最大队列延迟设置为400ms。该参数限制数据包在队列中等待处理的时间,以防止由于队列太长而导致过度延迟。
硬件升级与维护
检查并更换有故障的硬件:定期检查路由器、交换机、网卡等网络设备,确保其正常工作。升级您的网络设备:使用更高性能的网络设备(例如千兆位交换机和路由器)提高网络处理能力。
增加带宽并分散负载
增加网络带宽:根据需要升级网络带宽以减少网络拥塞。使用负载平衡:在多个服务器之间分配流量以避免单点出现瓶颈。
找到对应的进程。此命令列出与CLOSE_WAIT 状态关联的所有进程和文件描述符。
lsof -i grep CLOSE_WAIT | lsof -i grep
模拟场景
分析和修改应用程序代码
检查连接生命周期。确保所有打开的连接最终通过调用close() 关闭。正确处理异常:确保您的程序在异常情况下能够正确关闭连接,避免资源泄漏。超时设置:设置适当的连接超时以避免长时间的CLOSE_WAIT。
预防CLOSE_WAIT
良好的编程实践:确保完成后正确关闭所有网络连接。定期监控:利用监控工具定期检查连接状态,及时发现异常情况并采取措施。日志:记录连接的建立和终止,帮助分析问题。
3、网络闪断
表示连接的一端(通常是主动关闭连接的一端)发送并确认FIN(终止)消息,并且已收到另一端的FIN消息。该状态主要用于保证网络上延迟的数据包不会影响后续的连接。
产生原因
短连接频繁建立和关闭
短期连接:应用程序为每个请求建立一个新的TCP 连接并立即关闭该连接。这可能会导致高频请求出现大量TIME_WAIT 状态。 HTTP/1.0协议:默认使用短连接。为每个请求创建一个新连接,并在响应后关闭。
高级并发网络服务
高并发网络服务:高流量的Web服务器、API服务等。这些服务在处理大量客户端请求时频繁打开和关闭连接,从而导致大量的TIME_WAIT状态。
如果短时间内有大量请求
批量请求:在短时间内执行大批量请求测试或数据传输操作。由于这些操作频繁地建立和终止连接,因此很容易产生大量的TIME_WAIT 状态。
连接管理策略不合理
缺乏连接重用:没有连接池或机制来维护长连接,因此每个请求都会建立一个新连接。负载均衡不当:负载均衡策略不当会导致单台服务器处理过多请求,经常处于TIME_WAIT状态。
判断依据
使用netstat 检查TIME_WAIT 状态。此命令显示所有处于TIME_WAIT 状态的连接。
netstat -an TIME_WAIT | 时间等待
使用ss 工具检查详细信息。此命令还显示所有处于TIME_WAIT 状态的连接。 ss 工具通常比netstat 更最新、更高效。
ss -tan 状态TIME-WAIT
解决方案
调整系统参数和内核参数,减少TIME_WAIT状态的持续时间。
减少TIME_WAIT状态的持续时间
sudo sysctl -w net.ipv4.tcp_fin_timeout=30
# tcp_fin_timeout 参数定义TIME_WAIT 状态的持续时间(以秒为单位)。默认值通常为60 秒,但您可以根据需要进行调整。
允许重用处于TIME_WAIT 状态的连接。
sudo sysctl -w net.ipv4.tcp_tw_reuse=1
sudo sysctl -w net.ipv4.tcp_tw_recycle=1
# 可以使用tcp_tw_reuse和tcp_tw_recycle参数来重用处于TIME_WAIT状态的TCP连接。在生产环境中谨慎使用tcp_tw_recycle,因为它可能会在NAT 环境中导致问题。
通过负载均衡来分配流量,减少TIME_WAIT状态的连接数,减少单台服务器的连接数。
上游后端{
服务器backend1.example.com;
服务器backend2.example.com;
}
服务器{
听80。
位置/{
proxy_pass http://后端;
}
}
以上#Common Linux Networking Issues相关内容摘自互联网,仅供参考。相关信息请参见官方公告。
原创文章,作者:CSDN,如若转载,请注明出处:https://www.sudun.com/ask/92737.html