「数据库系列三」磁盘、内存和带宽
聊聊影響流量的三大物質因素:磁盤、帶寬、內存
速度上內存 》帶寬(帶寬可以看作網絡的吞吐量)》磁盤
?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博客
總結
以上是生活随笔為你收集整理的「数据库系列三」磁盘、内存和带宽的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: springboot不能加载https的
- 下一篇: 解决冲突神器(maven helper)