近期遇到一台推流的机器,反馈推流卡顿,查看确实整体丢帧率较高。但机器性能正常,未见明显跑高现象。ifconfig发现网卡droppedoverruns高,并且有持续增高的现象。

丢卡丢包

确认交换机以及网线无异常后,最终发现网卡缓存值设置过小,导致在大量接收数据的情况下,出现overruns的现象。

网络逻辑模型

半路出家,对于网络的东西一直一知半解,顺便学习下网络模型吧。

网络的逻辑模型,最近在豆瓣读书看到一个很好的介绍,点击阅读,想不到豆瓣也有技术文章。

物理层

各种物理信号,如电压、亮度,振幅等表示0101010的二进制信息。

链接层

也称为数据链路层,通过物理寻址,将比特流转化为逻辑数据,使用到mac地址。将比特流包装为帧,帧中包含有来源地址(Source, SRC)和目的地址(Destination, DST),能够探测错误的校验序列(Frame Check Sequence)、数据区 (payload)与数据相配套的数据类型(Type)信息。

网络层

通过网关(gateway)(通常由路由器或者三层交换机实现),改写帧的格式,将一个子网的数据帧转发到另一个子网,实现不同子网之间的通信,使用到IP地址。

传输层

进程间通信,如TCP和UDP使用端口号区分不同进程。

应用层

HTTP,FTP等,更为高级的有各个程序自定义的逻辑。

网卡收包功能

网卡是物理层和数据链路层设备。由于发数据基本不会出现丢包的现象,此处支持收数据的问题。

网卡接收到帧数据后,首先根据头部的序言(preamble)(用于调整时钟)、帧的起始信号(SFD, start frame delimiter)、目的地(DST, destination)和发出地(SRC, source)、类型(Type)和尾部的校验序列(CRC)(用于校验数据是否完整)这些信息进行校验,随后通过硬中断将帧copy到内存,交由内核处理。

网卡缓冲值

此处涉及到的缓冲有两个,一个为网卡的硬件缓冲,另一个是内核的缓冲。网卡驱动会采用硬中断的方式将接收到的数据从硬件缓冲copy到内核缓冲。

使用ethtool工具可以查看设置当前网卡缓冲值的大小。ethtool -g eth0

查看网卡缓冲值大小

图中上面的数值表示网卡支持的最大缓冲值,下面的表示目前设置的值。可以使用ethtool -G eth0 rx 128

网上资料反馈设置缓冲值会导致网络down/up,瞬时网络中断。实际设置时,概率性出现网络中断。原因不明。

另外注意的是,改设置只是临时生效,每次系统重启时,会重新设置,最好的办法是将命令加入开机执行rc.local

另另外:网卡缓冲值分为普通fifo buffer和ring buffer 环形缓冲,等学习之后再补充。