【恐龍】理解 I/O:隨機與順序

原文翻譯:Understanding I/O: Random vs Sequential

EREN
erens-tech-book

--

原文使用迴轉壽司對 I/O 做了很有趣的比喻,希望能藉由翻譯這篇文章以及我自己的一點補充讓大家更了解 I/O。

你曾去過迴轉壽司店嗎?

壽司師傅將製作好的壽司放在盤子後擺在運輸帶上,運輸帶圍繞餐廳的坐檯而行,顧客則從運輸帶上挑選想吃的壽司。

如果你稍微遲疑了一下,那你想吃的壽司可能就會超出你能拿到的範圍,你需要再等一圈才能拿到它,而且前提是別人沒拿走它。

現在,我們簡單假設運輸帶上的所有壽司種類皆不同,且每盤壽司走完一圈運輸帶需要 4 分鐘。

今天,你(而且全店只有你)進到了店裡,從菜單上挑選了幾個想吃的壽司,它們落在運輸帶上的各個地方。

你認為它們要花多久的時間才能轉到你的眼前呢?

我們可以任意指定這些壽司在帶上的任何一處,它可能就在你的眼前的帶上,你可以馬上取得;又或者它剛剛才經過了你,需要再等待 4 分鐘的時間。

當你遵循這套隨機規則,也就是從菜單中選擇壽司並在它到達眼前的輸送帶時取走它。你應該已經意識到,你平均等待壽司到你眼前的時間為:最小和最大等待時間的平均,也就是 2 分鐘。如果你挑選了 8 道壽司,你可能需要 16 分鐘才能取完。

Welcome to the disk data diet, I hope you weren’t too hungry ?

現在我們考慮另一種方案,你向師傅訂了 8 道壽司,師傅依序地將 8 道壽司放在輸送帶的某處,所以你需要平均時間 2 分鐘來等第一道壽司,但剩下的 7 道因為依序在後方所以不用等待。在這種方案下,8 道壽司只會花上你 2 分鐘,是不是好多了。

輸送帶就像是磁碟(Hard disk),而我們要吃的壽司就好比正要讀取(Read)的磁碟塊(Block)。

我還沒想清楚要怎麼把朝日啤酒加進這個故事,如果你有想法我會很感謝你。

什麼是磁碟塊(Block)?它是作業系統上的文件系統中用於儲存資料的最小單元。
下一段我們會提到扇區(Sector),扇區指的是磁碟的最小的物理邏輯單元,通常可容納 512 或 4096 bytes。
塊就類似於扇區,但它由文件系統處理。它必須至少是一個至數個扇區,透過將塊定義為多個扇區,作業系統能藉此使用更大的磁碟設備,而不會增加塊的地址數量。
關於如何分配塊的大小,有一些更進階的問題,如碎片化(Fragmentation)等,就不在這邊多介紹了。

隨機 I/O vs 順序 I/O

每次訪問磁碟的一個磁碟塊時,磁臂(Actuator arm)就要移動到正確的軌道(Track)上,這段時間稱為尋找時間(Seek time)。然後盤片(Platter)會旋轉道正確的扇區(Sector)上,這段時間則稱為旋轉延遲(Rotational latency)。

再更簡單地說明一下:

磁碟系統(Disk System)由多片磁碟(Disk)所組成,通常一片磁碟的雙面都能儲存資料(除了最上和最下面以外);每片磁碟由多條軌道(Track)組成;而每條軌道又可劃分成多個扇區(Sector)。

再來是磁碟存取時間(Disk Access Time):

  1. 尋找時間(Seek time):尋找軌道(Track)的時間
  2. 旋轉延遲(Rotational latency):尋找扇區的(Sector)時間
  3. 傳輸時間(Transfer time):資料到記憶體之間的傳輸時間

下面這張圖很好地解釋了一個磁碟的訪問動作:

http://pages.cs.wisc.edu/~powerjg/cs354-fall15/Handouts/arulraj/ppt/CS354Lecture24.pdf

不難看出,整個訪問的時間取決於磁頭的初始位置,還有需要訪問的扇區位置,如果扇區剛好在磁頭下方,則無需等待;如果剛剛經過磁頭,就必須等上一周期的時間。

就像迴轉壽司的兩個例子,當我們要訪問的下一個磁碟塊隨機位在磁碟某處,訪問它同樣會有尋找時間與旋轉延遲,這種 I/O 稱做隨機 I/O(Random I/O;如果下個訪問的磁碟塊正好位在現在這個磁碟塊的後方,不需等待,這種 I/O 則稱作順序 I/O(Sequential I/O

儲存的基本特徵

在原作者之前的文章中,描述了儲存的基本特徵:

Latency, IOPS and Bandwidth (or Throughput)

延遲(Latency表示一個封包從來源端送出後,到目的端接收到這個封包,中間所花的時間。在儲存系統的資料中,它通常表示單個 I/O 的平均值,磁碟的延遲通常以毫秒為單位,快閃(Flash)則常以微秒表示。

IOPS 是每秒 I/O 數的簡稱,表示一秒內讀寫的次數,我們能用 IOPS 來描述一個資料庫的 I/O 操作量,或者用來表示儲存系統的最大性能。

吞吐量(Throughput表示傳輸媒介的實際值,可能受到延遲(Latency)、協議(Protocol)等原因影響,以 IOPS(MB/sec 或 GB/sec)作為單位。

頻寬(Bandwidth則表示傳輸媒介的所能達到的理論最大吞吐量(Throughput),同樣以 IOPS 作為單位。

在現實世界中,這些特徵是相互權衡的。

儘管沒有嚴格的數學定義,但儲存系統的延遲會隨著它變得繁忙而上升。我們能通過 IOPS 或吞吐量測量系統的繁忙程度,但吞吐量受到了磁碟塊大小的影響。我們可以說延遲與吞吐量成正比,更準確地說,系統實際上的延遲通常隨著接近飽和點而呈現指數增長。

Latency ∝ IOPS

但要注意上圖表示的響應時間(Response time)不應該與延遲(Latency)混淆,延遲是衡量系統中的時間延遲(Time delay)的度量。這兩個術語隨著 I/O 等待時間(I/O wait time)的變化不應被互相混淆使用。

如果你的資料庫需要從磁碟讀取塊,那麼該操作整個完成的時間就是響應時間

延遲一詞則有更精確及更窄的定義。它表示設備準備開始讀取塊時所需要的時間,不包括完成讀取所需的時間。這磁碟中,它包括尋找時間以及旋轉延遲,兩者都是機械過程(因此很慢)。

如果你的用戶 session 在磁碟操作之後等待該 I/O,在進程繼續(阻塞 blocking)一直到進行 I/O 操作的時間被稱做 I/O 等待時間

I/O wait is the total time that working processes are blocked, waiting for the I/O operation to complete.

Translating Storage Into Application

大小事項

Throughput = IOPS x I/O size

現在該考慮 I/O 大小了。何謂 I/O 大小呢,如果 1 秒中讀取 1 個隨機塊(簡化問題),那 IOPS 就是 1,I/O 大小也是 1,吞吐量就是每秒 1 塊。

如果是連續讀取 8 個連續塊,那此時 IOPS 仍為 1,但 I/O 大小為 8,所以吞吐量為每秒 8 塊。順序 I/O 支持遞增式的吞吐量,每增加 I/O 資料塊的數量就能得到吞吐量的提升,IOPS 則維持不變。

你能從這個範例看到順序 I/O 在磁碟系統上的優勢。但如果增加 IOPS 的數量會怎麼樣?

延遲會降低磁碟性能

如果你需要更多的 IOPS,你要怎麼做?使用磁碟系統,你只有一個選擇:增加更多的磁碟。

另一方面,如果你能按順序執行 I/O,則可以降低 IOPS 的要求並提高吞吐量,從而允許磁碟系統提供更多資料。

--

--

EREN
erens-tech-book

“I’m quite illiterate, but I read a lot. “ — J.D.Salinger, The Catcher in the Rye