有道难题POJ平台搭建技术小结
嗯,我不是来写这次有道难题的解题报告的。事实上,我没有参加这次有道难题的资格。因为我是比赛的POJ测试平台的管理员,我的职责是负责POJ平台在这次万人比赛中的稳定运行。
为了全力搭OJ平台准备这次比赛,我两周没有发twitter,也没有写博客。今天终于成功完成了三场资格赛,如释重负,来简单介绍一下在服务器架构建设中的经验。
程序方面,前端程序由我负责,全部用php编写,基于Zend Framework,数据库使用mysql,使用memcache作为缓存。这套程序在北大内部的百练系统(poj.grids.cn)已经稳定运行了半年。从今年年初开始,我们又对整个php代码和模型结构进行了重构,引入了小组的概念,并重新设计了用户界面。这次比赛前,我们又针对网易有道的需求,对系统的功能进行了强化。
后端评测程序,由dzx大牛负责,他改写了谢迪留下的评测端代码,将整个平台移植到了linux环境下,并用ptrace对评测程序的安全性重做了监控方案。用Java编写调度程序,用C编写评测监控程序。
硬件方面,由于实验室没有足够的服务器,因此web前端服务器主要由网易有道提供。5月24日的练习赛,我原以为只会有1000多人来参赛,就草率地只使用了一台apache + php + memcached服务器,一台mysql服务器。虽然之前网易的压力测试一再证明,我一整套php代码的执行效率非常低下,处理速度几乎比静态页面的慢6倍。但我还是认为经过php的静态优化之后,能够扛住1000人的同时访问。
结果现实情况远超过我预期。24日晚上有至少3000人同时登录比赛,整个比赛过程当中,服务器的 CPU占用率始终高居200%,网页基本完全打不开。我当时郁闷得不行,从来没在技术上那么丢人。后来回想起来,我用膝盖想想也应该知道会有很多人来参加练习赛,用一台普通的双核至强2.8G服务器怎么都挡不住这么高的并发。
痛定思痛,我们周二在天极网的现场视频答疑上一个劲地表决心,一定要解决高并发的问题。有道这边也觉得之前服务器给得太差了,一狠心在原来6台服务器的基础上,追加了10台至强5500服务器。内部讨论的时候,我们都以8000用户参加比赛为设计目标,我提出了最终采用的服务器方案:
9台apache+php应用服务器用来渲染网页,至强5504 (四核 2.0GHz),48GB DDR3内存,我本来只打算要6台,有道这边机器给得充足,不用白不用
4台mysql服务器,一主三从,配置是至强双核2.8GHz,之前的测试结果是mysql端基本没什么压力,所以没有把mysql部署在5500系列的新服务器上。
1台memcached服务器,配置是至强5504,48GB DDR3内存,由于memcache没有做分布,为了避免它成为性能瓶颈,就把它单独放在一台高性能服务器上
另外,由于在24日练习赛中出现了由于前端服务器阻塞,后端服务器无法回传评测结果的现象,因此我们在主mysql服务器上同时也部署了web服务,专门给后端服务器回传评测结果之用。
以上14台服务器主要由我调度,除此之外还有11台nginx前端服务器,5台在网通,4台在电信,2台在教育网,用来做反向代理。为了提高静态文件的访问效率,我们把静态文件直接放在nginx上,同时,对于一些访问量比较高,同时变化不频繁的页面,在nginx端做了页面缓存。
而在后端,我们在北大的机房里,部署了1台评测调度服务器,以及8台评测节点。
合计一下,服务器总数达到了9+4+1+11+1+8 = 34 台!其实我认为除了评测部分的9台服务器无法收缩之外,其他服务器至少可以砍掉一半。投那么多服务器主要还是因为练习赛挂得太惨,要力保正式比赛万无一失而不惜血本。
在正式比赛时,我们的服务器集群扛住了10000多人的同时访问,即使在最高峰的时候,我们的每一个网页,不论是静态还是纯动态,反应速度都在0.2秒以内。列举一下比赛相关数字:
nginx并发极限:约12000,发生在比赛开始后的5分钟内。
服务器最高CPU负荷:apache+php服务器(15%),mysql主机(100%,双核四线程,最高400%),mysql从机(50%),memcache服务器(5%)
评测端数据:8台评测服务器,比赛大多数时间里,每台服务器平均运行一个评测进程,极限情况,比赛结束五分钟内,Waiting的评测数量一度达到 700个,在比赛结束2分钟后全部评测完成。
各场比赛情况:
练习赛1:3747人提交程序,19954次提交
练习赛2:2886人提交程序,17168次提交
资格赛1:4849人提交程序,25797次提交
资格赛2:4126人提交程序,27215次提交
资格赛3:4136人提交程序,24521次提交
5场比赛的总共有9047人提交过程序
做了两年多网络技术开发工作,这还是第一次面对这么高并发的应用,真是一次学习的好机会。整个架设过程遇到了很多困难,积累了很多经验。在web应用方面很多php和mysql细节的经验,以后有时间再陆续介绍吧。
No related posts.
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:沈二 来源: 沈二铺子
- 标签: POJ
- 发布时间:2010-05-31 23:57:32
- [55] IOS安全–浅谈关于IOS加固的几种方法
- [53] android 开发入门
- [53] 如何拿下简短的域名
- [52] 图书馆的世界纪录
- [50] Go Reflect 性能
- [50] Oracle MTS模式下 进程地址与会话信
- [48] 【社会化设计】自我(self)部分――欢迎区
- [47] 读书笔记-壹百度:百度十年千倍的29条法则
- [36] 程序员技术练级攻略
- [29] 视觉调整-设计师 vs. 逻辑