聊聊影响流量的三大物质因素:磁盘、带宽、内存

速度上内存 》带宽(带宽可以看作网络的吞吐量)》磁盘

google 工程师Jeff Dean 首先在他关于分布式系统的ppt文档列出来的,到处被引用的很多。

磁盘:

①寻址--毫秒ms级别的。

对于磁盘来说一个完整的IO操作是这样进行的:当控制器对磁盘发出一个IO操作命令的时候,磁盘的驱动臂(Actuator Arm)带读写磁头(Head)离开着陆区(Landing Zone,位于内圈没有数据的区域),移动到要操作的初始数据块所在的磁道(Track)的正上方,这个过程被称为寻址(Seeking),对应消耗的时间被称为寻址时间(Seek Time);但是找到对应磁道还不能马上读取数据,这时候磁头要等到磁盘盘片(Platter)旋转到初始数据块所在的扇区(Sector)落在读写磁头正上方的之后才能开始读取数据,在这个等待盘片旋转到可操作扇区的过程中消耗的时间称为旋转延时(Rotational Delay);接下来就随着盘片的旋转,磁头不断的读/写相应的数据块,直到完成这次IO所需要操作的全部数据,这个过程称为数据传送(Data Transfer),对应的时间称为传送时间(Transfer Time)。完成这三个步骤之后一次IO操作也就完成了。

衡量磁盘的性能最重要的两个参数就是IOPS和吞吐量。

因此只要给定了单次 IO的大小,我们就知道磁盘需要花费多少时间在数据传送上,这个时间就是IO Chunk Size / Max Transfer Rate。

现在我们就可以得出这样的计算单次IO时间的公式。

  IO Time = Seek Time + 60 sec/Rotational Speed/2 + IO Chunk Size/Transfer Rate

于是我们可以这样计算出IOPS。

  IOPS = 1/IO Time = 1/(Seek Time + 60 sec/Rotational Speed/2 + IO Chunk Size/Transfer Rate)

IOPS (Input/Output Per Second)即每秒的输入输出量(或读写次数),是衡量磁盘性能的主要指标之一。IOPS是指单位时间内系统能处理的I/O请求数量,I/O请求通常为读或写数据操作请求。随机读写频繁的应用,如OLTP(Online Transaction Processing),IOPS是关键衡量指标。另一个重要指标是数据吞吐量(Throughput),指单位时间内可以成功传输的数据数量。对于大量顺序读写的应用,如VOD(Video On Demand),则更关注吞吐量指标。

简而言之:

  • 磁盘的 IOPS,也就是在一秒内,磁盘进行多少次 I/O 读写。
  • 磁盘的吞吐量(指的是硬盘或设备(路由器/交换机)在传输数据的时候数据流的速度即使同一块硬盘在写入不同大小的数据时、表现出来的带宽也是不同的),也就是每秒磁盘 I/O 的流量,即磁盘写入加上读出的数据的大小。

从上面的数据可以看出,当单次IO越小的时候,单次IO所耗费的时间也越少,相应的IOPS也就越大。但是,上面我们的数据都是在一个比较理想的假设下得出来的,这里的理想的情况就是磁盘要花费平均大小的寻址时间和平均的旋转延时,这个假设其实是比较符合我们实际情况中的随机读写,在随机读写中,每次IO操作的寻址时间和旋转延时都不能忽略不计。

写入10000个大小为1KB的文件,比写入一个10MB的文件耗费更多的时间。因为10000个文件需要做好几万次IO,而写入10MB的大文件,因为是连续存放,所以只需要几十个IO。

对于写入10000个小文件,因为每秒需要的IO非常高,如果用具有较高IOPS的磁盘,将提速不少。

写入10MB文件,就算用了较高的IOPS也不会提升速度。因为只需要少量的IO。只有用较大传输带宽的才会体现优势。

②带宽--单位时间内能传输的字节流能有多少,几个G或几M。

  • 高传输带宽在传输大块连续数据时具有优势
  • 高IOPS在传输小块不连续的数据时具有优势

内存:

①寻址--纳秒ns级别的。秒=1000毫秒=1000*1000微妙=1000*1000*1000纳秒。在寻址上,磁盘比内存慢了10万倍。

磁盘I/O存在机械运动耗费,因此磁盘I/O的时间消耗是巨大的。而内存是晶体管制作的(CPU也是晶体管做的),而晶体管的特性就是我们平时常说的用开关的开和关来表示1,0,通过一些门电路的组合可用来表示数字和实现复杂的逻辑功能,而内存主要是用来临时保存数据,CPU就是处理一些逻辑关系。晶体管由于必须得通电,然后用电流的有无状态来表示信息,充放电后电荷的多少(电势高低)分别对应二进制数据0和1,所以只有通电的时候可以保存数据,电一断内存里的晶体管状态就处未知状态就啥用处也没了,而磁盘断电后磁性物质还存在。

但现在也正出现一些非易失性存储介质,及时掉电也不会失去数据。

下面是我总结的目前一些主流的存储介质:

②带宽

生活中我们经常听到宽带或者是带宽之类的东西

宽带:即接入到广域网的线路,可简单理解为电信接的光纤接入。

带宽:接入宽带的理论网速上限,比如常说的100Mbps家庭宽带

为什么我们经常说我们的前兆宽带,但是却很慢呢?因为你用的实际上是多有这个光纤的分时多路复用,所有人都在用。

再来聊聊单位问题:

大家都知道计算机存储设备不论内存、硬盘存储数据最终都是通过0和1实现的,这叫1位(1 bit)。而保存一个汉字需要8位(8 bit)也就是1字节(1 Byte)。位/字节都可以缩写成b/B,而大B和小b又喜欢被人混用,通常大B缩写指的是字节,小b缩写指的是位,这样很容易混淆概念。

速度单位(字节每秒 Byte/s)

有了上面的介绍就清晰了。通常下载东西,10MB/s是标准的说法,也就是每秒千万字节。不要用什么Mb/s、mB/s、mb/s这些幺蛾子单位。

带宽单位(位每秒bit/s)

和速度单位不同,带宽也可以说是位宽,100Mbps(100Mb/s)是标准的说法,也就是一千万兆位每秒。注意这里用到了位。所以100Mbps的带宽换算成理论最大速度是12.5MB/s,这里又变回了大B,也就是字节。

那么我们平时的千兆光纤说的是1000Mbps,这里的是指bit位而不是字节(千兆宽带理论上的下载速度是1000Mbps/8=125Mb/S)。

机械硬盘读写速度平均60---80MB每秒

固态硬盘不同品牌型号之间,平均大约在150---300MB每秒

也就是说一般的家庭网络,使用上ssd就达到上网的极限了。

什么时候会造成网络拥堵呢?

如果你使用内存数据库,如果传输数据很大笔网络带宽大很多的话就会堵死你的网络,

举例DDR3  1600HMZ的内存带宽速度就=1600HMZX64/8=12.8GB/S

可以看到内存带宽是非常之高的,基本上可以满足我们对平常对数据的所有要求。

内存带宽=内存等效频率X64/8

I/O Buffer:

磁盘中的磁道和扇区,一扇区512字节byte,如果磁盘容量很大,而扇区很小,势必会增大索引(相当于我给扇区编的号)成本。操作系统无论从磁盘读取多少数据都是以4K为单位。

随着文件变大,速度会越慢,磁盘IO会成为瓶颈。

数据库:

数据库的出现是为了改善磁盘IO的瓶颈。但整体而言,磁盘IO和数据库的IO总量是相等的,因此就有了索引的概念,如果没有索引,仅仅只是建了数据库和表,不会有太大帮助,依旧很慢。

数据库中最小的单位为page页,以4k为单位。

关系型数据库建表,必须先给出schema,数据类型(字节宽度),存数据时倾向于行级存储。先给出字节宽度的好处时,保留了位置,在插入或更新数据时直接进行覆写而不用进行数据移动。

索引也是数据,和表数据一样都存储在硬盘中。在内存中创建一棵B+树用于将索引的区间和偏移存储起来,索引和数据存在磁盘,因为内存有限,存不下这么多的数据,利用索引提高遍历查找的速度,减少磁盘IO和寻址的过程,但数据还是从磁盘获取。

内存数据库

内存虽然掉电会失去,但是如果仅仅作为查询临时存储一些小东西,可以大大减少磁盘io和增大并发量。所以内存数据库诸如redis出现了。

引用:

平均吞吐量计算公式_磁盘性能评价指标—IOPS和吞吐量_洛阳小散户的博客-CSDN博客

「数据库系列三」磁盘、内存和带宽相关推荐

  1. 「数据库系列杂谈」数据库访问性能优化

    为什么要优化 系统的吞吐量瓶颈往往出现在数据库的访问速度上 随着应用程序的运行,数据库的中的数据会越来越多,处理时间会相应变慢 数据是存放在磁盘上的,读写速度无法和内存相比 一.数据库访问优化法则简介 ...

  2. 「数据库系列一」为什么要用数据库?

    第一个问题:什么是数据库? 数据,现在被誉为工业社会的"石油".数据(data)是事实或观察的结果,是对客观事物的逻辑归纳,是用于表示客观事物的未经 加工的原始素材.数据可以是连续 ...

  3. 「数据库系列四」分布式数据库CAP理论与最终一致性

    传统关系型数据库中事务有四个重要的特性,简称ACID,即 原子性 : 事务是一个不可分割的工作单位,事务中的操作要么都成功,如果有一个执行失败,所有的SQL将都被撤销,恢复到事务开始的状态 一致性 : ...

  4. 敖丙「数据库调优」连招

    被敖丙用烂的「数据库调优」连招?真香,淦!

  5. mongdb 建立了索引唯一性还能重复插入?_「数据库系列」Postgres性能调优——Index...

    在本文中,我们将探讨如何通过使用Explain和Analyze来分析慢查询,以及使用索引来修改和增强查询时间来解决慢查询. Postgres支持在表上使用各种索引,以加快查询速度. 多列索引 多列B树 ...

  6. sql调优的几种方式_「数据库调优」屡试不爽的面试连环combo

    点赞再看,养成习惯,微信搜索[三太子敖丙]关注这个互联网苟且偷生的工具人. 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试完整考点.资料以及我的 ...

  7. 「中间件系列二」redis缓存

    Redis(Remote Dictionary Server) 是一个使用 C 语言编写的,开源的(BSD许可)高性能非关系型(NoSQL)的键值对数据库. Redis 可以存储键和五种不同类型的值之 ...

  8. 「中间件系列一」kafka消息中间件

    kafka消息中间件 一:为什么需要消息中间件? 1.解耦:允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束. 2.冗余: 消息队列把数据进行持久化直到它们已经被完全处理,通过这一 ...

  9. 0x00000000指令引用的内存不能为written_「深入Java虚拟机」Java内存区域与内存溢出...

    内存区域 Java虚拟机在执行Java程序的过程中会把他所管理的内存划分为若干个不同的数据区域.Java虚拟机规范将JVM所管理的内存分为以下几个运行时数据区:程序计数器.Java虚拟机栈.本地方法栈 ...

最新文章

  1. 代码运行时间测试C++
  2. 全球规模最大的全浸没式液冷数据中心落户杭州余杭
  3. Android 5.1 Lollipop的Zygote分析——上篇
  4. DCMTK:类DSRBasicCodedEntry和DSRCodedEntryValue的测试程序
  5. 每天一道LeetCode-----判断给定字符串是否符合某个模式
  6. 通孔的作用是什么linux,电路板空洞的作用是什么 如何区分PTH与NPTH两种通孔
  7. Java集合之LinkedList
  8. CakePHP Pagination (分頁功能) 加入自己的參數
  9. 将Java EE与jOOQ结合使用的初学者指南
  10. 关于压缩工具 7z(7-zip) 的选项 -x(排除文件)的解读
  11. 08-06 性能测试--测试报告与数据
  12. 【博客项目】—cookie和session(七)
  13. 简单poi创建execl
  14. centos7安装python3及pip3更新_CentOS7下安装Python3及Pip3并保留Python2
  15. Web开发几种常用工具
  16. scrum 11.6
  17. 基于UVC协议的摄像头知识学习
  18. QQ群排名霸屏技术居然是这样简单
  19. HTML - 调用腾讯 QQ 进行客服在线聊天(PC)
  20. 2016 360校招笔试编程题

热门文章

  1. [Spring Framework]学习笔记--Dependency injection(DI)
  2. 使用windbg排查一个内存溢出的问题
  3. 产生阻滞的问题 net4.6_识别左束支传导阻滞背后的凶险:Cabrera征和Chapman征|识“图”寻踪...
  4. linux iconv
  5. linux关闭时间戳是否有影响,linux – 如何让sec正确忽略时间戳
  6. 台式计算机的配置清单(硬件和软件),计算机硬件配置清单大 全!值得收藏哦
  7. php图片添加角标,分享一段html在消息按钮上增加数量角标的实现代码
  8. 加载dict_Python的dict实现原理和Java的HashMap之间的区别
  9. addroutes刷新_vue解决addRoutes多次添加路由重复的操作方法
  10. 深度学习和目标检测系列教程 9-300:TorchVision和Albumentation性能对比,如何使用Albumentation对图片数据做数据增强