機械硬碟(hard disk drive、hdd)和固態硬碟(solid state drive、ssd)是兩種最常見的硬碟,作為計算機的外部儲存,cpu 想要訪問它們儲存的資料需要很長時間,如下表所示,在 ssd 中隨機訪問 4kb 資料所需要的時間是訪問主存的 1,500 倍,機械磁碟的尋道時間是訪問主存的 100,000 倍:
work
latency
l1 cache reference
0.5 ns
branch mispredict
5 ns
l2 cache reference
7 ns
mutex lock/unlock
25 ns
main memory reference
100 ns
compress 1k bytes with zippy
3,000 ns
send 1k bytes over 1 gbps network
10,000 ns
read 4k randomly from ssd*
150,000 ns
read 1 mb sequentially from memory
250,000 ns
round trip within same datacenter
500,000 ns
read 1 mb sequentially from ssd*
1,000,000 ns
disk seek
10,000,000 ns
read 1 mb sequentially from disk
20,000,000 ns
send packet ca->netherlands->ca
150,000,000 ns
表 1 - 2012 年延遲數字對比[^1]
雖然磁碟的尋道時間只需要 10ms,但是在 cpu 看來已經是非常長的時間了,當我們將上述的時間等比例放大後,就能直觀地感受到它們的效能差異。如果 cpu 訪問 l1 快取需要 1 秒,那麼訪問主存需要 3 分鐘、從 ssd 中隨機讀取資料需要 3.4 天、磁碟尋道需要 2 個月,網路傳輸可能需要 1 年多的時間。
在計算機體系結構中,硬碟屬於一種常見的輸入輸出裝置,作業系統在啟動時不一定需要硬碟,它既可以通過硬碟啟動,也可以通過網路裝置或者外部裝置啟動,所以硬碟不是計算機執行的必要條件。
圖 1 - 輸入輸出裝置
作為一種外部的輸入輸出裝置,與 cpu 快取和記憶體相比,硬碟極慢的讀取和寫入速度就顯得比較合理了,然而幾千倍甚至幾十萬倍的速度差異也確實讓人很難想象或者接受,在這篇文章中,我們會分析為什麼 cpu 訪問硬碟的速度非常慢:
cpu 想要訪問磁碟中的資料一定要先通過 i/o 操作將磁碟中的資料讀入到記憶體中,再訪問儲存在記憶體中的資料。計算機中包含三種比較常見的 i/o 操作[^2] — 程式設計 i/o(programmed i/o)、中斷驅動 i/o(interrupt-driven i/o)和直接記憶體訪問(direct memory access),我們接下來將依次介紹上述的這幾種操作[^3]:
圖 2 - 常見 i/o 操作
執行 i/o 操作最簡單的形式就是使用程式設計 i/o,使用程式設計 i/o 時,cpu 會負責全部的工作,如果我們想要在螢幕上輸出hello world
,cpu 每次都會向 i/o 裝置中寫入乙個新字元,寫入後會輪詢裝置的狀態等待它完成工作後寫入新的字元。這種方式雖然簡單,但是它會占用全部的 cpu 資源,在某些複雜的系統中會造成計算資源的嚴重浪費。
中斷驅動 i/o 是執行 i/o 操作的一種更高效方式,在程式設計 i/o 中,cpu 會主動獲取裝置的狀態並等待裝置閒置,但是如果使用了中斷驅動 i/o,裝置會在閒置時主動發起中斷暫停當前程序並儲存上下文,而作業系統會執行 i/o 裝置的中斷處理程式:
使用中斷驅動 i/o 可以在裝置繁忙時,讓 cpu 能夠處理其它任務,盡可能地提高 cpu 的利用率,不再浪費珍貴的計算資源。與程式設計 i/o 相比,中斷驅動 i/o 將一部分工作交給了 i/o 裝置,所以能夠提高資源的利用率。
直接記憶體訪問會利用 dma 控制器來執行 i/o 操作,中斷驅動 i/o 需要為每個字元觸發作業系統中斷,這會消耗一定的 cpu 時間。當我們使用 dma 控制器時,cpu 會一次將緩衝區中的資料全部讀到 dma 控制器中,dma 控制器會負責將資料按字元寫入 i/o 裝置:
圖 3 - dma i/o
雖然 dma 控制器可以解放 cpu 並減少中斷次數,但是它的執行速度與 cpu 相比卻很慢,如果 dma 控制器不能快速驅動 i/o 裝置,cpu 可能就會等待 dma 控制器觸發中斷,在這種情況下,中斷驅動 i/o 或者程式設計 i/o 可以提供更快的訪問速度。
在預設情況下,我們都會使用 dma 控制器來執行 i/o 任務,不過程式設計 i/o 和中斷驅動 i/o 也不是不能接受的選項。當 cpu 經常需要等待 dma 控制器執行 i/o 任務時,使用中斷驅動 i/o 甚至輪詢的程式設計 i/o 都可以得到更高的吞吐量,然而無論使用哪種方式,i/o 都是程式中比較耗時的複雜操作。
機械硬碟(hard disk drive、hdd)是一種基於電子的、非易失的機械資料儲存裝置,它使用磁性儲存器儲存並查詢磁碟上的資料,在讀取和寫入資料的過程中,硬碟機械臂連線的磁頭會讀寫磁碟表面的位[^8]。
正是因為磁碟具有比較複雜的機械結構,所以磁碟的讀取和寫入都要花費很多時間,資料庫的讀寫效能也基本都依賴於磁碟的效能,如果我們在使用機械硬碟的資料庫中隨機查詢一條資料,這可能會觸發磁碟的隨機 i/o,然而將資料從磁碟讀取到記憶體中所需要的成本是非常大的,普通磁碟(非 ssd)載入資料需要經過佇列、尋道、旋轉以及傳輸的這些過程,大概要花費 10ms 左右的時間。
圖 4 - 磁碟的隨機 i/o
我們在估算資料庫的查詢時可以使用 10ms 這個數量級對隨機 i/o 占用的時間進行估算,這裡想要說的是隨機 i/o 對於資料庫的查詢效能影響會非常大,而順序讀取磁碟中的資料時速度可以達到 40mb/s,這兩者的效能差距有幾個數量級,因此我們也應該儘量減少隨機 i/o 的次數,這樣才能提高效能。
固態硬碟(solid state drive、ssd)是一種以快閃儲存器作為持久儲存器的電腦儲存裝置[^9]。與機械硬碟不同,固態硬碟中不包含任何的機械結構,我們使用它讀取或者儲存資料時不會使用到任何的機械結構,因為一切過程都是由電路完成的,所以 ssd 的讀寫速度比 hdd 快很多。
圖 5 - hdd 和 ssd 的**
機械硬碟和 ssd 從誕生後**都在不斷降低,機械硬碟是今天資料中心使用的主要外部儲存,大多數通用的商用伺服器都會使用機械硬碟作為主要的外部儲存,但是因為 ssd 的讀寫速度是機械硬碟的幾十倍,所以越來越多的伺服器,尤其是資料庫都會使用 ssd 作為外部儲存。不過作為具有機械結構的外部儲存裝置,它雖然結構非常成熟並且具有較大的容量,但是它在受到震動時很容易受到外界的干擾。
硬碟是計算機上的外部儲存裝置,它可以持久儲存大量資料,然而 cpu 無法直接訪問硬碟中的資料,當計算機啟動時作業系統會將硬碟中的資料載入到記憶體中以便 cpu 訪問,但是如果 cpu 要訪問的資料不在記憶體中,那麼我們需要花費幾千倍甚至幾十萬倍的時間來讀取資料,這主要是由以下兩個原因造成的:
正如我們在文章中提到的,硬碟不是計算機執行的必要硬體裝置,計算機可以從磁碟、光碟等任意外部儲存裝置中將啟動所需要的資料載入到記憶體中並正常啟動,不過硬碟已經是今天最為常見的外部儲存裝置了。到最後,我們還是來看一些比較開放的相關問題,有興趣的讀者可以仔細思考一下下面的問題:
dma訪問主存時 Cache和DMA一致性
dma應該多多少少知道點吧。dma direct memory access 是指在外置可以不用cpu干預,直接把資料傳輸到記憶體的技術。這個過程中可以把cpu解放出來,可以很好的提公升系統效能。那麼dma和cache有什麼關係呢?這也需要我們關注?我們知道dma可以幫我們在i o和主存之間搬運資料...
為什麼無法訪問mysql mysql為什麼無法訪問
mysql無法訪問有兩種情況 乙個是mysql沒有分配許可權,使用grant語句分配訪問許可權即可格式 grant 許可權 on 資料庫名.表名 使用者 登入主機 identified by 使用者密碼 grant select,update,insert,delete on to zhxia id...
訪問伺服器 使用國外伺服器時訪問為什麼很慢?
很多站長在首次使用國外伺服器時,往往會遇到海外伺服器的訪問速度很慢,甚至會出現 打不開等情況,那麼使用國外伺服器時訪問為什麼很慢?歸根結底還是因為不了解國外伺服器,訪問慢和伺服器的許多因素都有關聯,下面我們來一起了解一下。一 配置 不同伺服器的配置導致 的整體訪問速度.一般的硬體配置包括硬碟大小 記...