我注意到从几天前开始就出现了同样的重复消息,并且可以肯定地说,在此期间没有任何内容被故意更改(安装/卸载)。
这是示例/var/log/kern.log信息:
Mar 30 06:32:45 aurora kernel: [566322.867110] e1000e: eth0 NIC Link is Down
Mar 30 06:32:47 aurora kernel: [566325.313634] e1000e: eth0 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: Rx/Tx
Mar 30 06:32:59 aurora kernel: [566337.632930] e1000e: eth0 NIC Link is Down
Mar 30 06:33:18 aurora kernel: [566356.543664] e1000e: eth0 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: None
Mar 30 11:05:47 aurora kernel: [582689.779752] e1000e: eth0 NIC Link is Down
Mar 30 11:05:50 aurora kernel: [582692.174337] e1000e: eth0 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: Rx/Tx
从完整的日志文件 - 当将所有此类日志消息都考虑进去时 - 我可以得出结论:
- eth0 每隔几个小时就会出现故障
- eth0 在第一种情况下失败了 2 秒,在第二种情况下失败了 19 秒
我在这里谈论的是生产服务器。
如何解决这个问题,因为邮件服务器正在生产中并且我无法容忍持续 19 秒的网络故障?
答案1
- 检查线路上的错误,查看 输出中的“errors”字段
ifconfig
。如果非零,则表示硬件存在问题(电缆、NIC 卡或集线器/交换机)。不可靠的以太网电缆也会在此字段中产生错误。 - 无论步骤 1 如何,都应更换以太网电缆。此操作快速、便宜且简单,并且应该在您的链路随机出现启动和停止的情况时进行。
- 使用
ethtool
并确保网络设置(双工等)与交换机上的设置相匹配。如果您不是交换机的管理员,请让网络管理员为您提供设置。 - 如果交换机启用了流量控制,则确保在 Linux 机器上也启用了流量控制。否则,请禁用它。
附注:你应该评估是否需要流量控制。根据 HP 的说法,只有高性能应用程序才需要流量控制:请参阅HP 文章:何时使用流量控制
答案2
以下是我的解决方法。此问题发生在特定硬件上(一台机器上只有 2 个 NIC 端口中的 1 个),始终使用 e1000e 驱动程序,从内核 3.9 左右开始。此文件适用于 centos7,/etc/init.d/
必须使用 才能进入并启用chkconfig --add <name>
。接口名称是硬编码的...请务必设置它。
#!/bin/sh
### BEGIN INIT INFO
# Provides: pm-e1000e-fix
# Required-Start: $network
# Required-Stop: $network
# Default-Start: 2 3 4 5
# Default-Stop: 0 6
# Short-Description: workaround for e1000e issue
# Description: e1000e fix
### END INIT INFO
################################################################################
# Give Usage Information #
################################################################################
usage() {
echo "Usage: $0 start|restart" >&2
exit 1
}
################################################################################
# E X E C U T I O N B E G I N S H E R E #
################################################################################
command="$1"
shift
interface="eth0"
case "$command" in
start)
ethtool -K "$interface" gso off gro off tso off
;;
restart)
ethtool -K "$interface" gso off gro off tso off
;;
*)
usage
;;
esac