金X由于被推荐到ACFUN游戏排行第一名,并同时在17YY、7K7K、U77、17173等各大小游戏网站上线,迎来了在线用户数量的爆炸式增长。目前各大网站使用外链方式,也就是实际链接到金X官网的服务器。
金X 0.5 刚上线,UV从3000+增长到2万+,PV从400万增长到1000万+
这里说一下金X的服务端架构,因为是一直凑合的一个环境,目前非常老土:
使用的一台很老的DELL 2950服务器(8线程CPU,2G内存),100MB独享联通/电信双线带宽,服务器操作系统 CentOS6.3,WEB服务器为apache,部署的服务包括:
1、apache文件服务(silverlight主体xap包 + 图片、音乐【均动态加载】)
2、游戏联机PK server,侦听两个tcp端口
3、数据库mysql
4、官网wordpress(php)
5、日志分析服务awstats(crontab启动)
6、防火墙等等
7、代码svn服务器
一台如此破旧的服务器,部署了这么多功能,还是单点,可想有多么的脆弱。
上线后,玩家普遍反映加载非常缓慢,玩家体验很不好。对于长期来说,肯定需要换服务器以及整个应用的部署结构,当然这些需要时间和资源,我们先在当前已有的资源下进行优化。
由于apache参数是系统安装时默认的,于是首先想到的优化apache的参数。我的想法也很简单:
1、由于游戏资源是动态加载的,于是我把KeepAlive打开,增加KeepAliveClients的连接数;
2、由于玩家众多,将默认的MaxClients从250增大(同时增大StartServer、Spare等参数),以提高并发服务能力;
修改后,自己试了试,感觉效果还算比较明显。于是就让整个应用跑了起来。结果……
一小时后,玩家反馈游戏载入不了了,赶紧ping服务器,ping不通……连接不上了。木有办法,打电话给IDC机房让硬重启。
重启后把各个服务起起来。思考可能导致的问题,怀疑有可能导致死机的:
1、awstats分析日志的服务启动太频繁(1分钟一次)
2、apache内存吃爆了
于是开始行动,
1、关闭crontab
2、将apache的若干参数调小(MaxClients、StartServer等)
修改后,感觉服务器性能明显下降了,访问网页、图片等明显变慢,不过想着先应付着至少不死机,回家!结果……
出租车还在路上,手机收到玩家反馈,游戏载入不了了——服务器又崩了。 木有办法,继续打电话给IDC机房,硬重启。
下车飞奔到家,打开电脑,重新开始配置服务器,思考可能导致的问题:
1、还是只可能是apache内存撑爆
继续改小各个针对并发的分配数,缩小KeepAlive的超时时间!试运行!——半个小时候继续崩溃!
没辙,开始一行一行看apache的配置文件,最后发现两个问题:
1、KeepAlive 真的需要开么?——虽然金X有大量的图片和音乐需要动态加载,理论上KeepAlive打开的话对于单个玩家的加载速度有好处,但这样对于整体的大规模玩家数量的访问,无法有效的回收和利用服务器资源,并且会导致玩家请求大规模排队的情况,表现就是 一些用户觉得“很流畅”,另一些用户觉得“非常卡”
2、work.c的MaxRequestPerChild默认设置成0了——在大量客户端请求的情况下,(因为我客户端使用的线程池没有指定池的maxsize,所以会疯狂的请求服务端,造成每个客户端可能有一大堆的request,这个地方可能会导致内存爆掉)
果断修改两处,然后尝试着再将MaxClients数量调大一些,发布!
—— 载入速度大为提升!
—— 稳定运行,至今没死机了!
经验教训:
1、优化参数需要结合服务器性能;
2、大规模用户并发访问时,慎用KeepAlive
附apache当前活跃clients监控命令:
watch -n 1 -d "pgrep httpd|wc -l"