上周发现大量服务器上的服务在从客户端接受大的数据包时,会发生系统蓝屏死机的情况,通过大量的测试和调试发现规律如下:
1、接收大于一定量(不同机器不同,一般是 6M)的数据时,服务会卡死在系统的 recv 函数调用中,此时服务无法正常停止,如果杀进程则系统蓝屏
2、一些情况下,在调用 recv 函数接收大数据量时,系统直接蓝屏死掉然后自动重新启动;
3、多次调用 recv 每次接收部分数据来接收总量同样多的数据时,则没有问题,但是效率极其低下,并且每次接收的数据量要控制在一个量以下,不同机器不同,一般是 1M 以下
4、采用异步套接字 recv 大量的数据则没有任何问题,并且效率没有任何影响;但是在个别机器上有连接丢失的情况发生,但是客户端的 recv 函数检测不到连接断开;
出差回来后,从方案实施部了解到该问题是因为网卡驱动程序和微软提供的TCP 高级特性不兼容,公司使用的HP服务器采用的是 Boardcom 的网卡,使用的是也是 Boardcom 的网卡驱动程序,在 Windows Server 2003 打上最新的微软补丁之后,系统开始出现蓝屏,将 MiniDump 文件发送给微软的工程师获得的答案是驱动程序不兼容引起的,在网卡驱动程序中释放之前已经释放的系统分页内存导致系统蓝屏死机,解决办法是:
1、更新网卡的驱动程序到最新版,同时 HP 的网站上已经说明了该现象并且新的服务器已经解决该问题;
2、禁用TCP的高级特性来网卡驱动进入有问题的代码,只需要修改注册表中的键值并重新启动服务器即可,脚本如下:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters]
"EnableTCPChimney"=dword:00000000
"EnableTCPA"=dword:00000000
"EnableRSS"=dword:00000000
因为客户哪里大量使用的是 DELL 的服务器,DELL 的服务器还没有解决该问题,所以需要“打补丁”禁用TCP的高级功能:接收端可伸缩、烟囱等;
不采用升级网卡驱动程序是因为服务器分散到各个城市只能远程桌面管理,一旦安装驱动失败,可能服务器就无法启动,需要到不同的城市去维护服务器,因此还是相信修改注册表重启更加保险一些,至少在一个特定的地方可以远程桌面维护所有的服务器;
唉,程序开发员变成了系统维护员了!
不过还是觉得远程桌面的兼容性和稳定性实在是很好呢。