如何设计一个秒杀系统
15
15
1.0x
00:00/00:00
登录|注册

05 | 影响性能的因素有哪些?又该如何提高系统的性能?

使用应用层的LocalCache
直接输出流数据
直接使用Servlet处理请求
合并部署
避免或减少RPC
减少字符到字节的转换
判断CPU是否瓶颈的方法
CPU诊断工具
最佳线程数的计算公式
线程数不是越多越好
减少CPU执行时间可提高QPS
CPU执行时间和线程等待时间组成响应时间
链路基线
成本基线
性能基线
增加预处理
减少字符到字节的转换
保证首屏为先、重要信息为先
HTTP请求时做Gzip压缩
减少字符到字节的转换
光速、网速、网络结构、TCP/IP、虚拟机等的限制
并发读优化
Java极致优化
减少序列化
减少编码
CPU的瓶颈
线程数对QPS的影响
响应时间和QPS的关系
应用基线
减少中间环节
数据分级
减少数据
发现短板
如何优化系统
如何发现瓶颈
影响性能的因素
总结一下
大并发系统中影响性能的因素有哪些?又该如何提高系统的性能?

该思维导图由 AI 生成,仅供参考

不知不觉,我们已经讲到第五篇了,不知道听到这里,你对于秒杀系统的构建有没有形成一些框架性的认识,这里我再带你简单回忆下前面的主线。
前面的四篇文章里,我介绍的内容多少都和优化有关:第一篇介绍了一些指导原则;第二篇和第三篇从动静分离和热点数据两个维度,介绍了如何有针对性地对数据进行区分和优化处理;第四篇介绍了在保证实现基本业务功能的前提下,尽量减少和过滤一些无效请求的思路。
这几篇文章既是在讲根据指导原则实现的具体案例,也是在讲如何实现能够让整个系统更“快”。我想说的是,优化本身有很多手段,也是一个复杂的系统工程。今天,我就来结合秒杀这一场景,重点给你介绍下服务端的一些优化技巧。

影响性能的因素

你想要提升性能,首先肯定要知道哪些因素对于系统性能的影响最大,然后再针对这些具体的因素想办法做优化,是不是这个逻辑?
那么,哪些因素对性能有影响呢?在回答这个问题之前,我们先定义一下“性能”,服务设备不同对性能的定义也是不一样的,例如 CPU 主要看主频、磁盘主要看 IOPS(Input/Output Operations Per Second,即每秒进行读写操作的次数)。
而今天我们讨论的主要是系统服务端性能,一般用 QPS(Query Per Second,每秒请求数)来衡量,还有一个影响和 QPS 也息息相关,那就是响应时间(Response Time,RT),它可以理解为服务器处理响应的耗时。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文总结了如何优化大并发系统的性能,主要包括减少编码、减少序列化、Java极致优化和并发读优化等几种有效手段。在减少编码方面,可以通过提前将静态数据转化成字节并缓存,以及避免字符到字节的转换来提升性能。减少序列化操作和RPC调用,采用合并部署等方式也能有效提高性能。此外,文章还介绍了针对大流量的Web系统的优化方法,包括直接使用Servlet处理请求、使用resp.getOutputStream()输出流数据等。针对并发读优化,建议采用应用层的LocalCache来缓存数据,并进行动态数据和静态数据的分别处理。最后,文章提到了性能优化的过程中需要从发现短板开始,减少数据、数据分级、减少中间环节、增加预处理等环节上做优化,并强调了做好应用基线的重要性。文章内容涵盖了系统性能优化的关键因素和方法,对于需要提升系统性能的读者具有一定的参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《如何设计一个秒杀系统》
立即购买
登录 后留言

全部留言(36)

  • 最新
  • 精选
  • 公号-技术夜未眠
    除了本文提供的方式外,还可从考虑从以下方面进行调整: 1 提升硬件条件:CPU核数、主频、内存、磁盘I/O、SSD、网卡等 2 JVM性能调优 3 缓存

    作者回复: 👍

    2018-10-05
    26
  • 很棒,如醍醐灌顶! 性能优化的核心就一个字-减 如果还继续减的 1:异步化-减少等待响应的时间 2:降日志-减本地磁盘的交互 3:多级缓存-再减少获取数据路径 4:减功能-非核心功能或后补功能去掉

    作者回复: 👍

    2018-11-13
    19
  • Hana
    拜读过您的 《深入分析 Java Web 技术内幕》 这一本书,讲解非常通俗易懂,也不失深度,今天才反应过来作者跟您是同一个人🤥

    作者回复: 😉

    2018-10-23
    11
  • speedfirst
    能否再具体解释下“合并部署”如何避免序列化的?我的理解是不管在不在一个tomcat都要走一次http,所以总要序列化。tomcat提供某种机制可以跨进程非序列化通信?

    作者回复: 这个里面实现比较复杂,几句话很难讲清楚,《架构演进与性能优化》有专门一章介绍了实现方案

    2018-10-07
    2
    8
  • 饭粒
    自己道行浅,看这有点泛啊..

    作者回复: 还是要自己去实践:)

    2018-12-17
    6
  • wuhulala
    有个疑问:比如dubbo默认线程池大小是200 这个线程配置 其实在我们的机器往往是8c的 并且是计算密集型 那么就过于大了吧 默认配置这么大是因为大部分机器都是64c+么?

    作者回复: Dubbo的线程池的大小还要看看你的远程调用的rt是多少,如果rt比较长,那线程数就要多一点,不然你的系统连接很容易就满了,就拒绝服务了。

    2018-10-05
    6
  • 飞天小侠
    老师,想问下,就是比如在下单的时候,先是写入一个订单,然后再减商品库存,因为减库存是写操作,所以会锁住,那么后面进来的有效请求就会等到释放锁才能操作,这样会不会影响后面的正常请求,响应太慢,然后有没有好的解决方案呢?

    作者回复: 锁肯定是会存在的,解决的办法就是尽可能避免产生锁,比如根据商品ID进行分库分表设计;再有就是减少锁的粒度例如阿里对MySQL做了定制优化,可以提升MySQL的并发度

    2018-12-09
    2
    4
  • 看不到de颜色
    看完这章内容有一点跟之前了解到不一致的地方。就是通常设置线程数大小会根据任务类型进行区分。通常会划分为IO密集型和CPU密集型。印象中CPU密集型的任务通常线程数建议就是 CPU核心数+1。那么老师在文中提到的 2*CPU核心数+1指的是IO密集型任务的通常线程数设置嘛? 看完这章内容还有一个感受就是设置JSF(类似于Dubbo的一个RPC框架)线程池大小时是否也可以先从接口的QPS入手。之前都是凭感觉设置,线上出问题了再扩大😂

    作者回复: 关于线程数的设定我给出的是一个经验公式,不是所有的线程池都要根据这个设置,那肯定也不合理,例如,一个Java系统里可能都很多线程池,如果每个线程池都设置这个值,那会有很多的线程。 我说的这个设置,其实主要是想把最重要处理用户请求的线程池设置这个数,或者是系统中最核心的处理用户请求的线程池建议按照这个来设置,另外像Dubbo中的线程池的数量还要根据每个请求的rt以及并发数来综合考量,例如如果每个请求的rt比较长,那么并发数一多的话,很容易就满了,这时你为了提升并发请求数,肯定要多设置一些线程数,否则很容易请求失败。当然你也可以增加机器来解决,总之你还是要有个平衡。

    2018-10-15
    4
  • 吴浩
    读的场景可以允许一定的脏数据,导致少量原本无库存的下单请求被误以为有库存,可以在写数据的时候再保证最终一致性 想问下,这里在写的时候保证是该如何保证了?库存量大于1么?

    作者回复: 嗯,写的一致性主要是通过数据库来保证

    2018-10-08
    4
  • SpoutAndBolt
    如果让前端无效请求数降低 能否可以使用Nginx的配置 limit_connect来控制

    作者回复: 可以到是可以,就是比答题的方式更暴力一点,呵呵

    2018-10-06
    3
收起评论
显示
设置
留言
36
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部