作者 | 救火队队长

责编 | 伍杏玲

本文经授权转载自石杉的架构笔记(ID:shishan100)

本周我们的一个重点就是给大家再次强调JVM频繁GC对系统性能的危害性。

因此在分析完JVM发生GC的场景以及原理,以及梳理清楚各种GC名词的概念和触发时机之后,我们就可以来用两个之前我们线上系统真实的案例来给大家再次在脑海中强化一下频繁GC带来的性能问题。

什么是 BI 系统?

先给大家说一下我们线上一个真实的生产系统,是一个服务于百万级商家的BI系统。

这个所谓BI系统,很多开发业务系统的同学可能没接触过,所以简单介绍一下背景。

简单来说,比如你是一个平台,然后有数十万甚至上百万的商家在你的平台上做生意,会使用你的这个平台系统。

此时一定会产生大量的数据,基于这些数据我们需要为商家提供一些数据报表。比如:每个商家每天有多少访客?有多少交易?付费转化率是多少?

当然实际情况会比这个简单几句话复杂很多,这里就是简单说一下它的概念。

因此就需要一套BI系统,所谓BI,英文全称是“Business Intelligence”,也就是“商业智能”,听起来是不是特别的高大上?

其实也别想的太高大上了,说白了,就是把一些商家平时日常经营的数据收集起来进行分析,然后把各种数据报表展示给商家的一套系统。

所谓“商务智能”,指的就是给你看一些数据报表,然后让你平时能够更好的了解自己的经营状况,然后让老板“智能”的去调整经营策略,提升业绩。

所以类似这样的一个BI系统,大致的运行逻辑如下所示,首先从我们提供给商家日常使用的一个平台上会采集出来很多商家日常经营的数据。

如下图所示:

接着就可以对这些经营数据依托各种大数据计算平台,比如Hadoop、Spark、Flink等技术进行海量数据的计算,计算出来各种各样的数据报表。

如下图所示:

然后我们需要将计算好的各种数据分析报表都放入一些存储中,比如MySQL、ElastciSearch、HBase都可以存放类似的数据。

如下图所示:

最后一步,就是基于MySQL、HBase、ElasticSearch中存储的数据报表,基于Java开发出来一个BI系统。

然后通过这个系统,把各种存储好的数据暴露给前端,允许前端基于各种条件对存储好的数据进行复杂的筛选和分析。

如下图所示:

刚开始上线系统时候的部署架构

我们在这里重点作为案例分析的就是上述场景中的BI系统,其他环节都跟大数据相关的技术是有关联的,暂时先不涉及,未来有机会可以给大家出更多的课程来阐述那些技术。

刚开始,这个BI系统使用的商家是不多的。

因为大家要知道,即使在一个庞大的互联网大厂里,虽然大厂本身积累了大量的商家,但是你要是针对他们上线一个付费的产品,刚开始未必所有人都买账。所以一开始系统上线大概就少数商家在使用,比如就几千个商家。

因此刚开始系统部署的非常简单,就是用几台机器来部署了上述的BI系统,机器都是普通的4核8G的配置。

然后在这个配置之下,一般来说给堆内存中的新生代分配的内存都在1.5G左右,Eden区大概也就1G左右的空间。

如下图所示:

技术痛点:实时自动刷新报表 + 大数据量报表

其实刚开始,在少数商家的量级之下,这个系统是没多大问题的,运行的非常良好,但问题就出在使用系统的商家数量开始暴涨的时候。

突然使用系统的商家开始越来越多,比如给大家举个例子,当商家的数量级达到几万的时候。

此时要给大家说明一个此类BI系统的特点,就是在BI系统中有一种数据报表,他是支持前端页面有一个JS脚本,自动每隔几秒钟就发送请求到后台刷新一下数据的。

这种报表称之为“实时数据报表”,如下图所示:

那么大家可以设想一下,假设仅仅就几万商家作为你的系统用户,很可能同一时间打开那个实时报表的商家就有几千个

然后每个商家打开实时报表之后,前端页面都会每隔几秒钟发送请求到后台来加载最新数据。

这时基本上会出现你的BI系统部署的每台机器每秒的请求会达到几百个,这里就假设每秒500个请求。

然后每个请求会加载出来一张报表需要的大量数据,因为BI系统可能还需要针对那些数据进行内存中的现场计算加工一下,才能返回给前端页面展示。

根据我们之前的测算,每个请求大概需要加载出来100kb的数据进行计算,因此每秒500个请求,就需要加载出来50MB的数据到内存中进行计算。

如下图所示:

没什么大影响的频繁Young GC

其实大家都已经发现上述系统的问题了,在上述系统运行模型下,基本上每秒会加载50MB的数据到Eden区中。

也就是说,只要区区200s,也就是3分钟左右的时间,就会迅速填满Eden区,然后触发一次Young GC对新生代进行垃圾回收。

当然1G左右的Eden进行Young GC其实速度相对是比较快的,可能也就几十ms的时间就可以搞定了。

所以之前也分析过,这其实对系统性能影响并不大。而且上述BI系统场景下,基本上每次Young GC后存活对象可能就几十MB,甚至是几MB。

所以如果仅仅只是这样的话,大家可能会看到如下场景,BI系统运行几分钟过后,就会突然卡顿个10ms,但是对终端用户和系统性能几乎是没有影响的。

如下图:

提升机器配置:运用大内存机器

针对这样的一套系统,后来随着越来越多的商家来使用,并发压力越来越大,甚至高峰期会有每秒10万的并发压力。

如果还是用4核8G的机器来支撑,那么可能需要部署上百台机器来抗住每秒10万的高并发压力。

所以一般针对这种情况,我们会提升机器的配置。

本身BI系统就是非常吃内存的系统,所以我们将部署的机器全面提升到了16核32G的高配置机器上去。每台机器可以抗个每秒几千请求,此时只要部署二三十台机器就可以了。

但是此时问题就来了,如果要是用大内存机器的话,那么新生代至少会分配到20G的大内存,Eden区也会占据16G以上的内存空间。

如下图所示:

此时每秒几千请求的话,每秒大概会加载到内存中几百MB的数据,那么大概可能几十秒,甚至1分钟左右就会填满Eden区,就需要执行Young GC了。

此时Young GC要回收那么大的内存,速度会慢很多,也许此时就会导致系统卡顿个几百毫秒,或者1秒钟。

如下图所示:

那么你要是系统卡顿时间过长,必然会导致瞬间很多请求积压排队,严重的时候会导致线上系统时不时出现前端请求超时的问题,就是前端请求之后发现一两秒后还没返回就超时报错了。

用G1来优化大内存机器的Young GC性能

所以当时对这个系统的一个优化,就是采用G1垃圾回收器来应对大内存的Young GC过慢的问题。

(PS:关于G1回收器,我们此前已经通过一步一图的方式,详细阐述了其工作原理,如果忘记了的同学,可以回看一下)

可以对G1设置一个预期的GC停顿时间,比如100ms,让G1保证每次Young GC的时候最多停顿100ms,避免影响终端用户的使用。

此时效果是非常显著的,G1会自动控制好在每次Young GC的时候就回收一部分Region,确保GC停顿时间控制在100ms以内。

这样的话,也许Young GC的频率会更高一些,但是每次停顿时间很小,这样对系统影响就不大了。

本文总结

本文用一个案例,其实就想说明一个问题,通常Young GC哪怕发生的频繁一些,其实一般都对系统造成不了太大的影响。

只有在你机器内存特别大的时候,才需要注意Young GC也可能会导致比较长时间的停顿,此时针对大内存机器通常建议采用G1垃圾回收器。

看到这里,给大家留一个小思考题,去想办法看看自己线上系统:

  • 多长时间发生一次Young GC?

  • Young GC耗时多久?

  • 你觉得它对你的系统影响大吗?

作者简介:救火队队长,阿里资深技术专家。本文来源于公众号狸猫技术窝的专栏:《从零开始带你成为JVM实战高手》试读文章。

【END】

AI学习这么久,终于找到一条完整的学习路线

https://edu.csdn.net/topic/ai30?utm_source=csdn_bw

9.5-7日 AI 开发大会(AI ProCon),7位出品人集结国内外60+技术大咖,探秘9大核心技术,深剖行业痛点,亚马逊首席科学家李沐还将亲授「深度学习集训营」,助力开发者实现技术跃迁。

 热 文 推 荐 

☞化敌为友,微软出手优化 Chrome!

☞ 零基础如何自学编程?

☞美对华为禁令或将再延迟 90 天;微软帮助优化 Chrome;Go 1.12.9 发布 | 极客头条

☞漫画高手、小说家、滑板专家……解锁程序员的另一面!

☞每天超50亿推广流量、3亿商品展现,阿里妈妈的推荐技术有多牛?

☞手把手教你如何用Python模拟登录淘宝

☞做了中台就不会死吗?每年至少40%开发资源是被浪费的!

☞17大主链均狂跌国内项目却看涨, 本周不可不知的7组榜单 | 数据周榜

行!这下 CSDN 玩大了!粉丝:太良心

你点的每个“在看”,我都认真当成了喜欢

每秒 10 万并发的 BI 系统如何频繁发生 Young GC?相关推荐

  1. jvm性能调优实战 - 32一个10万并发的BI系统,如何定位和解决频繁Young GC问题?

    文章目录 Pre 模拟代码的JVM参数设置 示例Code 如何在windows上执行命令? 通过jstat观察程序的运行状态 Pre jvm性能调优实战 - 26一个每秒10万并发的系统如何频繁发生Y ...

  2. jvm性能调优实战 - 26一个每秒10万并发的系统如何频繁发生Young GC的

    文章目录 业务简介 系统初期 技术痛点:实时自动刷新报表 + 大数据量报表 没什么大影响的频繁Young GC 提升机器配置:运用大内存机器 用G1来优化大内存机器的Young GC性能 小结 思考 ...

  3. 每秒10万并发 mysql_亿级流量系统架构之如何设计每秒十万查询的高并发架构

    一.前情回顾 上篇文章(亿级流量系统架构之如何设计承载百亿流量的高性能架构)聊了一下系统架构中,百亿流量级别高并发写入场景下,如何承载这种高并发写入,同时如何在高并发写入的背景下还能保证系统的超高性能 ...

  4. 无锁缓存,每秒10万并发,究竟如何实现?

    有一类业务场景: (1)超高吞吐量,每秒要处理海量请求: (2)写多读少,大部分请求是对数据进行修改,少部分请求对数据进行读取: 这类业务,有什么实现技巧么? 接下来,一起听我从案例入手,娓娓道来. ...

  5. 1万属性,100亿数据,每秒10万吞吐,架构如何设计?

    有一类业务场景,没有固定的schema存储,却有着海量的数据行数,架构上如何来实现这类业务的存储与检索呢?58最核心的数据"帖子"的架构实现技术细节,今天和大家聊一聊. 一.背景描 ...

  6. 减少访问量_Nginx服务器高性能优化轻松实现10万并发访问量

    今天要说的是Nginx服务器高性能优化的配置,如何使Nginx轻松实现10万并发访问量.通常来说,一个正常的 Nginx Linux 服务器可以达到 500,000 – 600,000 次/秒 的请求 ...

  7. nginx高性能web服务器详解_Nginx服务器高性能优化轻松实现10万并发访问量

    原文:https://www.toutiao.com/i6804346550882402828 前面讲了如何配置Nginx虚拟主机,如何配置服务日志等很多基础的内容,大家可以去这里看看nginx系列文 ...

  8. nginx文件服务器5万并发量,Nginx服务器高性能优化-轻松实现10万并发访问量

    今天要说的是Nginx服务器高性能优化的配置,如何使Nginx轻松实现10万并发访问量.通常来说,一个正常的 Nginx Linux 服务器可以达到 500,000 – 600,000 次/秒 的请求 ...

  9. 单机100万连接,每秒10万次请求服务端的设计与实现(一) - 前传

    因起 大概两年前,半途接手了一个项目,一个Python写的游戏服务器.倒腾倒腾弄上线后,在一台4核16G的服务器上,TPS不满百,平均响应延迟超百毫秒,勉强抗个500-1000人在线.慢的令人发指.业 ...

最新文章

  1. 自定义Lisp透明命令
  2. 林轩田机器学习基石课程笔记1 -The Learing Problem
  3. 单列设计模式 懒汉式及多线程debug
  4. Intel和AMD的最新视频编码/解码基准测试
  5. 家长又放心了一些!教育类App不能再干这些事了
  6. node.js读写文件
  7. 数据库工作笔记002---新建mysql数据库的时候_对字符集和排序规则的选择
  8. java正则表达式匹配`\`
  9. [Java] 蓝桥杯ALGO-152 算法训练 8-2求完数
  10. [转]Java web 开发 获取用户ip
  11. (万字长文)HashMap, ConcurrentHashMap 原理及源码详解 java1.7
  12. iOS NSURLSession 指南
  13. 云课堂在登陆时显示服务器错误,我的云课堂不能登陆怎么解决
  14. 杰奇python采集器_linux下能完美运行的杰奇采集器ckp
  15. 上班[卒]如何面对复杂工作?
  16. FLASH抽象层(FAL)程序的应用(rt-thread)
  17. 三冲IPO,独角兽唱吧能成为“K歌第一股”吗?
  18. c语言get()的作用,c语言get函数的用法有哪些
  19. 图片裁剪cropperjs的使用
  20. java 对接微信公众号(一)获取token

热门文章

  1. 2015 - Human-level control through deep reinforcement learning
  2. 全国高等院校英语能力大赛模拟题
  3. 【实验记录】EA-MLP(演化算法--全连接神经网络)实验记录
  4. web前端开发技术现状与发展_Web前端开发的未来,将会有哪些发展方向?
  5. 剑指Offer字符串加法问题
  6. 计算机屏幕总闪烁,教你如何解决电脑屏幕闪烁
  7. 【机器学习】Andrew Ng——02单变量线性回归
  8. boost.asio无锁异步并发
  9. Linux Shell编程笔记10 Shell数组的补充
  10. Flutter进阶—实现动画效果(九)