负载过大时,e1000_watchdog 反复 UP、DOWN 的问题

发布于 2022-10-03 19:43:21 字数 501 浏览 23 评论 0

做 NAT 服务器,当负载过大时,总出现

Oct 17 14:56:04 server kernel: e1000: eth0: e1000_watchdog: NIC Link is Down
Oct 17 14:56:08 server kernel: e1000: eth0: e1000_watchdog: NIC Link is Up 100 Mbps Full Duplex
Oct 17 14:56:09 server kernel: e1000: eth0: e1000_watchdog: NIC Link is Down
Oct 17 14:56:15 server kernel: e1000: eth0: e1000_watchdog: NIC Link is Up 100 Mbps Full Duplex

网卡反复 UP、DOWN,甚至导致系统自动重启
这个 e1000_watchdog 是做什么用的?为何有如此现象?如何不让他自动 UP、DOWN ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

情域 2022-10-10 19:43:21
  1. static void
  2. e1000_watchdog(unsigned long data)
  3. {
  4.         struct e1000_adapter *adapter = (struct e1000_adapter *) data;
  5.         struct net_device *netdev = adapter->;netdev;
  6.         struct e1000_desc_ring *txdr = &adapter->;tx_ring;
  7.         unsigned int i;
  8.         uint32_t link;
  9.         e1000_check_for_link(&adapter->;hw);
  10.         if((adapter->;hw.media_type == e1000_media_type_internal_serdes) &&
  11.            !(E1000_READ_REG(&adapter->;hw, TXCW) & E1000_TXCW_ANE))
  12.                 link = !adapter->;hw.serdes_link_down;
  13.         else
  14.                 link = E1000_READ_REG(&adapter->;hw, STATUS) & E1000_STATUS_LU;
  15.         if(link) {
  16.                 if(!netif_carrier_ok(netdev)) {
  17.                         e1000_get_speed_and_duplex(&adapter->;hw,
  18.                                                    &adapter->;link_speed,
  19.                                                    &adapter->;link_duplex);
  20.                         DPRINTK(LINK, INFO, "NIC Link is Up %d Mbps %s\n",
  21.                                adapter->;link_speed,
  22.                                adapter->;link_duplex == FULL_DUPLEX ?
  23.                                "Full Duplex" : "Half Duplex");
  24.                         netif_carrier_on(netdev);
  25.                         netif_wake_queue(netdev);
  26.                         mod_timer(&adapter->;phy_info_timer, jiffies + 2 * HZ);
  27.                         adapter->;smartspeed = 0;
  28.                 }
  29.         } else {
  30.                 if(netif_carrier_ok(netdev)) {
  31.                         adapter->;link_speed = 0;
  32.                         adapter->;link_duplex = 0;
  33.                         DPRINTK(LINK, INFO, "NIC Link is Down\n");
  34.                         netif_carrier_off(netdev);
  35.                         netif_stop_queue(netdev);
  36.                         mod_timer(&adapter->;phy_info_timer, jiffies + 2 * HZ);
  37.                 }
  38.                 e1000_smartspeed(adapter);
  39.         }
  40.         e1000_update_stats(adapter);
  41.         adapter->;hw.tx_packet_delta = adapter->;stats.tpt - adapter->;tpt_old;
  42.         adapter->;tpt_old = adapter->;stats.tpt;
  43.         adapter->;hw.collision_delta = adapter->;stats.colc - adapter->;colc_old;
  44.         adapter->;colc_old = adapter->;stats.colc;
  45.        
  46.         adapter->;gorcl = adapter->;stats.gorcl - adapter->;gorcl_old;
  47.         adapter->;gorcl_old = adapter->;stats.gorcl;
  48.         adapter->;gotcl = adapter->;stats.gotcl - adapter->;gotcl_old;
  49.         adapter->;gotcl_old = adapter->;stats.gotcl;
  50.         e1000_update_adaptive(&adapter->;hw);
  51.         if(!netif_carrier_ok(netdev)) {
  52.                 if(E1000_DESC_UNUSED(txdr) + 1 < txdr->;count) {
  53.                         /* We've lost link, so the controller stops DMA,
  54.                          * but we've got queued Tx work that's never going
  55.                          * to get done, so reset controller to flush Tx.
  56.                          * (Do the reset outside of interrupt context). */
  57.                         schedule_work(&adapter->;tx_timeout_task);
  58.                 }
  59.         }
  60.         /* Dynamic mode for Interrupt Throttle Rate (ITR) */
  61.         if(adapter->;hw.mac_type >;= e1000_82540 && adapter->;itr == 1) {
  62.                 /* Symmetric Tx/Rx gets a reduced ITR=2000; Total
  63.                  * asymmetrical Tx or Rx gets ITR=8000; everyone
  64.                  * else is between 2000-8000. */
  65.                 uint32_t goc = (adapter->;gotcl + adapter->;gorcl) / 10000;
  66.                 uint32_t dif = (adapter->;gotcl >; adapter->;gorcl ?
  67.                         adapter->;gotcl - adapter->;gorcl :
  68.                         adapter->;gorcl - adapter->;gotcl) / 10000;
  69.                 uint32_t itr = goc >; 0 ? (dif * 6000 / goc + 2000) : 8000;
  70.                 E1000_WRITE_REG(&adapter->;hw, ITR, 1000000000 / (itr * 256));
  71.         }
  72.         /* Cause software interrupt to ensure rx ring is cleaned */
  73.         E1000_WRITE_REG(&adapter->;hw, ICS, E1000_ICS_RXDMT0);
  74.         /* Early detection of hung controller */
  75.         i = txdr->;next_to_clean;
  76.         if(txdr->;buffer_info[i].dma &&
  77.            time_after(jiffies, txdr->;buffer_info[i].time_stamp + HZ) &&
  78.            !(E1000_READ_REG(&adapter->;hw, STATUS) & E1000_STATUS_TXOFF))
  79.                 netif_stop_queue(netdev);
  80.         /* Reset the timer */
  81.         mod_timer(&adapter->;watchdog_timer, jiffies + 2 * HZ);
  82. }

复制代码
[ 本帖最后由 platinum 于 2005-11-3 14:24 编辑 ]

忘年祭陌 2022-10-10 19:43:21
  1. if((adapter->;hw.media_type == e1000_media_type_internal_serdes) &&
  2.   !(E1000_READ_REG(&adapter->;hw, TXCW) & E1000_TXCW_ANE))
  3. link = !adapter->;hw.serdes_link_down;
  4. else
  5. link = E1000_READ_REG(&adapter->;hw, STATUS) & E1000_STATUS_LU;

复制代码
这段话什么意思?什么情况会导致 link = 0 ?
如果删除了 else 后面的东西重新编译驱动,会不会有副作用?

2022-10-10 19:43:21

watchdog这个好像是检测到坏桢认为可能硬件出现故障复位硬件,不过e1000吃不住流量的情况应该不大,估计是线制作的不合格导致大流量时坏桢严重,或者有电气干扰等。

箜明 2022-10-10 19:43:21

对了,ifconfig看一下是不是相应网卡出现很多errors的包

时光病人 2022-10-10 19:43:21

很奇怪呢,RX-ERR RX-DRP RX-OVR,这三项都是 0
是这样的,这台机器上还运行其他服务,CPU 一直比较高,会不会是没有过多的 CPU 来负责处理数据包造成的?

还有,我如果修改源代码,注释掉硬件复位那段代码可不可以?会不会有副作用?

笨死的猪 2022-10-10 19:43:21

cat /proc/interrupts  看下是否和这相似,注释掉硬件复位那段代码没问题,
          CPU0       CPU1       CPU2       CPU3
0:  347275720  347745526  340396987  340996245    IO-APIC-edge  timer
1:        284        789        878        556    IO-APIC-edge  i8042
8:          0          0          0          1    IO-APIC-edge  rtc
9:          0          0          0          0   IO-APIC-level  acpi
14:          1          0         20         19    IO-APIC-edge  ide0
15:      87104     399199       5819     328406    IO-APIC-edge  libata
169:          0          0          0          0   IO-APIC-level  uhci_hcd
177:          0          0          0          0   IO-APIC-level  uhci_hcd
185:          0          0          0          0   IO-APIC-level  ehci_hcd
209:     186220    5466568     211081    5950435   IO-APIC-level  ioc0
217:   27184131          0          0        157   IO-APIC-level  eth0
225:          0          0   51742411         29   IO-APIC-level  eth1
NMI:          0          0          0          0
LOC: 1376397708 1376397707 1376397706 1376397705
ERR:          0
MIS:          0

愿与i 2022-10-10 19:43:21

           CPU0
  0:    5208209    IO-APIC-edge  timer
  1:          2    IO-APIC-edge  keyboard
  4:         30    IO-APIC-edge  serial
  8:          1    IO-APIC-edge  rtc
  9:          0   IO-APIC-level  acpi
15:     108463    IO-APIC-edge  ide1
21:   15700851   IO-APIC-level  eth0
22:   15716884   IO-APIC-level  eth1
NMI:          0
LOC:    5208446
ERR:          0
MIS:          0

这样正常吗?

む无字情书 2022-10-10 19:43:21

不会是负载过大的原因.我们单位做iptv,负荷比你重多了吧,也是e1000

无所谓啦 2022-10-10 19:43:21

e1000 是千兆的网卡, 100M应该没事呀?
watchdog 好象是用来检测什么东东的一个计时, 我觉得是不是你的 switch 受不了呀? 因为 switch 如果不行了, 网卡一样会认为网络 down 呀.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文