# ethtool -S eth0|grep rx_queue_0_drops但这里需要注意的是 , 因为一个网卡里是可以有多个RingBuffer的 , 所以上面的rx_queue_0_drops里的0代表的是第0个RingBuffer的丢包数 , 对于多队列的网卡 , 这个0还可以改成其他数字 。但我的家庭条件不允许我看其他队列的丢包数 , 所以上面的命令对我来说是够用了 。。。
当发现有这类型丢包的时候 , 可以通过下面的命令查看当前网卡的配置 。
#ethtool -g eth0Ring parameters for eth0:Pre-set maximums:RX:4096RX Mini:0RX Jumbo:0TX:4096Current hardware settings:RX:1024RX Mini:0RX Jumbo:0TX:1024上面的输出内容 , 含义是RingBuffer最大支持4096的长度 , 但现在实际只用了1024 。
想要修改这个长度可以执行ethtool -G eth1 rx 4096 tx 4096将发送和接收RingBuffer的长度都改为4096 。
RingBuffer增大之后 , 可以减少因为容量小而导致的丢包情况 。
网卡性能不足网卡作为硬件 , 传输速度是有上限的 。当网络传输速度过大 , 达到网卡上限时 , 就会发生丢包 。这种情况一般常见于压测场景 。
我们可以通过ethtool加网卡名 , 获得当前网卡支持的最大速度 。
# ethtool eth0Settings for eth0:Speed: 10000Mb/s可以看到 , 我这边用的网卡能支持的最大传输速度speed=1000Mb/s 。
也就是俗称的千兆网卡 , 但注意这里的单位是Mb , 这里的b是指bit , 而不是Byte 。1Byte=8bit 。所以10000Mb/s还要除以8 , 也就是理论上网卡最大传输速度是1000/8 = 125MB/s 。
我们可以通过sar命令从网络接口层面来分析数据包的收发情况 。
# sar -n DEV 1linux 3.10.0-1127.19.1.el7.x86_642022年07月27日_x86_64_(1 CPU)08时35分39秒IFACErxpck/stxpck/srxkB/stxkB/srxcmp/stxcmp/srxmcst/s08时35分40秒eth06.064.040.35121682.330.000.000.00其中 txkB/s是指当前每秒发送的字节(byte)总数 , rxkB/s是指每秒接收的字节(byte)总数 。
当两者加起来的值约等于12~13w字节的时候 , 也就对应大概125MB/s的传输速度 。此时达到网卡性能极限 , 就会开始丢包 。
遇到这个问题 , 优先看下你的服务是不是真有这么大的真实流量 , 如果是的话可以考虑下拆分服务 , 或者就忍痛充钱升级下配置吧 。
接收缓冲区丢包我们一般使用TCP socket进行网络编程的时候 , 内核都会分配一个发送缓冲区和一个接收缓冲区 。
当我们想要发一个数据包 , 会在代码里执行send(msg) , 这时候数据包并不是一把梭直接就走网卡飞出去的 。而是将数据拷贝到内核发送缓冲区就完事返回了 , 至于什么时候发数据 , 发多少数据 , 这个后续由内核自己做决定 。之前写过的《代码执行send成功后 , 数据就发出去了吗?》里有比较详细的介绍 。
文章插图
tcp_sendmsg逻辑
而接收缓冲区作用也类似 , 从外部网络收到的数据包就暂存在这个地方 , 然后坐等用户空间的应用程序将数据包取走 。
这两个缓冲区是有大小限制的 , 可以通过下面的命令去查看 。
# 查看接收缓冲区# sysctl net.ipv4.tcp_rmemnet.ipv4.tcp_rmem = 4096873806291456# 查看发送缓冲区# sysctl net.ipv4.tcp_wmemnet.ipv4.tcp_wmem = 4096163844194304不管是接收缓冲区还是发送缓冲区 , 都能看到三个数值 , 分别对应缓冲区的最小值 , 默认值和最大值 (min、default、max) 。缓冲区会在min和max之间动态调整 。那么问题来了 , 如果缓冲区设置过小会怎么样?
对于发送缓冲区 , 执行send的时候 , 如果是阻塞调用 , 那就会等 , 等到缓冲区有空位可以发数据 。
文章插图
send阻塞
如果是非阻塞调用 , 就会立刻返回一个 EAGAIN 错误信息 , 意思是 Try again 。让应用程序下次再重试 。这种情况下一般不会发生丢包 。
推荐阅读
- TCP/IP攻击详细解释
- Office|微软Office平替!开源免费办公软件LibreOffice上新:更好用了
- 冰箱结冰别敲,用一个空瓶就搞定,五分钟冰块往下掉,太实用了
- QQ|QQ没人用了吗?活跃用户只有微信的44%
- IE浏览器|彻底告别IE浏览器:微软即将禁用TLS 1.0/1.1安全协议
- 离婚协议中将自己名下房产赠与子女或他人的约定能否撤销?
- 那么用了乳液还需要用霜吗? 乳液和霜的区别
- 安卓|谷歌宣布:Android 13正式开源 源代码已公开!华为小米等厂商可用了
- 三伏贴用了皮肤红痒怎么办?
- 蓝牙|189元 小米智能多模网关2发布:通吃三大主流通信协议
