天天看點

docker的建立 指定CPU 記憶體 網絡 硬碟_為什麼 CPU 通路硬碟很慢

docker的建立 指定CPU 記憶體 網絡 硬碟_為什麼 CPU 通路硬碟很慢
docker的建立 指定CPU 記憶體 網絡 硬碟_為什麼 CPU 通路硬碟很慢

機械硬碟(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 年多的時間。

在計算機體系結構中,硬碟屬于一種常見的輸入輸出裝置,作業系統在啟動時不一定需要硬碟,它既可以通過硬碟啟動,也可以通過網絡裝置或者外部裝置啟動,是以硬碟不是計算機運作的必要條件。

docker的建立 指定CPU 記憶體 網絡 硬碟_為什麼 CPU 通路硬碟很慢

von-neumann-architecture.svg

圖 1 - 輸入輸出裝置

作為一種外部的輸入輸出裝置,與 CPU 緩存和記憶體相比,硬碟極慢的讀取和寫入速度就顯得比較合理了,然而幾千倍甚至幾十萬倍的速度差異也确實讓人很難想象或者接受,在這篇文章中,我們會分析為什麼 CPU 通路硬碟的速度非常慢:

  • CPU 通路硬碟資料的過程比較複雜,它會先通過 I/O 操作将磁盤中的資料讀入記憶體,再通路記憶體的資料;
  • 機械硬碟在通路磁盤中的資料依賴的是機械結構,需要移動磁盤中的機械臂;

I/O 操作

CPU 想要通路磁盤中的資料一定要先通過 I/O 操作将磁盤中的資料讀入到記憶體中,再通路存儲在記憶體中的資料。計算機中包含三種比較常見的 I/O 操作[^2] — 程式設計 I/O(Programmed I/O)、中斷驅動 I/O(Interrupt-driven I/O)和直接記憶體通路(Direct Memory Access),我們接下來将依次介紹上述的這幾種操作[^3]:

docker的建立 指定CPU 記憶體 網絡 硬碟_為什麼 CPU 通路硬碟很慢

io-operation

圖 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 裝置:

docker的建立 指定CPU 記憶體 網絡 硬碟_為什麼 CPU 通路硬碟很慢

dma-controller

圖 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 左右的時間。

docker的建立 指定CPU 記憶體 網絡 硬碟_為什麼 CPU 通路硬碟很慢

disk-random-io

圖 4 - 磁盤的随機 I/O

我們在估算資料庫的查詢時可以使用 10ms 這個數量級對随機 I/O 占用的時間進行估算,這裡想要說的是随機 I/O 對于資料庫的查詢性能影響會非常大,而順序讀取磁盤中的資料時速度可以達到 40MB/s,這兩者的性能差距有幾個數量級,是以我們也應該盡量減少随機 I/O 的次數,這樣才能提高性能。

固态硬碟(Solid State Drive、SSD)是一種以閃存作為持久存儲器的電腦儲存設備[^9]。與機械硬碟不同,固态硬碟中不包含任何的機械結構,我們使用它讀取或者存儲資料時不會使用到任何的機械結構,因為一切過程都是由電路完成的,是以 SSD 的讀寫速度比 HDD 快很多。

docker的建立 指定CPU 記憶體 網絡 硬碟_為什麼 CPU 通路硬碟很慢

hdd-ssd-price

圖 5 - HDD 和 SSD 的價格

機械硬碟和 SSD 從誕生後價格都在不斷降低,機械硬碟是今天資料中心使用的主要外部存儲,大多數通用的商用伺服器都會使用機械硬碟作為主要的外部存儲,但是因為 SSD 的讀寫速度是機械硬碟的幾十倍,是以越來越多的伺服器,尤其是資料庫都會使用 SSD 作為外部存儲。不過作為具有機械結構的外部儲存設備,它雖然結構非常成熟并且具有較大的容量,但是它在受到震動時很容易受到外界的幹擾。

總結

硬碟是計算機上的外部儲存設備,它可以持久存儲大量資料,然而 CPU 無法直接通路硬碟中的資料,當計算機啟動時作業系統會将硬碟中的資料加載到記憶體中以便 CPU 通路,但是如果 CPU 要通路的資料不在記憶體中,那麼我們需要花費幾千倍甚至幾十萬倍的時間來讀取資料,這主要是由以下兩個原因造成的:

  • CPU 需要通過 I/O 操作通路外部存儲中的資料,程式設計 I/O、中斷驅動 I/O 和 DMA 幾種方式都會帶來額外開銷并占用較多的 CPU 時間;
  • 機械硬碟會通過機械結構通路其中存儲的資料,每一次硬碟的随機 I/O 都需要執行隊列、尋道、旋轉和轉移資料幾個過程,大約需要消耗 10ms 的時間;

正如我們在文章中提到的,硬碟不是計算機運作的必要硬體裝置,計算機可以從磁盤、CD光牒等任意外部儲存設備中将啟動所需要的資料加載到記憶體中并正常啟動,不過硬碟已經是今天最為常見的外部儲存設備了。到最後,我們還是來看一些比較開放的相關問題,有興趣的讀者可以仔細思考一下下面的問題:

  • 寫入到硬碟上的資料一定會被持久存儲,不會丢失嗎?
  • 記憶體中的資料為什麼在斷電重新開機之後就會被清空?

良許個人微信

添加良許個人微信即送3套程式員必讀資料

→ 精選技術資料共享

→ 高手如雲交流社群

docker的建立 指定CPU 記憶體 網絡 硬碟_為什麼 CPU 通路硬碟很慢

本公衆号全部博文已整理成一個目錄,請在公衆号裡回複「 m 」擷取!

推薦閱讀:

Github Star 全球唯一的國産程式員!Apache 頂級項目Commiter。

肝!Shell 腳本程式設計最佳實踐

中美日印程式員收入對比

5T技術資源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,單片機,樹莓派,等等。在公衆号内回複「1024」,即可免費擷取!!

docker的建立 指定CPU 記憶體 網絡 硬碟_為什麼 CPU 通路硬碟很慢

繼續閱讀