浅谈"watchdog timeout"出现的原因
2009-05-13 12:58:29来源:未知 阅读 ()
最近有比较多的人谈到网卡的”watchdog timeout“问题,究竟是什么原因造成的,大多数人都把网卡的性能不佳做为问题的根源所在。我认为网卡的性能只是一方面的因素,他还涉及到缓冲的大小、单位时间内的包的数量、及网卡驱动程序等一系列因素。以下将从源代码的角度来对他进行分析。
首先,我们看看到底是哪个函数发出了“watchdog timeout”字符串,只要你查一下源代码不难看出,在各网卡的驱动程序里的XX_watchdog(XX是各网卡的名称,如:8139是rl,AMD7990是pcn,Inter是fxp等等)函数发出的。函数比较简单:
static void rl_watchdog(ifp)
struct ifnet *ifp;
/*申明ifp是一个ifnet结构,结构存放了该网卡的输入输
出的函数指针和一些重要参数,当然也包括rl_watchdog函数的
指针*/
{
struct rl_softc *sc;
sc = ifp->if_softc;
/*ifnet是softc结构的一个子集,softc包含了更多的该网卡的参数*/
printf("rl%d: watchdog timeout\n", sc->rl_unit);
/*打印出是哪块网卡出现问题。
sc->rl_unit代表该种网卡的第几快。我们知道在一个机器里同样
的网卡可能有几块,当然此参数是由网卡驱动程序的初始化程序
填充*/
ifp->if_oerrors++;
/*累计输出出现的错误包数量(o代表输出)*/
rl_txeof(sc);
/*这里是每个驱动程序不同的,此处为8139的,不过我觉得用rl_stop(sc)更好*/
rl_rxeof(sc);
/*这里也是每个驱动程序不同。我觉得来一个rl_reset(sc)也不错。*/
rl_init(sc);/*这里大家都一样,重新初始芯片。*/
return;
}
好了,到这我们知道是XX_watchdog函数发出了watchdog timeout信息。那么是谁来调用该函数呢? 我们接着来看另一个函数:if_slowtimo函数,该函数在if.c中。if.c是interface(接口的简称), 即系统在启动过程中初始化时必须调用其中的一些函数。ifinit函数是其中被调用的一个,这个函数很简单:
void
ifinit()
{
static struct timeout if_slowtim;
timeout_set(&if_slowtim, if_slowtimo, &if_slowtim);
/*简单的说就是设置一定时器*/
if_slowtimo(&if_slowtim);
/*哈哈,等不急了,先调用了再说*/
}这样一来,if_slowtimo就成了一个一定时间内就要执行的一个函数了,此时候,大家也知道了if_slowtimo 的大概功能,无非是定时查看各网卡的发送数据的情况,如果没发送完成,就给该卡加一个计数器,到计数器达到一定的值时还没发送出去就调用该卡的XX_watchdog函数。下面我们来看看if_slowtimo函数。
void
if_slowtimo(arg)
void *arg;
{
struct timeout *to = (struct timeout *)arg;
struct ifnet *ifp;
int s = splimp();
/*在做以下操作的时候必须关中断*/
TAILQ_FOREACH(ifp, &ifnet, if_list)
{/*搜索每一个接口设备,TAILQ_FOREACH实际上是for(...)*/
if (ifp->if_timer == 0 || --ifp->if_timer)
continue;
/*如果是if_timer为0或if_timer减1以后还为真,实际上是对每块网卡
的计数器if_timer减1后判断他是否还大于0,小于0就调用watchdog
函数。*/
if (ifp->if_watchdog) /*不过调用之前看看该卡有没有watchdog函数*/
(*ifp->if_watchdog)(ifp);
}
splx(s);
timeout_add(to, hz /
IFNET_SLOWHZ);
/*每次计时器完成后都会清除,你不得不又加上去。hz是计算
机的主频,就是说调度的间隔时间是和主频成正比的关系。*/
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 急!断电源后不能启动[搞定了] 2009-05-13
- OpenBSD 4.5下安装Gnome 2.24成功! 2009-05-13
- OB 4.5不会用啦,泪奔,好多问题 2009-05-13
- 正在使用FB7.1 2009-05-13
- 【转载】freebsd sysctl.conf配置说明 2009-05-13
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash