我们基于 Linux 的 Thecus N12000 NAS 最近在其dmesg
日志中遇到了此消息。
[2014-05-21 11:34:56] ------------[ cut here ]------------
[2014-05-21 11:34:56] WARNING: at net/ipv4/tcp_input.c:2966 tcp_ack+0xd88/0x1a1c()
[2014-05-21 11:34:56] Hardware name: IRONLAKE & IBEX PEAK Chipset
[2014-05-21 11:34:56] Modules linked in: nfsd lockd nfs_acl auth_rpcgss sunrpc iscsi_tcp libiscsi_tcp libiscsi scsi_transport_iscsi ntfs ses enclosure usblp usb_storage usbhid xhci_hcd uhci_hcd ehci_hcd usbcore sg be2net tehuti igb ixgbe dca e1000e drm_kms_helper drm video backlight sata_sil24 mpt2sas ahci libahci ata_piix
[2014-05-21 11:34:56] Pid: 1710, comm: smbd Not tainted 2.6.38 #1
[2014-05-21 11:34:56] Call Trace:
[2014-05-21 11:34:56] [<ffffffff8103118e>] ? warn_slowpath_common+0x78/0x8c
[2014-05-21 11:34:56] [<ffffffff81391339>] ? tcp_ack+0xd88/0x1a1c
[2014-05-21 11:34:56] [<ffffffff81392ca5>] ? tcp_rcv_established+0x780/0x9d1
[2014-05-21 11:34:56] [<ffffffff81392d42>] ? tcp_rcv_established+0x81d/0x9d1
[2014-05-21 11:34:56] [<ffffffff8139a52d>] ? tcp_v4_do_rcv+0x1a1/0x377
[2014-05-21 11:34:56] [<ffffffff8139a52d>] ? tcp_v4_do_rcv+0x1a1/0x377
[2014-05-21 11:34:56] [<ffffffff81413149>] ? _raw_spin_lock_bh+0x9/0x1f
[2014-05-21 11:34:56] [<ffffffff8135374c>] ? release_sock+0x19/0x103
[2014-05-21 11:34:56] [<ffffffff81413149>] ? _raw_spin_lock_bh+0x9/0x1f
[2014-05-21 11:34:56] [<ffffffff813537cd>] ? release_sock+0x9a/0x103
[2014-05-21 11:34:56] [<ffffffff8138a89a>] ? tcp_recvmsg+0x48f/0x9f5
[2014-05-21 11:34:56] [<ffffffff8138c24d>] ? tcp_sendpage+0x595/0x5a7
[2014-05-21 11:34:56] [<ffffffff81350048>] ? sock_sendmsg+0xc3/0xe0
[2014-05-21 11:34:56] [<ffffffff813a5f60>] ? inet_recvmsg+0x64/0x75
[2014-05-21 11:34:56] [<ffffffff8134f84e>] ? sock_sendpage+0x36/0x3d
[2014-05-21 11:34:56] [<ffffffff8134f7aa>] ? sock_aio_read+0x126/0x13a
[2014-05-21 11:34:56] [<ffffffff810a0f4d>] ? do_sync_read+0xb1/0xea
[2014-05-21 11:34:56] [<ffffffff810a1921>] ? vfs_read+0xbd/0x12d
[2014-05-21 11:34:56] [<ffffffff810a1a47>] ? sys_read+0x45/0x6e
[2014-05-21 11:34:56] [<ffffffff810027fb>] ? system_call_fastpath+0x16/0x1b
[2014-05-21 11:34:56] ---[ end trace cdaf61db513385a1 ]---
在研究这个错误消息时我只找到以下信息:
if (WARN_ON(!tp->sacked_out && tp->fackets_out))
tp->fackets_out = 0;
我还在 oops.kernel.org 网站上发现了类似的错误,警告:位于 net/ipv4/tcp_input.c:2966 tcp_ack+0xdbe/0x1f80。
这是否只是一个我们可以忽略的非问题警告,是否是我应该关注的其他问题的症状?
这不是一个器具吗?
笔记:虽然这是一款 Linux 设备,但它实际上基于 CentOS。我时不时地将基于 CentOS 5 构建的二进制文件放到机器上,它们运行起来没有问题。例如,工具df
。
$ uname -a
Linux tank 2.6.38 #1 SMP Fri Oct 26 14:35:05 CST 2012 x86_64 GNU/Linux
参考
答案1
您关于 WARN 的位置是正确的,此代码来自上游内核标记v2.6.38
:
net/ipv4/tcp_input.c
2953 static void tcp_fastretrans_alert(struct sock *sk, int pkts_acked, int flag)
2954 {
...
2964 if (WARN_ON(!tp->sacked_out && tp->fackets_out))
2965 tp->fackets_out = 0;
2966
这是讨论的这里并通过提交修复:
commit 5b35e1e6e9ca651e6b291c96d1106043c9af314a
Author: Neal Cardwell <[email protected]>
Date: Sat Jan 28 17:29:46 2012 +0000
tcp: fix tcp_trim_head() to adjust segment count with skb MSS
该日期将其修复放在内核 3.3 中。此修复未反向移植到 Red Hat 的 EL5 源(我检查了 5.11 内核 2.6.18-398),因此如果您的 NAS 基于 CentOS 5,则此问题尚未修复。
值得注意的是,从未2.6.38
发布过 EL5 内核,因此这不是 Red Hat 或 CentOS 内核。我假设您的 NAS 供应商已经采用了较新的上游内核,可能应用了一些补丁,并在 SAN 的固件映像中提供了该内核。
如果您想解决此问题,您可能需要获取内核 3.3 或更高版本的源代码,应用 SAN 供应商的补丁,并构建您自己的内核。可能值得检查一下这个问题是否已修复ELRepo 的 kernel-lt也就是说3.2.63-1.el5
,非常接近 3.3。如果没有,您可以使用 ELRepo 的.config
文件和make oldconfig
新内核源来回答最少的问题。
话虽如此,无论如何,大也没什么大不了的。发生这种情况WARN
的原因是 TCP 中的记帐错误。如果我正确理解补丁,则使用 TCP 分段卸载传输数据的函数会做出一些错误的假设,导致在某些情况下计算的分段数量为垃圾。WARN
通过将其中一个段计数返回到 0 来修复此问题。思考最糟糕的情况是,当出现数据包丢失时,会重传比所需数据多一点的数据。
您可以通过禁用 TSO 来解决此问题。检查您是否正在使用 TSO:
ethtool -g ethX
如果是这样,请使用以下命令禁用它:
ethtool -G ethX tso off
如果这有效,并且您的网络由常规 CentOS 初始化脚本(和朋友)控制,/etc/init.d/network
那么您可以编写/sbin/ifup-local
以在每次界面启动时应用更改,如下所示:
#!/bin/bash
if [ $1 == "ethX" ]]; then
/sbin/ethtool -G $1 tso off
fi
替换ethX
为您的网络接口的名称。
答案2
这是网络代码路径中的错误,与硬件问题本身无关。我怀疑您对设备本身有很多担忧。您可以使用 ethtool -S 检查是否存在可能导致问题的网络数据包丢失,并检查其他网络设备,以防万一。
您可能遇到一些网络问题,或者内核对某些 TCP 流量感到困惑。