2

在《这垃圾APP,差点毁了70万高考生》一文中,我们的报考app是用5W rmb 向供应商采购。在报名当天涌入海量考生,并发数飙升至34W,导致系统宕机,拒绝服务,导致考生无法报名,舆情哗然。

那么5W rmb 能否支持34W并发呢?

先不考虑服务器资源是否够,瓶颈会首先出现在数据库读写,假设现在有34W并发,而且根据访问性质来看应该是报名操作,而报名操作是带有数据库CRUD的,Mysql的最大连接数是2000(假设没做分库分表,5W rmb让开发商做分库分表显然是不可能的),一般用到80%就很不错了,所以连接数用1600来算。然后假设数据库能在100ms内返回(想必也不是什么好机器),那么一个连接1s能进行10次操作,那么1600连接用满,能进行1.6W次数据库操作。

但这个也只是理论上的峰值,在实际项目中,单库是绝达不到1.6W写入的,并且还是涉及到多表操作的情况下。

实际上根据《高性能MySQL》第三版 1.5小节,在如下的测试环境中

测试机器Cisco UCSC250
内存384GB
存储引擎是InnoDB
测试的数据集2.5GB
MySQL的buffer pool设置为4GB

clipboard.png

所以在内存为384G的机器上,吞吐量不会超过8000。那么384G机器要多少钱呢?

clipboard.png

这是64G机器的价格,因此384=646 61.8W=10.8W/年

因此,如果要并发支持到8000,光数据库就至少需要10W/Y。当然,这是假设请求在1s内返回的情况,假设我们允许服务能在5s内返回,那么此时并发能支持到4W。还是在不考虑服务器,网络损耗的情况下,实际上是远远达不到的。

所以,用5w来支持38w并发,是绝不可能的。

回到我们刚才的计算,假设数据库吞吐量到达理论峰值,能支持8000用户同时访问,如果每个客户能等待5s的化,能支持4w用户(前提是这些用户不可以同时访问,需要在5s内做到均匀分布,此时需要通过限流等手段来实现)

要支持8000用户同时访问,又需要多少个应用服务器呢?

假设我们使用tomcat服务,每个线程所占空间为8M,那么光tomcat线程就需要: 80008=64000=64G,当然还需要有主机内存,损耗啥的,按照一倍计算就是128G,那么需要是21.8W=3.6W

所以,如果需要支持4w个用户5s延时的访问,需要3.6+10.8= 14.4w rmb

这还只是服务器的钱,不算开发成本在内

那么,如果要支持38w的并发报名呢?这已经是一个相当大的并发量了,首先需要考虑的是抛弃掉一部分流量,可以在cdn就直接抛弃,或是nginx,或者直接在应用服务器上,比如在这种情况下就只能保持8000/380000 = 2%,只能有2%的请求允许进来。

可以通过nginx+redis的方式抛弃掉98%的请求,这样可以不用浪费应用服务器资源。或者直接在应用服务器上做操作,抛弃掉无法响应的请求,避免流量拖垮整个系统。


方老司
2k 声望224 粉丝

教育皆祸害,[链接]