性能分析:每秒1000并发的商品服务的jvm该设置多少内存?
国内大型购物网站的日常的QPS是多少?
平时购物高峰期,一般集中在2个时间段:11:30-13:30和19:30-21:30
高峰时间段的浏览量PV都是百万级别的,高峰时期的QPS约500-1000,我们就按1000来计算。
如果按QPS=1000,那一个小时=360万的PV,即每个高峰期2个小时约700万的PV。
QPS=1000大概需要多少内存?
像聚划算这种商品列表,按页请求,每次一页10条,故,每次的response=10条。
现在要先估算,每条大约多少字节?
private String title; //50个汉字约100字节private double price; //8个字节private String picURL; //url约100个字母,约100个字节private String productURL;
假设每件商品最多10个字段,平均每个字段100字节,大约1KB的数据。
那每次访问一页大约是101KB=10KB
请问1000QPS大约需要多少内存?
1000QPS=1000 10KB = 10M,也就是说,每秒大约需要10M的数据。
QPS=1000多久触发一次youngGC?
多久触发一次youngGC是由你的堆内存决定的,堆内存够的话,时间就长点,堆内存不够的话,很快就会触发youngGC了。
假设我们按1分钟1次触发youngGC,大约需要配置多少内存?
1s = 10m,1 min = 60 * 10m = 600m
按照young : old = 1 : 2 = 600 : 1200;需要1800M才会1分钟触发1次ygc,所以我们把堆的大小设置为2G就能保证分钟级别的GC次数。
部署多少台机器合适?
像这个案例,部署多少台没有太多要求,因为单台已经能支撑1000QPS了。
但为了防止单点故障,提升高可用,一般部署2台。
每台承接500QPS,如下图:
性能分析:你的系统并发量,突然猛增100倍,该如何解决
从另一个角度思考这个问题:我的系统最大并发式多少,即系统每秒最大能处理多少个请求?
我们还是必须从最基础开始思考
单次处理时间=50ms(互联网公网常见毫秒数)
那单条线程1s内能处理请求数=1000/50=20次
那有多少条线程呢?
例如SpringCloud SpringBoot有多少条线程在处理请求?
springcloud底层是springboot,springboot底层是tomcat,tomcat底层的线程池,最大的线程数默认是200线程。
那么,到这里基本能计算了
一个微服务,200条线程,每条线程QPS=20,那整体就是200*20=4000,4000是最大值。
到这里,你心里应该有个底了,你的服务每秒最大能支撑4000个并发。
那么现在引发另一个问题:能不能优化?能不能再高点?
一般优化不了了,tomcat200个线程,够大了,
如果50ms是纯CPU计算,即CPU密集型,都会出问题的。
什么是CPU密集型?
就是for循环,然后加减乘除的算。
怎么知道是CPU密集型?
一般看代码,或看CPU,CPU如果是100%,一般就是
如果不是纯CPU计算,即IO密集型,问题不大。(什么是IO密集型?就是网络IO或磁盘IO计算)
所以单个服务优化不了,4000并发够可以了。
4000个并发,jvm运行状况如何?
每次请求约10KB,每秒4000并发=4000 * 10kb = 40M
年轻代600M / 40M = 15s,即约15s会触发ygc,问题也不大,故堆2G也能支撑4000QPS。
流量突增100倍,如何支撑?
日常请求时1000QPS,突增100倍=10万QPS
单台理论最大值4000QPS,10万 / 4000 = 25倍,即25台
所以我们最起码,要动态新增25台服务来支撑100倍的并发。
如果是CPU密集型计算的,增加的台数绝对要大于25台,可能是50台或更高,这个要根据压测来判断。
25台机器去哪里搞
答案是:停服务
不是停商品服务啊,是停其他不重要的服务
例如 淘宝在双11当天,就把不重要的服务停掉
例如 退货服务(双11购买的东西,是不能退货的,一般第二天才能退)、积分服务(淘金币)、评价服务(你不能对已购买商品进行评价)等等。
事先计划好,一旦大促开始,就把这些不重要的服务停掉。
