性能分析实战篇

2023-07-25 jvm

# 每秒1000并发的商品列表抢购如何设置jvm?

国内大型购物网站的日常的QPS是多少? --1000

# 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的数据;那每次访问一页大约是10*1KB= 10KB
  • 请问1000QPS大约需要多少内存?1000QPS= 1000 * 10KB= 10M,也就是说,每秒大约需要10M的数据。

# QPS=1000多久触发一次YGC?

回顾-什么时候触发YoungGC?就是年轻代内存不足的时候(Eden和From区不够)触发。

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

假设我们按1分钟1次触发一次ygc,大约需要配置多少内存? 1s=10m,1min=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个线程,够大了

# 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密集型计算(该接口大部分是CPU计算而不是IO或网络操作)的,增加的台数绝对大于25台,可能是50台或更高,这个要根据压测来判断。

# 没有那么多机器怎么办?

例如淘宝再双11单天,就把不重要的服务停掉,例如退货退款、积分服务、评价系统等等,空余出来的服务器跑重要的微服务

上次更新: 6 个月前