【问题现象】

  每天总有部分游戏出现索引错误,错误文件没有规律,几乎所有游戏都会出现。控制台提示自动修复 3 次失败,需要手动修复。

 


【原因说明】

  经详细排查后发现是服务端内存故障导致更新游戏时加载到内存中的索引文件不完整或有错误信息,最终导致游戏下载不完整,出现索引错误。


【解决方案】

  更换服务器内存。


【问题分析】

常见的索引错误有以下几种可能,先按常规方式一步一步排查:

1:服务器中毒,将所有exe文件感染,在客户机更新游戏或同步节点同步游戏请求到的索引文件中记录的exe文件信息与实际exe文件不符,造成索引错误。(文件与索引不一致)

2:磁盘文件系统损坏,或者硬盘有坏道,写进磁盘的文件出现异常。索引文件中记录的文件等信息与实际文件不符造成索引错误(文件与索引不一致)。

3:服务器安装了杀毒软件将游戏文件误杀,客户机更新游戏或同步节点同步游戏都是根据索引文件来下载文件的,如果文件丢失会造成文件不存在的索引错误信息。(文件不存在)

4:游戏整个文件夹丢失,索引文件也没有了,客户机更新或同步节点同步游戏时找不到索引文件造成索引错误(索引不存在)

因每天都会有游戏索引错误,而且也并不是固定某个游戏,查看索引错误的详细信息如下图:

  排除第一点可能,错误的文件并不是exe。另外服务器也装有杀毒软件,杀毒软件中并没有扫描出病毒的情况。 随后查看服务器磁盘是否有损坏,有些时候磁盘文件系统错误并不一定会在系统日志中显示,所以还是先chkdsk一下游戏分区。

  chkdsk后并没有发现有损坏的情况,随后使用工具查看是否存在物理坏道,简单使用硬盘哨兵查看后并无异常。唯一值得怀疑的是存放游戏的磁盘是西部数据绿盘,而就因为此问题服务器硬盘整体都换过,之前的硬盘是企业盘,也是一样存在此问题。

  随后检查杀毒软件是否是误杀了游戏目录下的文件,检查杀毒软件日志并没有病毒查杀的迹象。为彻底排除此项,在杀毒软件中将游戏整体文件夹排除,如下图:

  观察两天后,此问题再次出现,至此1、2、3点均已经排除,第4点经过检查游戏文件并未丢失,随后分析网维大师BarServer程序的日志,搜索“自动”的关键字可以搜索到自动修复索引时所打印的日志,日志上方就是导致索引错误的日志内容了。通过分析发现在自动修复前会打印如下日志:

  • [09:30:31.812]|[0850]|[Error]|[PackageCache(12498)] LoadAndSendFileBlock TcpSend Failed. Link=0x6352, PkgId=12498, BlockId=8157.
  • [09:30:31.812]|[0850]|[Error]|[PackageCache(12498)] LoadAndSendFileBlock TcpSend Failed. Link=0x6352, PkgId=12498, BlockId=8554.

导引的错误日志大致意思是:

[错误][PkgId为12498的包缓存]通过Tcp发送 加载并发送文件块时失败,连接=0x6352,游戏ID=12498,块ID=8554

错误文件如下:

  • [Warning]|PkgDownCache [12498] File=H:\棋牌游戏\零点棋牌游戏中心\SparrowSanGuo\GameImage.zip ErrorType=1.

  我们看到日志打印的信息是由于在下载过程中发送文件块失败,而文件块的内容是记录在索引文件中的,读取索引文件后的信息是储存在内存中的。随后使用内存检测工具检测服务端内存,判断是否是内存故障引起的索引错误。

  内存检测工具 MemTest 免费版.rar (8.0 KB, 139 次)

  打开内存检测工具首先分割了800M的内存进行测试,测试不到2分钟的时间,就已经提示错误,如下图:

最终定位问题到服务器内存。