梦幻西游服务器 IO 的一点优化

标签: 游戏开发 | 发表时间:2010-12-24 17:54 | 作者:云风 zz
出处:http://blog.codingnow.com/

关注梦幻西游服务器的性能问题,是源于前几天跟同事的聊天。谈到能否把梦幻西游服务器做成无盘站,或是放进虚拟机里,便于日常维护管理。

意外的了解到,现在磁盘 IO 性能居然成了梦幻西游服务器的瓶颈。而不是 CPU 或是网络带宽。据我所知,梦幻西游的服务器数据储存是这样做的:

主游戏进程不负责储存,一切都在内存中。所有玩家的数据就是内存数据结构。只是在玩家登陆的时候去读取一下本地的文本文件,以及登出的时候把数据序列化成文本,然后保存在本地文件中。

为了防止中途发生意外,游戏进程会定期把内存全部数据序列化,然后通过共享内存的方式让另一个 IO 进程不断的把数据保存在磁盘上。

这些都是 10 年前做的设计决策,无论是否合理,都已经稳定运行了很多年了。不少朋友问起,我们的游戏服务用的什么数据库系统,我都只好说,我们没有用数据库,只用了文件系统。面对诧异的目光,我都不想过多解释。好吧,其实我也觉得 SQL 神马的都是浮云。

目前在 8 千人以上同时在线的服务器上,磁盘 IO 非常繁忙,据说已经影响到了正常的游戏。由于长年的修修补补,整个系统已经不是上面提到的那些单纯。还有一些额外的 IO 操作,这些被定期写盘的 IO 操作影响到了。


直觉告诉我,这个环节做优化比较容易,事半功倍。之所以之前没有人做,只是因为很少人愿意去碰那些已经看起来稳定运行了很多年的系统,通过改善硬件就可以缓解的问题。

方法其实很简单。只需要简单部署一个内存 cache ,把所有需要读取的数据都在 cache 里存放起来,而不直接去读文件。这个东西可以找现成的方案,也可以自己写一个(不会太难)。之所以自己来写这个 cache ,是为了下一步方便。

接下来就是,每次定时存盘时,不在保存全部的数据,而只保存跟上一次数据的差异。简单说,就是先做一个 diff ,再保存。定时存盘仅仅是为了危机处理,只要信息都在,其实真没必要保存每个时间点的快照的。这是个通用的方法。找不到合适的通用工具的原因之一在于传统的 diff 软件是针对文本行的。而二进制 diff 的开源方案较少,且算法更复杂一些。

梦幻西游玩家持久化数据虽然是文本的,但没有特别的格式规范,明显带有多年演化的痕迹。有的文本行长达数千字节,简单的基于文本行的 diff 处理,效果不好。

而且总数据量较大。每个玩家的数据在 48K 以下。玩家数量级在 1 万左右。这样,每批数据量在百兆级。如果用独立工具,数据传递本身的开销就比较大了。定制一个服务来处理这个事情代价要小的多。以梦幻西游这个每月给网易带来上亿收入的产品来说。开发这种小程序的成本几乎可以忽略不计,需要的只是稳定可靠。

这两天我简单写了几百行 C 程序,实现了个简单的 diff ,没有怎么优化,只是把传统的 diff 中的回车分段改成了更多的可定义的分割符。把每个玩家几十 K 的文本数据块,分割成了 2000 来个数据元,用传统 diff 算法处理。

性能还可以接受,一秒可以处理 20 组玩家数据。玩家平均游戏时间半小时间的 diff 量是总数据量的 10% 左右。现在我们标准配置 8 核的服务器,通常都会闲置几个 CPU 出来,正好用来计算 diff 。减少 90% 的磁盘 IO 量(如果加上压缩,将更客观),优化后的效果将非常明显。

相关 [梦幻西游 服务器 io] 推荐:

梦幻西游服务器 IO 的一点优化

- zz - 云风的 BLOG
关注梦幻西游服务器的性能问题,是源于前几天跟同事的聊天. 谈到能否把梦幻西游服务器做成无盘站,或是放进虚拟机里,便于日常维护管理. 意外的了解到,现在磁盘 IO 性能居然成了梦幻西游服务器的瓶颈. 据我所知,梦幻西游的服务器数据储存是这样做的:. 主游戏进程不负责储存,一切都在内存中. 所有玩家的数据就是内存数据结构.

梦幻西游服务器的优化

- 阿贡 - 云风的 BLOG
在历史工程上修补是件麻烦的事情. 前两天说起梦幻西游服务器的优化. 这几天我到广州住下来,打算专门花一周时间搞定这件事. 由于以前都是网上聊天,只有坐到一起才能真正理解问题. 目前,梦幻西游,只使用单台机器,最高配置 8 个 CPU ,配置 8G 内存. 就算最热闹的服务器,也用不完这些资源(大约只用满了 3 个 CPU ,一半的内存).

Fio模拟Mysql服务器IO压力脚本

- 狗尾草 - Erlang非业余研究
原创文章,转载请注明: 转载自Erlang非业余研究. 本文链接地址: Fio模拟Mysql服务器IO压力脚本. fio是个非常好用的io压力模拟工具,功能非常齐全, 有兴趣的同学参看 这里. 这里我用fio模拟我们线上mysql服务器的压力来为厂家送来的pci-ssd卡做压力测试,底下是脚本(已经测试正确),也许有的同学有用.

sysbench测试MySQL服务器性能(cpu,io,内存,mysql等)

- - CSDN博客数据库推荐文章
Sysbench的安装请参考http://blog.csdn.net/mchdba/article/details/8951289. sysbench采用寻找最大素数的方式来测试CPU的性能. 首先生成需要的测试文件,文件总大小1000M,16个并发线程,随机读写模式. 执行完后会在当前目录下生成一堆小文件.

物理IO与逻辑IO

- - 操作系统 - ITeye博客
IO性能对于一个系统的影响是至关重要的. 一个系统经过多项优化以后,瓶颈往往落在数据库;而数据库经过多种优化以后,瓶颈最终会落到IO. 而IO性能的发展,明显落后于CPU的发展. Memchached也好,NoSql也好,这些流行技术的背后都在直接或者间接地回避IO瓶颈,从而提高系统性能. 上图层次比较多,但总的就是三部分.

网易投资1亿元拍《梦幻西游》动画片

- bill - cnBeta.COM
网易科技讯 10月17日消息,网易(Nasdaq:NTES)今日宣布,将投资1亿元为旗下网游《梦幻西游》拍摄同名动画片,同时开启动画制作团队的招募,网易CEO丁磊亲自参与该项目的运作.

linux异步IO浅析

- Sepher - kouu's home
知道异步IO已经很久了,但是直到最近,才真正用它来解决一下实际问题(在一个CPU密集型的应用中,有一些需要处理的数据可能放在磁盘上. 预先知道这些数据的位置,所以预先发起异步IO读请求. 等到真正需要用到这些数据的时候,再等待异步IO完成. 使用了异步IO,在发起IO请求到实际使用数据这段时间内,程序还可以继续做其他事情).

java nio和io的比较

- - 互联网 - ITeye博客
第一部分:简单介绍NIO.     服务器在合理时间内处理大量客户机的请求的能力取决于服务器使用I/O流的效率,同时为成百上千的客户提供服务的服务器必须能并发的使用I/O服务.     用Java语言写的服务器,由于其线程与客户机之比几乎是一比一,因而易受到大量线程开销的影响,其结果是即导致性能问题,又缺乏伸缩性.

C++之文件IO操作流

- Nanqi - 博客园-首页原创精华区
  前两节介绍了C++的IO流类库,标准设备IO操作流中部分预定义流对象的成员函数以及IO格式控制. 那今天我将继续介绍关于C++中的流操作内容——文件IO操作流fstream. 并会着重讲解C++是如何对文件进行操作的.   文件指存放在外部介质上的数据的集合. 大家都知道操作系统是以文件为单位来对数据进行管理的.

异步IO一定更好吗?

- Wolf - CNode社区
在长林的文章《nodejs异步IO的实现》中提到,NodeJS通过libeio来实现IO操作的异步化,而libeio采用多线程的方式来模拟异步操作. 这里我需要强调一个观点,异步IO虽然是NodeJS一个非常重要的特点,但异步IO并不总是最好的,其他语言也一样. 在我的磁盘上有2个文件,我希望在一个程序里读取这2个文件,每次输出一个字符.