网络模块中一种奇怪的状态

161 views
Skip to first unread message

Liao Wei

unread,
Jun 17, 2010, 3:28:51 AM6/17/10
to sz...@googlegroups.com
如果你在Linux里面运行这样的脚本(我不确定对每种网卡驱动都适用):


#!/bin/sh
while :
do
       ifconfig eth0 up
       sleep 3
       cat /sys/class/net/eth0/carrier
       ifconfig eth0 down
done

当前网口是插了网线的。这个结果会时儿为1时儿为0 ,sleep要大于等于5秒时,结果才是稳定的。这种情况适用于ethtool。
如果使用 ifconfig, ip addr去设置ip 的话也会在一段时间产生这种游离的状态。这样会发生很多意想不到的问题,例如:
你认为Link 是up 的,但实际读出来是down;你认为某些服务紧接着起来是正常的,其实它的socket并没有去侦探端口,等等。

应用层向内核模块发送命令就了事了,并不等待它的返回。

有没有其他方法可以更有效些?

Wick

unread,
Jun 17, 2010, 4:26:52 AM6/17/10
to sz...@googlegroups.com
2010/6/17 Liao Wei <liaow...@gmail.com>:

> 如果你在Linux里面运行这样的脚本(我不确定对每种网卡驱动都适用):
>
>
>> #!/bin/sh
>> while :
>> do
>> ifconfig eth0 up
>> sleep 3
>> cat /sys/class/net/eth0/carrier
>> ifconfig eth0 down
>> done
>
> 当前网口是插了网线的。这个结果会时儿为1时儿为0 ,sleep要大于等于5秒时,结果才是稳定的。这种情况适用于ethtool。

我在这里是一直稳定为1,即使sleep 1。网卡是 Realtek RTL-8139。

> 如果使用 ifconfig, ip addr去设置ip 的话也会在一段时间产生这种游离的状态。这样会发生很多意想不到的问题,例如:
> 你认为Link 是up 的,但实际读出来是down;你认为某些服务紧接着起来是正常的,其实它的socket并没有去侦探端口,等等。
>
> 应用层向内核模块发送命令就了事了,并不等待它的返回。
>
> 有没有其他方法可以更有效些?

我自己看的一些网卡驱动会监听硬件寄存器来发现carrier的状态,如果发生改变就会报告上层(netif_carrier_on 和
netif_carrier_off)。
内核会记录下接口的上报。

那个ifup eth0 包含两个动作,第一个是驱动相关的netdev->open,第二个是驱动无关的设置地址。比如你open的时候可能需要初始化网卡DMA等等,那么你就需要短时间的网卡复位等等。

因此个人认为链路状态是网卡驱动做的事情,内核没有稳定的方法来获得。

--
MSN/GTalk: izhangxc[AT]gmail.com

Anders Ma

unread,
Jun 17, 2010, 4:40:16 AM6/17/10
to sz...@googlegroups.com
2010/6/17 Liao Wei <liaow...@gmail.com>:

只是你频繁操作 ifconfig
up/dow,会导致网卡不断open/close,底下就是网卡的MAC/PHY要不断init/reset。估计你们的PHY都是用自动协商速度的,所以LINK
UP/DOWN是不太确定的。

此外,如果你操作的网卡连接到交换机,交换机开启了Spanning Tree,别说3秒了,20秒后可能还是LINK DOWN!

--
Regards
Anders

Alexander Anderson

unread,
Jun 17, 2010, 4:56:54 AM6/17/10
to sz...@googlegroups.com
�� 2010-6-17 16:26, Wick �:
> 2010/6/17 Liao Wei <liaow...@gmail.com>:
>> �������Linux������������Ľű����Ҳ�ȷ����ÿ���������ã�:

>>
>>
>>> #!/bin/sh
>>> while :
>>> do
>>> ifconfig eth0 up
>>> sleep 3
>>> cat /sys/class/net/eth0/carrier
>>> ifconfig eth0 down
>>> done
>> ��ǰ����Dz������ߵġ��������ʱ��Ϊ1ʱ��Ϊ0 ��sleepҪ���ڵ���5��ʱ���������ȶ��ġ��������������ethtool��
> ����������һֱ�ȶ�Ϊ1����ʹsleep 1������ Realtek RTL-8139��

��������һ��
>> ���ʹ�� ifconfig, ip addrȥ����ip �Ļ�Ҳ����һ��ʱ��������������״̬������ᷢ��ܶ����벻�������⣬���磺
>> ����ΪLink ��up �ģ���ʵ�ʶ�������down������ΪijЩ�����������������ģ���ʵ���socket��û��ȥ��̽�˿ڣ��ȵȡ�
>>
>> Ӧ�ò����ں�ģ�鷢������������ˣ������ȴ���ķ��ء�
>>
>> ��û���������Ը���ЧЩ��
> ���Լ�����һЩ��������Ӳ���Ĵ���������carrier��״̬�������ı�ͻᱨ���ϲ�(netif_carrier_on ��
> netif_carrier_off)��
> �ں˻��¼�½ӿڵ��ϱ���
>
> �Ǹ�ifup eth0 ��������������һ��������ص�netdev->open���ڶ��������޹ص����õ�ַ��������open��ʱ�������Ҫ��ʼ����DMA�ȵȣ���ô�����Ҫ��ʱ�����λ�ȵȡ�
>
> ��˸�����Ϊ��·״̬�������������飬�ں�û���ȶ��ķ�������á�
>

Liao Wei

unread,
Jun 17, 2010, 6:30:34 AM6/17/10
to sz...@googlegroups.com
在 2010年6月17日 上午4:40,Anders Ma <xuejiao.ma@gmail.com>写道:

只是你频繁操作 ifconfig
up/dow,会导致网卡不断open/close,底下就是网卡的MAC/PHY要不断init/reset。估计你们的PHY都是用自动协商速度的,所以LINK
UP/DOWN是不太确定的。

此外,如果你操作的网卡连接到交换机,交换机开启了Spanning Tree,别说3秒了,20秒后可能还是LINK DOWN!

频繁操作只是为说明现象。 PHY 是设置为自动协商。
LINK UP/DOWN不确定是可以理解的,如果我们读 /sys/class/net/eth0/iflink的话。
但我读/sys/class/net/eth0/carrier 是为了了解它是否可以负载信号,也就是网线是否插好了,可不可以和交换机协商了!?

我在设置IP时,也会出现着这种情况,或许是我做了:
ip addr flush dev eth0

初步确定应该是网卡的MAC/PHY块 init/reset引起的,看来在应用层是无法解决了。
Reply all
Reply to author
Forward
0 new messages