zoukankan      html  css  js  c++  java
  • 一次httpserver优化的经验和教训(silverlight游戏

    金X因为被推荐到ACFUN游戏排行第一名。并同一时候在17YY、7K7K、U77、17173等各大小游戏站点上线。迎来了在线用户数量的爆炸式增长。眼下各大站点使用外链方式。也就是实际链接到金X官网的server。

    金X 0.5 刚上线。UV从3000+增长到2万+。PV从400万增长到1000万+


    这里说一下金X的服务端架构,由于是一直凑合的一个环境,眼下很老土:

    使用的一台非常老的DELL 2950server(8线程CPU,2G内存),100MB独享联通/电信双线带宽。server操作系统 CentOS6.3。WEBserver为apache,部署的服务包含:


    1、apache文件服务(silverlight主体xap包 + 图片、音乐【均动态载入】)

    2、游戏联机PK server。侦听两个tcpport

    3、数据库mysql

    4、官网wordpress(php)

    5、日志分析服务awstats(crontab启动)

    6、防火墙等等

    7、代码svnserver


    一台如此破旧的server。部署了这么多功能。还是单点。可想有多么的脆弱。

    上线后,玩家普遍反映载入非常缓慢。玩家体验非常不好。

    对于长期来说。肯定须要换server以及整个应用的部署结构,当然这些须要时间和资源。我们先在当前已有的资源下进行优化。

    因为apache參数是系统安装时默认的,于是首先想到的优化apache的參数。我的想法也非常easy:

    1、因为游戏资源是动态载入的,于是我把KeepAlive打开,添加KeepAliveClients的连接数;

    2、因为玩家众多,将默认的MaxClients从250增大(同一时候增大StartServer、Spare等參数),以提高并发服务能力;


    改动后,自己试了试,感觉效果还算比較明显。于是就让整个应用跑了起来。结果……

    一小时后。玩家反馈游戏加载不了了,赶紧pingserver,ping不通……连接不上了。木有办法。打电话给IDC机房让硬重新启动。


    重新启动后把各个服务起起来。思考可能导致的问题,怀疑有可能导致死机的:

    1、awstats分析日志的服务启动太频繁(1分钟一次)

    2、apache内存吃爆了


    于是開始行动。

    1、关闭crontab

    2、将apache的若干參数调小(MaxClients、StartServer等)

    改动后,感觉server性能明显下降了,訪问网页、图片等明显变慢。只是想着先应付着至少不死机,回家!

    结果……


    出租车还在路上。手机收到玩家反馈,游戏加载不了了——server又崩了。

    木有办法,继续打电话给IDC机房,硬重新启动。

    下车飞奔到家,打开电脑。又一次開始配置server,思考可能导致的问题:

    1、还是仅仅可能是apache内存撑爆

    继续改小各个针对并发的分配数,缩小KeepAlive的超时时间!

    试执行!——半个小时候继续崩溃。


    没辙,開始一行一行看apache的配置文件,最后发现两个问题:

    1、KeepAlive 真的须要开么?——尽管金X有大量的图片和音乐须要动态载入。理论上KeepAlive打开的话对于单个玩家的载入速度有优点。但这样对于总体的大规模玩家数量的訪问,无法有效的回收和利用server资源,而且会导致玩家请求大规模排队的情况,表现就是 一些用户认为“非常流畅”。还有一些用户认为“非常卡”

    2、work.c的MaxRequestPerChild默认设置成0了——在大量client请求的情况下,(由于我client使用的线程池没有指定池的maxsize。所以会疯狂的请求服务端。造成每一个client可能有一大堆的request。这个地方可能会导致内存爆掉)


    果断改动两处。然后尝试着再将MaxClients数量调大一些,公布!

    —— 加载速度大为提升。

    —— 稳定执行,至今没死机了!


    经验教训:

    1、优化參数须要结合server性能;

    2、大规模用户并发訪问时,慎用KeepAlive



    附apache当前活跃clients监控命令: 

    watch -n 1 -d "pgrep httpd|wc -l"



  • 相关阅读:
    Java实现 LeetCode 400 第N个数字
    Java实现 LeetCode 400 第N个数字
    Java实现 LeetCode 399 除法求值
    Java实现 LeetCode 399 除法求值
    Java实现 LeetCode 399 除法求值
    Java实现 LeetCode 398 随机数索引
    Java实现 LeetCode 398 随机数索引
    Java实现 LeetCode 398 随机数索引
    linux中的cd ..和cd -命令有什么区别?
    GCC使用
  • 原文地址:https://www.cnblogs.com/llguanli/p/6795731.html
Copyright © 2011-2022 走看看