服务器配置成功支撑了双11活动,圆满完成。
服务端架构:1台Apache作为代理,1台Tomcat提供抽奖活动服务,另外1台Tomcat提供用户认证服务。活动秒杀时间为11月11日11点11分。
1. 已记录的运行峰值:
1.1 已记录的网络连接和进程数据:
Apache:
网络连接达到8803,Apache进程达到997,峰值持续11分钟,从开始前2分钟到秒杀点后10分钟。这两个参数,从早上9点开始增加,到秒杀点达到峰值,随后在2个小时之后回复平时水平。平时水平,两个参数分别小于100。
Tomcat活动:
tomcat句柄数达到1156,网络连接达到3569,峰值持续11分钟,从开始前2分钟到秒杀点后10分钟。这两个参数,从早上9点开始增加,到秒杀点达到峰值,随后在1个小时之后回复平时水平。平时水平,两个参数分别是小于200和小于100。
Tomcat认证:
未记录。事先认为此服务器的负载不会太大,原因是此服务器仅仅作为后台管理和后续处理。及时性要求不高,因此没有作为监控目标。结果发现,这里其实不仅提供用户认证功能,还有调用外部服务进行后续处理的接口,由于对方限制,应用抛出了大量异常,造成日志迅速增加。好在日志增加到1.4G时,活动就结束了。
1.2 已记录的磁盘数据:vmstat
Apache:
bi峰值0,bo峰值1992。平时水平,bi平均值0,bo小于100。
Tomcat活动:
bi峰值4,bo峰值9972。平时水平,bi平均值0,bo小于100。
Tomcat认证:
bi峰值6176,bo峰值191020。平时水平,bi平均值0,bo小于600。
2. 配置项目:
Apache:
修改了Apache的prefork.c 的配置,设置启动进程数为50个,详细如下:
StartServers 50 MinSpareServers 50 MaxSpareServers 50 ServerLimit 1500 MaxClients 1000 MaxRequestsPerChild 10000
修改打开文件数到32768。
Tomcat活动:
修改了Connector的protocol,使用Nio。最大线程数设定为32000,如下所示:
<Connector port="8080"
URIEncoding="utf-8"
maxThreads="32000"
protocol="org.apache.coyote.http11.Http11NioProtocol"
socket.appReadBufSize="1024"
socket.appWriteBufSize="1024"
bufferSize="1024"
connectionTimeout="20000"
redirectPort="8443" />
修改打开文件数到32768。
Tomcat认证:
使用默认配置。
3. 并发用户数量
秒杀时刻,后台管理记录显示并发用户超过9000。
4. 总结
从事后记录,和当时的观测来看,整个活动过程很平稳顺利。服务器没有发生不能支持负载的现象。服务器的各项配置参数得到了验证。为今后开展类似活动,建立了基础,和参考的基准。
遗憾的是,没有估计到认证服务器的处理量,以及后台处理中,外部服务接口的瓶颈,导致Tomcat日志大小迅速增加。好在能够成功支撑到活动结束。
在活动结束后,立刻追加了监控并分割Tomcat日志的脚本。以防止今后出现类似问题。