如何提高web系统的吞吐能力?

12-01-16 liny

我刚刚开发了一个小型的网上商店,采用的是struts1.3的一部分代码来做的交易分发,前端用javascript在jQuery的基础上自己做的UI组件。对系统也做了一些性能优化上的考虑,比如将相对变动较少的信息在应用servlet初始化的时候就缓存在服务端啊,再比如商品类前端UI组件使用OO设计,缓存该商品相关的信息,通过改变UI的样式来达到在同一张页面不刷新展现商品的列表信息和详细信息,而不是重新向服务器请求不同的页面等等。

系统部署环境:windows server 2003 + tomcat7 + mysql5.5

通过使用JMeter测试,在一个较为常见的用户场景构成的测试计划下(包括用户登录,查看网站各个页面,挑选商品,查看个人信息,结算,退出等等),启动1000个用户线程,在30分钟内做不断的上述测试计划的操作循环。系统运行比较稳定,交易成功率为100%,CPU的占用也比较低。

我在想,如果按照目前单台服务器部署可以支持1000名在线用户正常使用的话,那么更多的用户应该怎么做?

如果是做集群,那么我想支持的在线人数按照线性推论的话,n台服务器集群后应该可以支持1000*n个用户同时在线。。。。。

这样问题就来了:像12306或者淘宝那样的高并发大网站的话,需要满足同时在线的人数何止百万,如果按照上面的推论,同样的部署环境,我得需要1000台服务器!!! 这显然是不合理的解决方案。。。。。。

那么,究竟他们是如何解决这样的问题的呢? 请有实际经验的朋友和老师解答下。谢谢!

              

28
banq
2012-01-16 19:22

lmax 通过引入高并发异步框架disruptor 达到一台服务器一个线程每秒处理600万订单,如果换成订火车票,就是每秒可处理600万张火车票,春运订票难问题迎刃而解。

就你这个系统,1000用户不是顶,你要压力测试到你的 cpu 满负荷,只要有空闲,就意味着一台服务器效能没有充分利用。

KenWT
2012-01-17 13:52

通过楼主的描述,其实简单总结一下应该是以下两点意思

第一点:在目前的硬件条件下,该应用的并发规模的评估应该有待于继续测评?或许可以支持更多在线用户?

第二点:就是如何提高应用的并发规模?

个人认为关于一个系统并发量的测评,楼主还需要对应用部署的软硬件环境做进一步分析和测试,比如服务器硬件的cpu数量,内存的大小,硬盘的大小;

再就是软件基础,比如服务器底层的JDK版本,虚拟机版本,虚拟机的性能有没有达到期望值,对于SUN JDK 来说,书上说是它在Windows和LInux中

都是使用一对一的线程模型来实现的。还有一点就是应用核心业务处理部分的编码质量,这三个方面都需要进一步分析,以确定是否目前支持1000名在线用户

就是最佳的一个并发量?

其次,就是关于提高应用并发规模这个问题,也就是关于服务器的集群,这个问题,个人认为,在充分发掘单台服务器的服务能力之后,如果还觉得达不到

期望值,可以考虑集群,集群的话,包括服务器集群还有数据库集群,理论和实际操作都不是问题,核心问题还是对问题要有一个深入清晰的认识,再做决定

不晚。

liny
2012-01-17 17:00

谢谢板桥回复!

每秒处理600万订单,其实不是实际的并发有600万,单台服务器不可能支持这么多并发,操作系统本身支持的http连接也是1,2千这个级别的。

您的意思是否是说大家的系统本身能支持的并发(同时)都是几千几万的级别的,但是通过一些策略可以支持上百万的多用户的交易处理?否则单服务器最大http和session数不可能有上百万吧?

banq
2012-01-18 10:43

2012年01月17日 17:00 "@liny"的内容
其实不是实际的并发有600万,单台服务器不可能支持这么多并发,操作系统本身支持的http连接也是1,2千这个级别的 ...

这实际是你的误解,可好好研究一下MartinFowler大师写的这篇文章:LMAX架构

如果业务核心依赖Http连接,这样的系统是不可伸缩Scalable,也是一种比较普通的架构设计,LMAX架构是一种异步分布式架构,单台服务器是其核心业务服务器,而不是直接面向客户端的Web服务器,在一个大型系统中,Http连接和连接请求处理是分离的。

2Go 1 2 下一页