当前位置 博文首页 > 沉迷单车的追风少年:《大型网站性能优化指南——从前端、网络、

    沉迷单车的追风少年:《大型网站性能优化指南——从前端、网络、

    作者:[db:作者] 时间:2021-08-18 09:57

    前言:这几天拜读了阿里的这本书,这本书全栈式地讲了一个成熟稳定的大型高并发高容量系统的优化过程,读下来很有收获,也有一些自己的思考。CDN-DNS、网络部分讲的挺精彩的,值得一读的一本书。由于我是后端方向,前端的部分就没出现在这篇文章里(因为看不懂)。

    目录

    先挑剔一下

    本书整体结构

    高性能网站建设指南 12条基本准则

    用户体验性能指标

    QPS相关公式

    CPU利用率影响因素

    压测的意义

    QPS预估-二八法则

    网络同步与异步模型

    IO同步与异步模型

    CDN基本工作流程

    参考


    先挑剔一下

    这本书在豆瓣的评分并不高,还是有原因的。blog先斗胆里挑挑骨头吧~

    1. 数据库调优这部分讲的非常敷衍,其实我觉得数据库调优是后端优化中很重要的一部分,推荐《高性能MySQL》。
    2. 数据结构优化讲得比较片面,并且是基于Java,C++同学可以看看《effective stl》,很多调优和底层原理都在这本书里讲得很清楚。
    3. 对后端优化最有效的方法永远都是:加机器加机器加机器,加cache加cache加cache

    本书整体结构

    图源:https://blog.csdn.net/yuxiuzhiai/article/details/106701446

    高性能网站建设指南 12条基本准则

    1. 尽量减少HTTP请求。
    2. 使用CDN。
    3. 静态资源使用Cache。
    4. 启用Gzip压缩。
    5. JavaScript脚本尽量放在页面底部。
    6. CSS样式表放在顶部。
    7. 避免CSS表达式。
    8. 减少内联JavaScript和CSS的使用,尽可能使用外部JavaScript和CSS文件。
    9. 减少DNS查询。
    10. 精简JavaScript。
    11. 避免重定向。
    12. 删除重复的脚本。

    用户体验性能指标

    • 白屏
    • 首屏
    • 页面整体加载

    QPS相关公式

    (1)响应时间 = CPU线程时间 + 等待线程时间

    (2)最佳线程数 = (响应时间 / CPU 时间)* CPU核数 * CPU利用率

    (3)安达尔定理:S=1/(1-a+a/n)
    ?????????????????????????????? S:加速比
    ?????????????????????????????? a:并行计算部分所占比例
    ?????????????????????????????? n:并行处理结点个数(处理器个数)

    (4)古斯塔夫森定律

    CPU利用率影响因素

    1. I/O能力:磁盘I/O和网络I/O
    2. 数据库连接池,并发能力
    3. 内存
    4. 共享资源的竞争,各种锁策略、阻塞队列
    5. 同步模型中的线程数或进程数
    6. 所依赖的其他后端

    压测的意义

    压测最主要的是测性能是否有变化,也能测试出一些漏洞,比如慢性内存泄漏。

    QPS预估-二八法则

    如果每天集群需要承载10亿数据请求,对于电商网站而言,一般0点到上午8点请求量很小。

    使用二八法则估计:

    1. 80%的数据( 8亿)会在其余16个小时(8点-24点)涌入

    2. 而且8亿的80%的数据( 6.4亿)会在这16个小时的20%时间( 3小时内)涌入:

      QPS=6 4000 0000 / (36060)=60000

      即预估结果为Kafka集群需要在业务最高峰期抗住 60000/s 的 QPS。

    网络同步与异步模型

    网络模型的同步与异步常常指事件处理的同步与异步。比如一个网络交互分为第一步请求,第二步 响应。那么常常有俩种选择,第一种等对方返回结果了我们再进行接下来操作。第二种我们可以设置个回调函数,然后可以不阻塞等待对方返回结果,如果对方返回结果了,回调函数触发,这样就不会阻塞到等待结果那步了。那么这俩种第一种称为同步网络模型,第二种称为异步网络模型。

    IO同步与异步模型

    网络 I/O 的同步与异步跟网络模型的同步与异步不同。在网络 I/O 接口中,有阻塞、非阻塞、多路复用、信号驱动、异步I/O五中I/O模型。网络I/O分为俩步,第一步等待条件就绪,第二步进行真正的数据I/O也就是把socket接受的数据搬移到应用层buffer中。
    那么这五中I/O模型中,前四种的第一步骤各有不同,但是第二个步骤都一样的都需要我们自己去I/O,但是异步I/O模型则不同它是由内核帮忙I/O然后通过信号通知程序,也就是当程序收到信号的时候我们就可以直接去处理数据了不用再去从socket中搬移数据到应用层buffer中了。

    CDN基本工作流程

    ①当用户点击网站页面上的内容URL,经过本地DNS系统解析,DNS系统会最终将域名的解析权交给CNAME指向的CDN专用DNS服务器。

    ②CDN的DNS服务器将CDN的全局负载均衡设备IP地址返回用户。

    ③用户向CDN的全局负载均衡设备发起内容URL访问请求。

    ④CDN全局负载均衡设备根据用户IP地址,以及用户请求的内容URL,选择一台用户所属区域的区域负载均衡设备,告诉用户向这台设备发起请求。

    ⑤区域负载均衡设备会为用户选择一台合适的缓存服务器提供服务,选择的依据包括:根据用户IP地址,判断哪一台服务器距用户最近;根据用户所请求的URL中携带的内容名称,判断哪一台服务器上有用户所需内容;查询各个服务器当前的负载情况,判断哪一台服务器尚有服务能力。基于以上这些条件的综合分析之后,区域负载均衡设备会向全局负载均衡设备返回一台缓存服务器的IP地址。

    ⑥全局负载均衡设备把服务器的IP地址返回给用户。

    ⑦用户向缓存服务器发起请求,缓存服务器响应用户请求,将用户所需内容传送到用户终端。如果这台缓存服务器上并没有用户想要的内容,而区域均衡设备依然将它分配给了用户,那么这台服务器就要向它的上一级缓存服务器请求内容,直至追溯到网站的源服务器将内容拉到本地。

    参考

    • https://www.cnblogs.com/crazylqy/p/7110156.html
    • https://blog.csdn.net/baichoufei90/article/details/106484092
    • https://blog.csdn.net/opensure/article/details/46714793

    最后,感谢西电图书馆提供纸质书。

    cs