一次由于负载过高导致的运营事故
本周我们游戏《怪物世界》在运营过程中,出现了一次严重影响外网玩家的运营事故。因为情况比较特殊,特记录如下。
先说一下游戏本身,这是一个大世界的MMO ARPG,所谓大世界是指不会分区,所有玩家的数据都是在一个世界里面。项目在11年6月正式上线,已经在外网跑了一年多,现在程序已经比较稳定。程序本身的性能也一直表现良好,整个系统的最高在线实际有跑到三万多,单台服务器的实际负载有跑到七千多,对于一个运算性能并不低的ARPG来说,数据也算是不错的了。在正常维护更新的情况下,不应该再出大的运营事故才对。
意外首先发生的这周的头几天,偶尔在线曲线能看到有几处陡降,和运维勾通过后,也没有在网络和服务器性能上发现什么问题。
直到周四,八点左右有一个明显的在线陡降。看了一下,每台机器的在线都有下降,意识到应该是整个系统有某个单点故障。这时运维大大已经先联系过来,说某台机器的负载有问题。
这是一台有八核CPU的服务器,放了几个登陆进程,还有一些后台处理进程。看了一下机器负载,CPU Utilization并不高,30%都不到,但Load average很高,已经超过了30。就有点想不明白了,这台机器主要是负责登陆,计算量并不大,CPU Utilization不高也说明了这点,那么load average为什么会走高。
Linux下的load average,除了会把正在使用和请求CPU资源的进程纳入计算外,还会计算当前正在使用IO而IO没有返回的进程。即然CPU Utilization本身不高,那么应该不是请求CPU所致,那么就只有可能是IO有问题了。这里可以参考我之前的blog :http://www.cnblogs.com/crimsonzh/archive/2012/09/07/2676118.html
可是我们的进程不应该有大的IO才对,登陆请求的次数是位稳定的,数据库IO也一直很低,这些IO来自哪里呢?真的需要《走近科学》了。。。为何IO突然走高?为何游戏在线陡降?敬请关注《走近科学》。。。
我重新过了一下这两周的版本,唯一可疑的是一个邮件告警的进程。这个进程的目的是收集游戏内的LUA脚本报错,并用邮件的方式通知开发者。程序收集游戏进程抛关过来的数据,并用linux 系统的mail程序,发送给目的邮箱。我看了一下进程,果然有看到很多mail进程,应该就是这个进程阻塞在IO系统导致的了。临时处理了一下,整个系统果然都正常了。
事后总结了一下,这个程序在更新LUA出错报警的功能时,有出一个BUG,并没有过滤已经发过的错误。悲剧的是本周的版本脚本确实有一个错误,处在一个会经常触发的位置。结果导致待发的邮件堆积,引起系统负载过高,进而影响外网玩家的登陆。
但这里有一个问题没有得到解答,从CPU Utilization不高而load average高可以看出来,这时mail进程确实阻塞在IO上,但为什么调用mail程序发送邮件时,会导致磁盘IO操作呢?
欢迎知道内情的同学留言回答,或是邮件交流~~
浙公网安备 33010602011771号