You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

137 lines
11 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 08 | 经验总结:必须熟记的一组常用性能数字
你好,我是庄振运。
今天这一讲是”数理基础“这一部分的最后一讲,我在这一讲会给你总结一组性能相关的常用的数字。这些数字在做性能和设计方面的工作时经常用到。它们就像九九乘法表一样,我希望你能熟记在心。
记住这些数字的好处是,每次看到一个性能相关的数据的时候,我们立刻就能知道这个性能数据有没有问题。
举个简单例子如果我们看到一个硬盘的IO读写延迟经常在500毫秒左右我们立刻就知道这里面有性能问题。反之如果硬盘IO读写延迟小于1毫秒我们可以马上推断——这些IO读写并没有到达硬盘那里是被操作系统缓存挡住了。这就是大家常说的“对数字有感觉”。
人们常说“腹有诗书气自华”。同理,如果我们能对系统和程序运行中常见的性能指标了如指掌,就有可能达到那种“一眼就看出问题”的大师级别。
为了方便理解和记忆我把这些数字分成几大类分别是存储、CPU、操作系统、内存和网络等并且会给出具体的单个数值。
## 有言在先
但是我必须强调说明的是,我之所以给出具体的单个数值,是为了方便你记忆,并让你对性能指标“有感觉”。因为**单个值**比给出**数值范围**更直观。
比如传统硬盘的IO延迟如果我冠冕堂皇地说“IO延迟的大小取决于很多因素比如硬盘型号、IO大小、随机还是连续、磁头离数据的远近等从小于1毫米到几秒钟不等。“这样的说法当然对但是并不能帮助你找到数字的感觉所以直观指导意义不是很大。
所以我想强调,我给出的数字仅供参考,帮助你记忆和理解,更重要的目的是**让你对不同环境下的性能数据有所感觉**。你要更加注重它们之间的量级比较比如SSD的随机IOPS的性能可以轻松地达到普通硬盘HDD的1000倍以上。
至于具体的性能数字的值大小,却也可能对一个非常具体的场景不那么匹配。这有几个原因:
1. 因为市场上有很多种类和很多厂家的产品具体的值都不一样比如SSD的一些性能指标就是如此。
2. 因为每个具体场景都不同比如IO的读写大小。还有就是我们的技术不断进步就如同CPU的频率具体的值是一直在变的。
这些性能数据多半和**延迟**有关所以要弄清楚这些延迟的单位。你应该都知道一秒钟是1000毫秒ms一毫秒是1000微秒us一微秒是1000纳秒ns
## 存储相关
我们先看存储相关的性能数据。存储有很多种常用的是传统硬盘HDD, Hard Drive Disk和固态硬盘SSD, Solid State Drive。硬盘的厂家和产品多种多样而且具体的配置也有很多种比如大家熟悉的磁盘阵列RAID)。我们这里仅仅选取最普遍的硬盘和最简单的配置。
值得一说的是SSD。最近几年SSD的技术发展和市场演化非常迅速。随着市场规模的增大和技术的进步SSD的价格已经极大地降低了。在很多大规模的在线后台系统中SSD几乎已经成了标准配置。
SSD的种类很多按照技术来说有单层SLC和多层MLCTLC等。按照质量和性能来分有企业级和普通级。根据安装的接口和协议来分有SAS、SATA、PCIe和NVMe等。
对所有的存储来说,有三个基本的性能指标。
1. IO读写延迟。一般是用4KB大小的IO做基准来测试
2. IO带宽一般是针对比较大的IO而言
3. IOPS就是每秒钟可以读写多少个小的随机IO。
下面这个表格列出了几种存储介质和它们的性能数值。
![](https://static001.geekbang.org/resource/image/46/65/4601c4eb6ecc8e48643d189e7af72565.jpg)
我们这里考虑三种情况: 传统硬盘SATA SSD和NVMe SSD。你可以看到一般传统硬盘的随机IO读写延迟是8毫秒的样子IO带宽大约100MB每秒而随机IO读写一般就是每秒100出头。
SSD的随机IO延迟比传统硬盘快百倍以上IO带宽也高很多倍随机IOPS更是快了上千倍。
## CPU和内存相关
再来看看CPU。说起CPU相关的性能数字就必须先说CPU的时钟频率也就是主频。主频反映了CPU工作节拍也就直接决定了CPU周期大小。
**主频和周期大小。**比如基于英特尔Skylake微处理器架构的i7的一款其主频为4GHz那么每一个时钟周期Cycle大约**0.25纳秒**ns
CPU运行程序时最基本的执行单位是指令。而每一条指令的执行都需要经过四步指令获取、指令解码、指令执行、数据存入。这些操作都是按照CPU周期来进行的一般需要好几个周期。
**CPI和IPC**
每个指令周期数CPI和每个周期指令数IPC其实是孪生兄弟衡量的是同一个东西。
CPIcycles per instruction衡量平均每条指令的平均时钟周期个数。它的反面是 IPCinstructions per cycle。虽然一个指令的执行过程需要多个周期但IPC是可以大于1的因为现代CPU都采用流水线结构。一般来讲测量应用程序运行时的IPC如果**低于1**这个运行的系统性能就不是太好需要做些优化来提高IPC。
**MIPS**
MIPS就是每秒执行的百万指令数。
我们经常会需要比较不同CPU硬件的性能MIPS就是一个很好的指标一般来讲MIPS越高CPU性能越高。MIPS可以通过主频和IPC相乘得到也就是说MIPS=主频×IPC。这个很容易理解比如一个CPU频率再高IPC是0的话性能就是0。假设一个CPU的主频是4GHzIPC是1那么这个CPU的**MIPS就是4000**。注意的是MIPS是理论值实际运行环境数量一般小于这个值。
**CPU缓存**
一般CPU都有几级缓存分别称为L1、L2、L3按这个顺序越来越慢也越来越大当然成本也越来越低。L3有时候也称为LLCLast Level Cache因为L3经常是最后一级缓存。多核CPU的情况下一般L1和L2在核上而L3是各个核共享的。
我用下面的表格来表示一款2GHz主频的CPU进行寄存器和缓存访问的一般延迟分别用时钟周期数和绝对时间来表示同时也给出在每个CPU核上面的字节大小。重复一下数字仅供参考因为每款CPU都不同。
![](https://static001.geekbang.org/resource/image/7d/3d/7d5c3088fbd1463637ffb0641fc68b3d.jpg)
比如一般L3的访问需要40个时钟周期2GHz主频的话就是20纳秒大小一般是每个核平均下来2MB的样子。
为了方便对比,我们把内存的性能也放在同一个表格里。
值得一提的是现在的NUMA非统一内存访问Non-Uniform Memory Access处理器会有**本地**和**远端内存**的区别,当访问本地节点的内存是会快一些。
## 操作系统和应用程序相关
我们刚刚谈了硬件方面,下面看看软件,也就是操作系统和应用程序。
首先,你需要弄清楚如下的几个重要概念和指标。
**1.指令分支延迟**
CPU需要先获取指令然后才能执行。获取下一条指令时需要知道指令地址如果这个地址需要根据现有的指令计算结果才能决定那么就构成了指令分支。CPU通常会采取提前提取指令这项优化来提高性能但是如果是指令分支那么就可能预测错误预先提取的指令分支并没有被执行。
指令分支判断错误Branch Mispredict的时间代价是很昂贵的。如果判断预测正确可能只需要一个时钟周期如果判断错误就需要十几个时钟周期来重新提取指令这个延迟一般在**10纳秒**左右。
**2.互斥加锁和解锁**
互斥锁Mutex也叫Lock是在多线程中用来同步的可以保证没有两个线程同时运行在受保护的关键区域。使用互斥锁的时候需要加锁和解锁都是时间很昂贵的操作每个操作一般需要几十个时钟周期**10纳秒**以上。
**3.上下文切换**
多个进程或线程共享CPU的时候就需要经常做上下文切换Context switch。这种切换在CPU时间和缓存上都很大代价尤其是进程切换。在时间上上下文切换可能需要几千个时钟周期**1微秒1us级别**。在缓存代价上多级CPU缓存和TLB缓存都需要恢复所以可能极大地降低程序线程和进程性能。
## 网络相关
互联网服务最终是要面向终端客户的,客户和服务器的延迟对用户的服务体验至关重要。
网络的传输延迟是和地理距离相关的。网络信号传递速度不可能超过光速一般光纤中速度是每毫秒200公里左右。如果考虑往返时间RTTRound Trip Time那么可以大致说每100公里就需要一毫秒。北京到深圳约2,000公里RTT就是20毫秒上海到乌鲁木齐或者美国的东西海岸之间距离差不多4,000公里所以RTT是40毫秒左右中国到美国比如北京到美国西海岸旧金山差不多10,000公里RTT就是100毫秒。
在数据中心里面一般的传输RTT不超过半毫秒。如果是同一个机柜里面的两台主机之间那么延迟就更小了小于0.1毫秒。
仔细想想的话你就会发现直线距离本身还不够因为数据是通过骨干网光纤网络传播的。如果光纤网络绕路的话那么实际的RTT会超过以上估算数值。
另外要注意的是传输延迟也取决于传输数据的大小因为各种网络协议都是按照数据包来传输的包的大小会有影响。比如一个20KB大小的数据用1Gbps的网络传输仅仅网卡发送延迟就是0.2毫秒。
下面这个表格就总结了几种环境下的端到端的距离和RTT。
![](https://static001.geekbang.org/resource/image/d0/cd/d0c2d6ebd3efa2dd8666cb26fb8002cd.jpg)
## 总结
今天讲了几十个平时经常用到的性能数字,希望起到抛砖引玉的效果。你可以在此基础上,在广度和深度上继续扩展记忆。
![](https://static001.geekbang.org/resource/image/82/d8/82ee900f120d3717e67da7ac54a6ffd8.png)
宋代诗人苏轼曾经作诗夸奖朋友:“前身子美只君是,信手拈来俱天成”,这里的“子美”是唐朝大诗人杜甫的字。这两句是夸朋友写文章写得好,能自由纯熟的选用词语或应用典故,用不着怎么思考,不必费心寻找,如同杜甫转世。
我们如果对各种性能数据足够熟悉,如掌上观纹,自然也就能达到那种对性能问题的分析信手拈来的境界。
## 思考题
假设你们公司有个互联网服务要上线服务的要求是用户端到端响应时间不能超过40毫秒。假设服务器在武汉那么对上海的用户可以达到响应时间的要求吗
欢迎你在留言区分享自己的思考,与我和其他同学一起讨论,也欢迎你把文章分享给自己的朋友。