性能第二讲:性能优化-每个程序员都应该知道的数字

文章目录

  • 性能第二讲:性能优化-每个程序员都应该知道的数字
    • 1、性能优化的重要性
    • 2、性能指标
    • 3、看这些数据的目的
    • 4、总结
    • Action1:商品中心核心接口QPS数据如下

1、性能优化的重要性

  • 1)性能优化非常通用,几乎对于所有线上项目都可以适用,大家掌握了之后,立马可以到项目中实践起来。,应该不存在不需要性能优化的项目。

  • 2)性能优化大部分内容非常简单,几乎没有门槛,经验较浅的同学也很容易上手,同时性能优化也适用二八原则:掌握20%的内容,足以解决80%的问题。

  • 3)性能优化很容易拿到结果,稍微有经验点的同学应该知道,做需求最怕拿不到结果,性能优化就不一样了,都是很直白的数字。1小时的任务,优化成5分钟,性能提升就是十来倍,简单粗暴。

2、性能指标

来源于 Jeff Dean 在谷歌的内部一次分布式系统的演讲,英文标题为:Numbers Everyone Should Know。

这些数字与我们后续做性能优化息息相关,因此我将这部分内容放在第一篇,帮助大家建立基本的性能概念。

先来看 Jeff Dean 所说的数字是哪些:

注:1μs = 1000ns、1ms = 1000μs

操作 耗时/延迟 耗时*10亿
一级缓存读取(L1) 0.5ns 0.5s
分支错误预测 5ns 5s
二级缓存读取(L2) 7ns 7s
互斥锁的加锁解锁 25ns 25s
内存寻址 100ns 100s
Zippy压缩1KB数据 3000ns(3μs) 50min
在1Gbps网络上发送1KB数据 10,000ns(10μs) 2.8h
从SSD(1GB/s)随机读取4KB数据 150,000ns(150μs) 1.7days
从内存顺序读取1MB数据 250,000ns(250μs) 2.9days
数据包在同数据中心一个往返 500,000ns(500μs) 5.8days
从SSD(1GB/s)顺序读取1MB数据 1,000,000ns(1ms) 11.6days
磁盘寻道 10,000,000ns(10ms) 3.8months
从磁盘顺序读取1MB数据 20,000,000ns(20ms) 7.9months
数据包从美国到荷兰一个往返 150,000,000ns(150ms) 4.75years

这份数据的最初来源为 Peter Norvig 的文章:Teach Yourself Programming in Ten Years,地址:http://norvig.com/21-days.html。

伯克利的 Colin Scott 根据这份数据,通过一定的算法,制作了一个可以根据时间的推移而变化的网站,地址为:https://colin-scott.github.io/personal_website/research/interactive_latency.html,源码中注释有详细解释计算逻辑,例如网络带宽是按每2年增加1倍,DRAM带宽按每3年增加一倍。

根据 Colin Scott 的图表来看,到2021年,网络带宽、内存、SSD、磁盘,都有数量级的提升,而 CPU 相关的一二级缓存变化不大,有兴趣的可以自己点进去看一看。

3、看这些数据的目的

首先,这些数据肯定不是完全准确的,受限于众多环境因素的影响,其实很难有所谓的准确数字。

我们看这些数据更多是了解每个操作的耗时量级,各个操作之间的数量级比率,从而对于我们工作中接触到的一些相关知识有初步的概念。

而我将这个数据放在性能优化系列文章的开篇,主要想先传达几个概念:

1)CPU非常非常快

  • CPU执行大部分简单指令只需要1个时钟周期,我用个人电脑测试时,CPU可以睿频到4.40GHz(见第2点的测试图),也就是说此时执行一个简单指令需要的时间大约是1/4.4ns,也就是0.23ns(纳秒)。

  • 这是什么概念了,举个简单的例子,即使是真空中传播的光,在0.23ns内也只能走不到7厘米。

2)内存很快了,但是相比CPU来说还是太慢了

  • CPU和内存之间的瓶颈通常称为冯·诺伊曼瓶颈。具体差别有多大了,我用自己的电脑做了个简单的测试。

  • CPU配置是 11th Gen Intel Core i5-11400F@2.60GHz,睿频4.40GHz,测试结果看也确实跑到了4.40GHz了,内存配置是 DDR4 3200MHz。

  • 测试结果如下图所示:

从上图看,内存的读取速度为41GB/s,感觉还是挺快的,但是L1 Cache为3TB/s,一比较,相差还是很大。

如果CPU按4.40GHz来算,执行一个简单指令需要的时间大约是0.23ns(纳秒),而内存的延迟是88.7ns,相当于CPU去内存里取一个字节,需要等待386个周期,可以看出,内存相较于CPU来说,确实太慢了。

这也是为什么引入了L1、L2、L3缓存的原因,不过这边我们不深入去研究这些东西,只是对CPU和内存的性能差距有个大概概念。

3)磁盘性能非常非常慢

  • 这个大家估计大家都知道,具体有多慢了,我这边在用自己的电脑做了个简单的测试。

  • 我电脑刚好有两块硬盘,一块256GB的SSD(固态硬盘),一块1T的HDD(机械硬盘)。

  • SSD测试结果如下图所示:

忽略队列(Q)和线程(T)的影响,顺序读(SEQ)的性能为1535.67MB/s,随机读(RND)的性能为49.61MB/s。

对比下上面内存的性能41GB/s,尽管是SSD,性能还是存在数量级的差距,另一个就是随机读的性能相比顺序读也是存在数量级的差距。

HDD测试结果如下图所示:

忽略队列(Q)和线程(T)的影响,顺序读(SEQ)的性能为183.49MB/s,随机读(RND)的性能为0.6MB/s。

对比下上面SSD的性能:顺序读1535.67比183.49,存在一个数量级的差距,随机读49.61比0.6,存在两个数量级的差距

而HDD顺序读和随机读的性能差距相比SSD就比较严重了,大概有300倍。简直惨不忍睹,不过相信现在的服务器应该基本都是SSD了。如果发现自己公司服务器的磁盘还是HDD,那就赶紧溜吧。

4)磁盘顺序I/O比随机读I/O快很多

  • 这个在上面的测试也看出来了,都是数量级上的差距,特别是在以前的HDD上。有不少技术就是利用了顺序I/O性能好的特点来提升性能,典型的有:kafka顺序写消息、Leveldb和RocksDB底层使用的LSM-Tree等。

5)网络传输也是比较耗时的,基本都是毫秒级别

  • 在开始的表格中可以看到,在同数据中心一个往返,需要0.5ms。

  • 如果是跨城市就更久了,这个相信也不难理解,毕竟信号要顺着网线爬,距离越远,当然所需时间就越久了。

  • 下图是上海到一些城市进行PING操作所需的时间,可以看到张家口已经需要30ms左右了,这也差不多就是北上的延迟。

这也是为什么我们在服务器的路由策略上通常会优先使用同机房优先、同中心优先的策略

这让我想到我之前碰到的一个问题,当时是一个新服务在测试,数据库基本没数据,测试场景也是很简单的增删改查,但是接口的性能就是很差,动不动就上百毫秒。

仔细看了调用链后,发现每次DB操作都需要30ms左右,看了下机房分布后,发现是应用服务器和数据库服务器跨城市了,一个在北京一个在上海,导致会有固定30ms左右的延迟。将两者换到同机房后,基本就是1ms了

4、总结

  • 本文着重介绍了业务开发在做性能优化需要掌握的一些核心概念,之所以放在最先介绍,是因为在做性能优化的过程中,发现绝大多数性能问题都是由于网络I/O和磁盘I/O引起的。对这些概念心中有数后,有利于我们更快的定位出性能瓶颈,从而更快的解决问题。

Action1:商品中心核心接口QPS数据如下

1、商品详情页(batchFindFullDetail):2000QPS

性能第二讲:性能优化-每个程序员都应该知道的数字相关推荐

  1. 性能优化系列:每个程序员都应该知道的数字

    目录 前言 正文 看这些数据的目的 1)CPU非常非常快 2)内存很快了,但是相比CPU来说还是太慢了 3)磁盘性能非常非常慢 4)磁盘顺序I/O比随机读I/O快很多 5)网络传输也是比较耗时的,基本 ...

  2. Debug经验总结:优化、程序员和概率

    GameRes游资网授权发布 文 /顾煜 时间有关的Bug 所有的console平台,都有一个邪恶的要求:需要做Aging Test.简单来说,就是这些游戏机游戏是要放在店里面卖的,可能商家会把试玩游 ...

  3. 每个程序员都应该了解的 CPU 高速缓存【第二部分】

    文章来源 每个程序员都应该了解的 CPU 高速缓存 [编者按:这是Ulrich Drepper写"程序员都该知道存储器"的第二部.那些没有读过第一部 的读者可能希望从这一部开始.这 ...

  4. 程序员都是单身狗?我有一句……,不知当讲不当讲

    程序员都是单身狗?我有一句--,不知当讲不当讲 程序员都是单身狗?我有一句:怎么可能!!!不存在的,程序员的套路你想象不到... 尽管大多网友认为程序员=单身狗 但实际上,程序员们的处境 往往是站在& ...

  5. 第二十七期:网络爬虫程序员被抓,我们还敢爬虫吗?细数那些Java爬虫技术

    最近,某大数据科技公司因为涉嫌非法抓取某招聘网站用户的简历信息,公司被查封,负责编写抓取程序的程序员也将面临坐牢. 作者:架构之路来源 最近,某大数据科技公司因为涉嫌非法抓取某招聘网站用户的简历信息, ...

  6. 每个程序员都应该了解的 CPU 高速缓存

    每个程序员都应该了解的 CPU 高速缓存 英文原文:Memory part 2: CPU caches 来源:oschina [编者按:这是Ulrich Drepper写"程序员都该知道存储 ...

  7. 每个程序员都应该了解的内存知识-CPU高速缓存

    [编者按:这是Ulrich Drepper写"程序员都该知道存储器"的第二部.那些没有读过第一部 的读者可能希望从这一部开始.这本书写的非常好,并且感谢Ulrich授权我们出版. ...

  8. 千万程序员都说完美,成为Java顶尖程序员 ,看这11本书就够了

    成为Java顶尖程序员 ,看这11本书就够了 如下是我推荐给Java开发者们的一些值得一看的好书.可是这些书里面并无Java基础.Java教程之类的书,不是我不推荐,而是离我本身学习 Java基础技术 ...

  9. 每个程序员都必读的10篇文章

    作为一名Java程序员和软件开发人员,那些每个程序员都应该知道的XXX的文章教会了我不少东西,它们提供了某个特定领域的一些实用的并且有深度的信息,这些东西通常很难找到.在我学习的过程中我读到过许多非常 ...

最新文章

  1. python发送文件到邮箱_python发送文件夹内容到邮箱
  2. Java系列: JAVA字符串格式化-String.format()的使用(zz)
  3. Eclipse,myeclipse开发中常用技巧总结
  4. Amazon DynamoDB 概览
  5. 怎么实现两周联动加减速_LOL:野辅联动成版本主旋律,三大辅助对线游走兼备...
  6. LeetCode刷题(15)
  7. windows批处理文件打印幻方
  8. 网易“吃鸡”,干腾讯何事?
  9. xcode6 使用MJRefresh
  10. Rapid miner
  11. 电脑退域后登陆不上_退域后加域不成功问题
  12. 建议5:防止switch贯穿
  13. yigo 第一阶段 异常处理 解决方案
  14. Python识别二维码条形码?用pyzbar一招搞掂(含代码)
  15. 网售个人隐私开房记录都可查 信息黑市如此猖獗
  16. 电源设计中最常见的四种滤波电路原理及特点解析
  17. android – 多屏幕适配相关
  18. 首个室温超导体问世,为了发现它,科学家用废了几十颗钻石 | Nature封面-1
  19. 实时linux下的PCI驱动开发(上)
  20. 神经网络那些事之在现实生活中的应用

热门文章

  1. linux 查看非法用户登录,用短信报警来监控linux系统的非法登录用户
  2. Eclipse中LogCat打印出错信息分析
  3. 电脑卡顿反应慢解决办法
  4. 什么是句柄、什么是自上而下、自下而上分析—编译原理
  5. Python大数据处理库 PySpark实战 总结四
  6. 宝付国际跨境知识小课堂 | 人民币外汇市场是个啥?
  7. 我国天宫空间站以及各个仓位介绍
  8. unity 骨骼物理 头发 布料模拟
  9. Unity零基础到入门 ☀️| 近万字教程 对 Unity 中的 动画系统基础 全面解析+实战演练,你确定要错过吗?
  10. Ubuntu安装GVM-11并使用gvm-tools命令行方式通讯