JVM性能分析

513 阅读3分钟

QPS=1000大概需要多少内存

QPS一般指每秒查询率。 每秒查询率(QPS,Queries-per-second)是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准

像平常的那种数据列表,是按页请求,每次一页10条,每次的response=10条

现在要先估算,每条大约多少字节?

/**
 * 第三方产品类型
 */
private String thirdProductType; //假设varchar=100字节
/**
 * 第三方产品名称
 */
private String thirdProductName;//假设varchar=100字节
/**
 * 服务类型
 */
private Long serviceType;//假设8个字节
/**
 * 设备图片URI
 */
private String icon;//假设varchar=100字节

假设每件商品最多10个字段,平均每个字段100字节,因此每条数据大约1KB的数据

那每次访问一页大约是10*1KB=10KB

请问1000QPS大约需要多少内存?

1000QPS=1000*10KB=10M

QPS=1000多久触发一下ygc

多久触发一次ygc是由你的堆内存决定的,堆内存多的话就时间长点,堆内存不够的话就时间端点。

假设我们按1分钟触发一次ygc,大约需要配置多少内存?

1s=10M,1min=10M*60=600M

按照年轻代与老年代堆内存的比率为1:2,所以yong:old=600:1200,需要1800M才会触发一次ygc,

故,我们把堆内存大小设置为2G就能保证分钟级别的GC次数

流量突增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如果是100%,一般就是。 如果不是纯CPU计算,即IO密集型,就是网络IO或磁盘I0计算

** 流量突增100倍并发,如何支撑? **

日常请求时1000QPS,突增100倍=10万QPS

单台理论最大值是4000QPS,10万/4000=25倍,即25台

所以我们最起码,要动态新增25台 服务器来支撑100倍的并发

如何是CPU密集型计算的,增加的台数绝对大于25台,可能需要50台或更高,这个需要依据压测来判断

25台机器去哪里搞?

答案是:停服务,不是停商品服务啊,是停其他不重要的服务

例如 淘宝再双11那天,就把不重要的服务停掉,

例如 退货服务(双11购买的东西,是不能退货的,一般第二天才能退)、积分服务(淘金币)、评价服务(你不能对已购买的商品进行评价)等等。

事先计划好,一旦大促开始,就把这些不重要的服务停掉。 把服务器腾出来,给例如商品服务这种大促使用,保证大促顺利进行