几周前我们遇到了一个非常奇怪的问题,一直无法解决。
我们在同一个 Windows Server 2003 SP2 机器上用 IIS(端口 80,443)和 Apache(8080,8090)运行了几个网站。我们已经用这个配置运行了好几年了。
在 IIS Connect 中运行的 Web 应用程序有时会先连接到在 Apache 中运行的应用程序(位于同一台服务器上),然后再响应客户端。有时,应用程序会连接到在另一台服务器上运行的数据库服务器,有时它们还会连接到另一台服务器上的 Windows 文件共享。
在上述三种情况下,应用程序都会偶尔报告以下错误之一:
- 无法从传输连接读取数据:主机中的软件中止了已建立的连接。
- 底层连接已关闭:接收时发生意外错误。
此外,我们注意到,在问题发生时登录服务器,尝试发出请求http://本地主机/etc,http://127.0.0.1/etc,http://192.168.xxx.xxx/等(本地 IP)都会给出“连接已重置”错误消息(Firefox)。IIS 和 Apache Web 请求均失败。我们能够从另一台计算机(使用 IP 地址或主机名)连接到服务器,并且我们可以从服务器连接到外部站点,并且在这段时间内对其自身执行 ping 不会中断。
问题会在一段随机时间内神奇地自行解决。有时我们可以在 24 小时内不出现问题,有时则只有 20-30 分钟。问题发生时,可能会持续几秒钟到几分钟(通常不超过 10-15 分钟)。
当我们从该服务器连接到数据库服务器或文件共享服务器时,我们也没有遇到任何问题。
关于我们应该寻找什么,您有什么想法吗?
更新: 因此我们仍然会遇到这些区域,但为了增加更多细节,我们会在连接到多个服务器和几种不同类型的连接时随机收到这些错误。我们在 cifs(文件共享)、SQL Server 和连接到 LAN 和 WAN 上的多个服务器以及连接到其自身的 Web 连接上遇到此错误。大多数情况下,它是“主机中的软件中止了已建立的连接。”
NETSH 转储
#========================
# Interface configuration
#========================
pushd interface
reset all
popd
# End of interface configuration
#========================
# Interface configuration
#========================
pushd interface ipv6
uninstall
popd
# End of interface configuration
# ----------------------------------
# ISATAP Configuration
# ----------------------------------
pushd interface ipv6 isatap
popd
# End of ISATAP configuration
# ----------------------------------
# 6to4 Configuration
# ----------------------------------
pushd interface ipv6 6to4
reset
popd
# End of 6to4 configuration
#========================
# Port Proxy configuration
#========================
pushd interface portproxy
reset
popd
# End of Port Proxy configuration
# ----------------------------------
# Interface IP Configuration
# ----------------------------------
pushd interface ip
# Interface IP Configuration for "SW-1A"
set address name="SW-1A" source=static addr=192.168.xxx.51 mask=255.255.255.0
add address name="SW-1A" addr=192.168.xxx.50 mask=255.255.255.0
set address name="SW-1A" gateway=192.168.xxx.254 gwmetric=0
set dns name="SW-1A" source=static addr=192.168.xxx.2 register=PRIMARY
add dns name="SW-1A" addr=192.168.xxx.3 index=2
set wins name="SW-1A" source=static addr=none
popd
# End of interface IP configuration
# ------------------------------------
# Bridge configuration (not supported)
# ------------------------------------
# ------------------------------------
# End of Bridge configuration
# ------------------------------------
# -----------------------------------------
# aaaa Configuration
# -----------------------------------------
# This script will NOT work across different versions of IAS.
# -----------------------------------------
# aaaa configuration script.
# Known Issues and limitations:
# Import/Export between different versions is not supported.
# IAS.MDB Version = 7
pushd aaaa
set config blob=\
blob snippped
\
AA\
*\
A7ACI/wD\
\
*\
A7ACI/wD\
\
*\
A7ACI/wD\
\
*\
A7ACI/wD\
\
*\
A7ACI/wD\
\
*\
A7ACI/wD\
\
*\
A7ACI/wD\
\
*\
A7ACI/wD\
\
*\
A7ACI/wD\
\
*\
A7ACI/wD\
\
*\
A7ACI/wD\
\
*\
A7ACI/wD\
\
*\
A7ACI/wD\
\
*\
A7ACI/wD\
\
*
popd
# End of aaaa show config
# End of aaaa configuration.
# -----------------------------------------
# Remote Access Configuration
# -----------------------------------------
pushd ras
set authmode mode = standard
delete authtype type = PAP
delete authtype type = SPAP
delete authtype type = MD5CHAP
delete authtype type = MSCHAP
delete authtype type = MSCHAPv2
delete authtype type = EAP
add authtype type = MSCHAP
add authtype type = MSCHAPv2
delete link type = SWC
delete link type = LCP
add link type = SWC
add link type = LCP
delete multilink type = MULTI
delete multilink type = BACP
add multilink type = MULTI
add multilink type = BACP
set user name = ASPNET dialin = policy cbpolicy = none
set user name = Guest dialin = policy cbpolicy = none
set user name = IUSR_WX-WWW1 dialin = policy cbpolicy = none
set user name = IWAM_WX-WWW1 dialin = policy cbpolicy = none
set user name = customuser1 dialin = policy cbpolicy = none
set user name = customuser2 dialin = policy cbpolicy = none
set user name = customuser3 dialin = policy cbpolicy = none
set user name = SUPPORT_388945a0 dialin = policy cbpolicy = none
set user name = customuser4 dialin = policy cbpolicy = none
popd
# End of Remote Access configuration.
# -----------------------------------------
# Remote Access AppleTalk Configuration
# -----------------------------------------
pushd ras appletalk
set negotiation mode = allow
popd
# End of Remote Access AppleTalk Configuration.
# -----------------------------------------
# Remote Access Diagnostics Configuration
# -----------------------------------------
pushd ras diagnostics
set rastracing component = * state = disabled
set modemtracing state = disabled
set cmtracing state = disabled
set securityeventlogs state = disabled
popd
# End of Remote Access Diagnostics Configuration.
# -----------------------------------------
# Remote Access IP Configuration
# -----------------------------------------
pushd ras ip
delete pool
set negotiation mode = allow
set access mode = all
set addrreq mode = deny
set broadcastnameresolution mode = disabled
set addrassign method = auto
popd
# End of Remote Access IP configuration.
# -----------------------------------------
# Remote Access IPX Configuration
# -----------------------------------------
pushd ras ipx
set negotiation mode = allow
set access mode = all
set nodereq mode = allow
set netassign method = autosame
popd
# End of Remote Access IPX configuration.
# -----------------------------------------
# Remote Access NBF Configuration
# -----------------------------------------
pushd ras netbeui
set negotiation mode = allow
set access mode = all
popd
# End of Remote Access NBF configuration.
# -----------------------------------------
# Remote Access AAAA Configuration
# -----------------------------------------
pushd ras aaaa
set authentication provider = windows
set accounting provider = windows
delete authserver name = *
delete acctserver name = *
popd
# End of Remote Access AAAA configuration.
# Routing Configuration
pushd routing
reset
popd
# IP Configuration
pushd routing ip
reset
set loglevel error
add preferenceforprotocol proto=LOCAL preflevel=1
add preferenceforprotocol proto=NetMgmt preflevel=10
add preferenceforprotocol proto=STATIC preflevel=3
add preferenceforprotocol proto=NONDOD preflevel=5
add preferenceforprotocol proto=AUTOSTATIC preflevel=7
add preferenceforprotocol proto=OSPF preflevel=110
add preferenceforprotocol proto=RIP preflevel=120
add interface name="SW-1B" state=enable
set filter name="SW-1B" fragcheck=disable
add interface name="SW-1A" state=enable
set filter name="SW-1A" fragcheck=disable
add interface name="Internal" state=enable
set filter name="Internal" fragcheck=disable
add interface name="Loopback" state=enable
set filter name="Loopback" fragcheck=disable
popd
# End of IP configuration
# ----------------------------------
# DNS Proxy configuration
# ----------------------------------
pushd routing ip dnsproxy
uninstall
popd
# End of DNS proxy configuration
# ----------------------------------
# IGMP Configuration
# ----------------------------------
pushd routing ip igmp
uninstall
popd
# End of IGMP configuration
# ----------------------------------
# NAT configuration
# ----------------------------------
pushd routing ip nat
uninstall
popd
# ----------------------------------
# OSPF configuration
# ----------------------------------
pushd routing ip ospf
uninstall
popd
# End of OSPF configuration
# ----------------------------------
# DHCP Relay Agent configuration
# ----------------------------------
pushd routing ip relay
uninstall
popd
# End of DHCP Relay configuration
# ----------------------------------
# RIP configuration
# ----------------------------------
pushd routing ip rip
uninstall
popd
# End of RIP configuration
# ----------------------------------
# Router Discovery Configuration
# ----------------------------------
pushd routing ip routerdiscovery
uninstall
add interface name="SW-1B" disc=disable minint=7 maxint=10 life=30 level=0
add interface name="SW-1A" disc=disable minint=7 maxint=10 life=30 level=0
add interface name="Internal" disc=disable minint=7 maxint=10 life=30 level=0
add interface name="Loopback" disc=disable minint=7 maxint=10 life=30 level=0
popd
# ----------------------------------
# DHCP Allocator Configuration
# ----------------------------------
pushd routing ip autodhcp
uninstall
popd
# End of DHCP Allocator Configuration
Loading of DLL WinsEvnt.dll failed.
Wins Operation failed with Error There are no more endpoints available from the endpoint mapper.
更新: 我们最终在 7 月底在同一硬件上安装了 Windows Server 2008 R2,问题就解决了,从此我们就再也没有回头。有一点就是你只能止损,咬紧牙关,坚持下去。
答案1
一种可能性是:短暂的端口耗尽。尝试netstat -an | find /c ":"
计算一下您在所有不同状态下有多少个连接。如果这个数字超过一万左右,那么很可能这就是您的问题。
答案2
您在事件日志中看到任何有用的信息了吗?驱动程序在启动时加载是否有问题?您可以检查交换机并查看系统的上行链路接口上是否存在传输或校验和错误吗?
如果重启时出现与网络相关的错误,我会首先解决这些问题。如果出现交换机错误,我会更换电缆并移至交换机上的其他端口。
如果没有错误,请考虑安装新网卡。最好的情况下,它可以解决问题,最坏的情况下,加上新电缆和不同的交换机端口,您可以将物理问题完全排除在外。
更新
考虑到这种情况发生在多台机器上,我认为我们可以排除物理层问题。
考虑到它是间歇性的并且会影响多项服务,我的想法是使用 TCP Chimney。请参阅此知识库文章:http://support.microsoft.com/kb/945977看看是否有帮助。
之后,关闭网络连接面板上除客户端、共享和 IP 协议之外的所有内容。没有 QOS、没有防火墙、没有 NLB、没有供应商级端口组合驱动程序等。
再次更新
好了,关闭所有设置后,我建议你接下来应该检查一下驱动程序级别的高级设置。如果可以,请在此处发布。如果不行,请写下来,然后尝试以下操作:如果流量控制已关闭,则将其打开 -- RX 和 TX 开启/响应和生成,具体取决于驱动程序。然后找到标记为卸载的任何内容并将其关闭。关闭巨型帧和 VLAN 支持。关闭标记为 QOS 的任何内容。基本上让硬件完成所有工作,并将任何 OS/驱动程序/CPU 任务从数据路径中移开。
最后,如果您可以在“事件”期间捕获服务器,请按照本文中的步骤检查内核页面使用情况,看看是否有助于诊断问题:http://blogs.msdn.com/b/david.wang/archive/2005/09/21/howto-diagnose-iis6-failing-to-accept-connections-due-to-connections-refused.aspx
我的最终建议
考虑关闭 SynAttackProtect 和其他内核级 TCP 保护:http://technet.microsoft.com/en-us/library/cc781167(WS.10).aspx或者至少提高可能导致其启动的 TcpMax* 设置。
答案3
我能想到两件事:
您的临时端口即将用完。如果您使用的是 Linux - 默认设置通常非常保守,因此您应该始终调整它们以供生产使用。您可以使用 进行检查
cat /proc/sys/net/ipv4/ip_local_port_range
。请注意,此问题可能不在服务器本身,而是在您的防火墙上,特别是如果您使用 NAT。您的文件描述符即将用尽。每个 TCP 连接需要 2 个文件描述符,因此通过计算打开的连接数,您可以估算所需的文件描述符数,并将其与系统限制进行比较。
ulimit -a
将为您提供当前限制。同样,默认的 Linux 设置比较保守(在 Centos 5.x 上,默认限制为 1024),因此您可能需要进行一些调整。
答案4
您的服务是否可能通过 Kerberos(通过 AD)相互验证身份,而调用的服务由于验证问题而停止回复?这应该可以通过 NetMon 或 WireShark 检测到。