文章
从一段代码里看 FreeBSD 与 Linux 内存分配的不同
唉,拖延症无以复加了。 最近,公司移植服务器端游戏引擎到 Linux 上的时候,遇上了段错误。问题代码大略如下: char *arr = malloc(len); ... if (IsInvalid(arr[0])){ arr++; } ... free(arr); 很明显,对操作系统分配的内存块进行了指针操作后,再扔回到 free 函数进行释放,是会导致异常行为的。但是,该引擎的代码已经有较长的历史了,为什么在 FreeBSD 上没有遇到问题呢? 这主要是因为 FreeBSD 与 Linux …
唉,拖延症无以复加了。 最近,公司移植服务器端游戏引擎到 Linux 上的时候,遇上了段错误。问题代码大略如下: char *arr = malloc(len); ... if (IsInvalid(arr[0])){ arr++; } ... free(arr); 很明显,对操作系统分配的内存块进行了指针操作后,再扔回到 free 函数进行释放,是会导致异常行为的。但是,该引擎的代码已经有较长的历史了,为什么在 FreeBSD 上没有遇到问题呢? 这主要是因为 FreeBSD 与 Linux …
存储器性能测试
Xeon E5620 E7500 In virtual machine, E7500 最近做了个存储器性能测试,结果如上图。z 轴表示速度,单位是 MB/s, x 轴和 y 轴一个表示步长,即两次访问数据之间的距离;另一个是读写的数据总量,单位是字节。源代码可以通过 http://csapp.cs.cmu.edu/public/1e/public/mountain.tar 获取。 这个测试是 CSAPP 书里用来说明存储器山的一个实验。关于这个测试,有两个基本的概念:时间局部性与空间局部性。 …
Xeon E5620 E7500 In virtual machine, E7500 最近做了个存储器性能测试,结果如上图。z 轴表示速度,单位是 MB/s, x 轴和 y 轴一个表示步长,即两次访问数据之间的距离;另一个是读写的数据总量,单位是字节。源代码可以通过 http://csapp.cs.cmu.edu/public/1e/public/mountain.tar 获取。 这个测试是 CSAPP 书里用来说明存储器山的一个实验。关于这个测试,有两个基本的概念:时间局部性与空间局部性。 …
欢送 2012
新年快乐!2012 年就要过去了,本月看代码为主,少动手了,分享两篇文章给大家: 第一篇是 varnish 作者 Poul henning 写的,题为 Notes from the Architect,作者的观点可以总结为三点: 相信虚拟存储系统,不要手动进行内存分页管理,而是依赖虚存系统做这件事。不要和虚存系统作对。 减少内存的访问次数,最小化多核心之间对于 cache 的争夺。 合理调度线程,按最近工作时间来安排,尽可能保证 cache 已处于热身状态。 另一篇是 LuaJit 的作者 …
新年快乐!2012 年就要过去了,本月看代码为主,少动手了,分享两篇文章给大家: 第一篇是 varnish 作者 Poul henning 写的,题为 Notes from the Architect,作者的观点可以总结为三点: 相信虚拟存储系统,不要手动进行内存分页管理,而是依赖虚存系统做这件事。不要和虚存系统作对。 减少内存的访问次数,最小化多核心之间对于 cache 的争夺。 合理调度线程,按最近工作时间来安排,尽可能保证 cache 已处于热身状态。 另一篇是 LuaJit 的作者 …
tig 支持中文搜索
tig 是一个基于 ncurses 库的 git log、status 的浏览器,看 log 的时候非常方便,可以非常简单的查看每次 log 的 diff,同时方便的切换到其他视角例如 diff、blame、tree 等等。但是,tig 有一个问题,不支持搜索中文。 检查了相关的 issue 以后,确认了链接时使用 -lncursesw,支持中文这种宽字符的显示,实际应用中也可以显示,但就是没办法搜索中文。于是,我向作者报告了这个 …
tig 是一个基于 ncurses 库的 git log、status 的浏览器,看 log 的时候非常方便,可以非常简单的查看每次 log 的 diff,同时方便的切换到其他视角例如 diff、blame、tree 等等。但是,tig 有一个问题,不支持搜索中文。 检查了相关的 issue 以后,确认了链接时使用 -lncursesw,支持中文这种宽字符的显示,实际应用中也可以显示,但就是没办法搜索中文。于是,我向作者报告了这个 …
为什么 go 语言适合开发网游服务器端
前段时间在golang-China读到这个贴:有木人用(或打算)golang做游戏服务器端? 个人觉得golang十分适合进行网游服务器端开发,写下这篇文章总结一下。 从网游的角度看: 要成功的运营一款网游,很大程度上依赖于玩家自发形成的社区。只有玩家自发形成一个稳定的生态系统,游戏才能持续下去,避免鬼城的出现。而这就需要多次大量导入用户,在同时在线用户量达到某个临界点的时候,才有可能完成。因此,多人同时在线十分有必要。 再来看网游的常见玩法,除了排行榜这类统计和数据汇总的功能外,基本没有需要大 …
前段时间在golang-China读到这个贴:有木人用(或打算)golang做游戏服务器端? 个人觉得golang十分适合进行网游服务器端开发,写下这篇文章总结一下。 从网游的角度看: 要成功的运营一款网游,很大程度上依赖于玩家自发形成的社区。只有玩家自发形成一个稳定的生态系统,游戏才能持续下去,避免鬼城的出现。而这就需要多次大量导入用户,在同时在线用户量达到某个临界点的时候,才有可能完成。因此,多人同时在线十分有必要。 再来看网游的常见玩法,除了排行榜这类统计和数据汇总的功能外,基本没有需要大 …
LPC 及 MudOS 简介 ( 一 )
天下盛境这个项目让我萌生退意了,拖延了一个多月,没想到公司居然先解散了。接着是面试,入职新公司,回头看来,还是感慨人算不如天算阿。 新公司也是游戏行业的,初看了下项目的架构,与以前的有较大差别,是一套脱胎于 MudOS 的异步 IO、多进程的游戏架构。于是最近在研究 Mudos 的相关知识。刚刚入门,挑了最简单的 Lil Mudlib 进行学习,Mudos 的版本为 v22.2b14,既能够成功跑起来接受玩家的链接,又不会有复杂的功能阻碍理解,正好动手边改边学。 LPC 是一门专门为 Mudos …
天下盛境这个项目让我萌生退意了,拖延了一个多月,没想到公司居然先解散了。接着是面试,入职新公司,回头看来,还是感慨人算不如天算阿。 新公司也是游戏行业的,初看了下项目的架构,与以前的有较大差别,是一套脱胎于 MudOS 的异步 IO、多进程的游戏架构。于是最近在研究 Mudos 的相关知识。刚刚入门,挑了最简单的 Lil Mudlib 进行学习,Mudos 的版本为 v22.2b14,既能够成功跑起来接受玩家的链接,又不会有复杂的功能阻碍理解,正好动手边改边学。 LPC 是一门专门为 Mudos …
大面积断线原因分析
昨天,在台服上运行的服务器爆发了大面积断线。从时间点上看,跟一个副本活动高度重合,因此,今天早上就紧急屏蔽了该活动模块。 拿到 log 进行分析,看到的异常大部分是从战斗副本返回主城时发生的。副本活动产生的异常倒是没有看到,而且这个副本在国内也经历过几个运营商实际运营的测试,出现问题的机会应该比较少。 从战斗副本返回主城的过程经过一次调整,原有的流程是副本退出时保存到 mysql,再在主城里从数据库恢复过来。现有的流程,是先把所需数据打包,然后通过 tcp 发送到主城,由主城进行解包并恢复到角色 …
昨天,在台服上运行的服务器爆发了大面积断线。从时间点上看,跟一个副本活动高度重合,因此,今天早上就紧急屏蔽了该活动模块。 拿到 log 进行分析,看到的异常大部分是从战斗副本返回主城时发生的。副本活动产生的异常倒是没有看到,而且这个副本在国内也经历过几个运营商实际运营的测试,出现问题的机会应该比较少。 从战斗副本返回主城的过程经过一次调整,原有的流程是副本退出时保存到 mysql,再在主城里从数据库恢复过来。现有的流程,是先把所需数据打包,然后通过 tcp 发送到主城,由主城进行解包并恢复到角色 …
断线与资源释放
断线先不释放资源,待刚刚收到的请求完成后,再统一回收资源 开发框架应该提供一套通用的日志监控接口和资源分配接口,以确定资源的消耗情况,确定性能热点。
断线先不释放资源,待刚刚收到的请求完成后,再统一回收资源 开发框架应该提供一套通用的日志监控接口和资源分配接口,以确定资源的消耗情况,确定性能热点。
RPC 的思考
基于 google protobuf 的 rpc 框架介绍系列文章 目前,基于消息包的消息收发 步骤:确定前端需要的相关信息 定义交互步骤 编写相应的 proto 文件 编译,分别生成前后端代码 层次太低。对前后端交互的思考,是在函数调用的层面上的,但是实际上做的,却是将函数调用手动转为数据包。针对具体传递的消息编写消息包的 proto,本无可厚非。但是,每次都要编写内容为空的 Request 包让我很蛋疼。究其原因,是每次都需要重写 Request/Response 语义的东东。 语义:基于函 …
基于 google protobuf 的 rpc 框架介绍系列文章 目前,基于消息包的消息收发 步骤:确定前端需要的相关信息 定义交互步骤 编写相应的 proto 文件 编译,分别生成前后端代码 层次太低。对前后端交互的思考,是在函数调用的层面上的,但是实际上做的,却是将函数调用手动转为数据包。针对具体传递的消息编写消息包的 proto,本无可厚非。但是,每次都要编写内容为空的 Request 包让我很蛋疼。究其原因,是每次都需要重写 Request/Response 语义的东东。 语义:基于函 …
【翻译】HowwemakeGitHubfast( 我们如何让 github 更快 )
译者注:我是一名开源爱好者,十分喜爱 github,github 也是一个乐于分享的站点。这篇文章介绍了 github 为应对更高访问量而搭建的架构,虽然已经是 09 年的文章,仍有一定的参考价值,因此翻译此文分享给大家 [ 我们如何让 github 变得更快 ](https://github.com/blog/530-how-we-made-github-fast) mojombo October 20, 2009 Translations: Беларускі, Deutsch, …
译者注:我是一名开源爱好者,十分喜爱 github,github 也是一个乐于分享的站点。这篇文章介绍了 github 为应对更高访问量而搭建的架构,虽然已经是 09 年的文章,仍有一定的参考价值,因此翻译此文分享给大家 [ 我们如何让 github 变得更快 ](https://github.com/blog/530-how-we-made-github-fast) mojombo October 20, 2009 Translations: Беларускі, Deutsch, …
tricks: 如何把 sqlalchemy 的数据转化为 json 格式
sqlalchemy 最恶心的对象,就是通过 execute 得到的结果,那是 rowproxy 列表。为了优化,rowproxy 使用了 slot,使其失去了动态性,而又经常要转换成 json 格式,于是可以这样: d=dict(rowproxy.items()) json.dumps(d)
sqlalchemy 最恶心的对象,就是通过 execute 得到的结果,那是 rowproxy 列表。为了优化,rowproxy 使用了 slot,使其失去了动态性,而又经常要转换成 json 格式,于是可以这样: d=dict(rowproxy.items()) json.dumps(d)
项目总结
入职一年有余了。 收获 第一次参加实战项目,也是第一次参加多人协作的项目,感觉很新鲜。回头看,学校应该多开展这样的训练。多人协作跟个人开发最大的不同,是需要大量阅读他人的项目代码,在实现功能的时候,也需要不断的进行妥协。要阅读一个新项目的代码,从最初的版本 checkout 进行阅读往往是比较好的选择,可以比较清晰的看到项目的架构思想,把握模块开发的惯用法。另外,首先阅读核心工具库帮助很大,一是能够很清晰看到老大的功力(笑),二是对于阅读他人的新模块,尽快投入开发,能够有较大帮助。 在学校学习 …
入职一年有余了。 收获 第一次参加实战项目,也是第一次参加多人协作的项目,感觉很新鲜。回头看,学校应该多开展这样的训练。多人协作跟个人开发最大的不同,是需要大量阅读他人的项目代码,在实现功能的时候,也需要不断的进行妥协。要阅读一个新项目的代码,从最初的版本 checkout 进行阅读往往是比较好的选择,可以比较清晰的看到项目的架构思想,把握模块开发的惯用法。另外,首先阅读核心工具库帮助很大,一是能够很清晰看到老大的功力(笑),二是对于阅读他人的新模块,尽快投入开发,能够有较大帮助。 在学校学习 …