適用於順序磁碟訪問的1分鐘法則

来源:https://www.cnblogs.com/suqinglee/archive/2022/07/23/16511074.html
-Advertisement-
Play Games

預備知識梳理 本文中設定 block size 與 page size 大小相等。 什麼是 Block 文章的開始先解釋一下,磁碟的數據讀寫是以扇區 (sector) 為單位的,而操作系統從磁碟上讀寫數據是以塊 (block) 為單位的,一個 block 由若幹個連續的 sector 組成,使用 b ...


預備知識梳理

本文中設定 block size 與 page size 大小相等。

什麼是 Block

文章的開始先解釋一下,磁碟的數據讀寫是以扇區 (sector) 為單位的,而操作系統從磁碟上讀寫數據是以塊 (block) 為單位的,一個 block 由若幹個連續的 sector 組成,使用 block 代替 sector 能夠提升讀寫速度,相應的空間碎片會變得更大,是一種空間換時間的應用。

如何從磁碟上讀取一個位元組?

  1. 移動磁臂到指定的柱面。
  2. 移動磁頭到指定的磁軌。
  3. 磁碟旋轉到指定的扇區。
  4. 載入扇區的數據到記憶體。
  5. 從記憶體中讀取一個位元組。

什麼是 Page

為了更高效率的利用物理記憶體,會將其劃分為若幹個頁 (page),page 和 block 都是操作系統層面的概念,而不是硬體層面,一般來講二者的大小相等。

什麼是 Buffer

有一種特殊的 page 為 buffer page,buffer page 中存在若幹個大小相等的 buffer,每個 buffer 對應一個 block,如果 page 和 block 大小相等,那就是一個 buffer page 對應一個 block。

之所以要有 buffer,是因為記憶體和磁碟的讀寫速率相差過大,應用從磁碟上讀數據時,數據會先批量載入一部分到 buffer 中,應用再從 buffer 中讀取數據。

什麼是 5 分鐘法則

假設 1 個磁碟的價格為 30000 元,支持每秒訪問 15 次,那麼可以認為每秒訪問 1 次磁碟的成本為 2000 元,也就是每秒從磁碟上讀取 1 個 block 的成本為 2000 元,記為 2000/block/second。

假設 1 個記憶體的價格為 5000 元,大小為 4 MB,即該記憶體上約有 1000 個 page,那麼可以認為 1 個 page 的成本約為 5 元,記為 5/page。

假設有 4KB 的數據存儲在磁碟上,讀取它的頻率為 1 秒 10 次。則每秒的成本是 20000 元。如果將它記錄在記憶體中,則每秒的成本是 5 元,因此選擇將數據記錄在磁碟上是更經濟的選擇。不難算出,當讀取頻率為 1 秒 0.0025 次,即 400 秒 1 次時,成本都是 5 元,是經濟和不經濟的臨界點。那麼如何計算這個臨界點呢?

設:

  • P:1MB 記憶體中有多少個 page。
  • A:磁碟支持每秒訪問多少次,即每秒讀取多少個 page。
  • D:磁碟驅動器價格。
  • M:1MB 記憶體的成本。
  • I:數據讀取頻率為多少秒 1 次。

當:

\[\frac{D/A}{I} = \frac{M}{P} \]

時,為經濟和不緊急的臨界點,代入上述數據:

\[\frac{30000/15}{I} = \frac{5000/4}{1000/4} \]

得出 I = 400 秒,約等於 5 分鐘,即當存儲設備價格為上述情況時,訪問頻率高於 5 分鐘 1 次的數據應該記錄在記憶體中,實際應用時,可以將從磁碟讀到的數據記錄到記憶體上,並設置 5 分鐘的生存時間,如果 5 分鐘內再次讀取該數據,則刷新生存時間,否則從記憶體中刪除。

最終我們可以得出生存時間(訪問頻率)的計算公式為:

\[I = \frac{P \times D}{A \times M} \]

10 年後的 5 分鐘法則

上面的 5 分鐘法則是 Jim Gary 在 1987 年提出的,10 年後,Jim Gary 又使用了 1997 年的存儲器價格進行計算,得出 10 年後的 5 分鐘法則依然適用。

我們可以把 P/A 看作技術比率,D/M 看作經濟比率,論文中統計了 1980 - 2000 的存儲器數據,發現技術比率縮減至十分之一,經濟比率放大了十倍,可以看出,雖然存儲器一直在發展,但是 5 分鐘法則計算得出的結果依舊是穩定的。

磁碟順序訪問

上面提到的 5 分鐘法則,是只讀取 1 個 block 大小的數據,即隨機讀取數據。當順序讀取數據時,也就是讀取超過 1 個 block 的數據,由於順序讀取不需要移動磁臂磁頭、旋轉盤面,速度是遠遠大於隨機讀取的,因此順序讀取不再適用 5 分鐘法則。

如果順序讀取數據後不會再次讀取,就不需要記錄(緩存)數據到記憶體,系統只需要足夠的 buffer 讓磁碟上的數據載入到記憶體上。一般來說 buffer 的大小不會超過 1MB。

這裡的不需要記錄到記憶體是指不需要常駐記憶體以待後續訪問,而通過 buffer 載入磁碟數據到記憶體是指應用讀取數據並處理。

如果順序讀取數據後還會再次讀取,例如資料庫中的 sort、cube、rollup、join 操作都有這種行為。下麵以 sort 為例分析順序訪問操作。

兩階段排序

正常的排序是:先讀數據,再排序,再寫數據,這樣的過程稱為單階段排序。如果數據過多無法全部載入記憶體,則會採用兩階段排序,第一階段劃分所有數據為若幹個子數據集,並分別排序;第二階段歸併所有子排序結果,示意圖如下。

兩階段排序的記憶體需求可以由下麵的式子描述:

\[6 \times buffer\_size + \sqrt{3 \times buffer\_size \times file\_size} \]

推導過程:

  1. 第一階段產生 file_size/memory_size 個子數據集,假設 1MB 記憶體,10MB 大小數據集,那就劃分為 10 個大小為 1MB 的子數據集,剛好可以在記憶體中排序。
  2. 第二階段歸併 memory_size/buffer_size 個子排序結果,一個 buffer 對應一個子數據集,假設 buffer 大小為 256KB,則一次歸併 4 個子排序結果,註意這裡的 buffer 和文章開始提的 buffer 不一樣,這裡的 buffer 是應用管理的,文章開始提的 buffer 是操作系統管理的。

在排序的設計中,file_size/memory_size 和 memory_size/buffer_size 應該是相等的。

\[\frac{file\_size}{memory\_size} = \frac{memory\_size}{buffer\_size} \]

由此可以得出 memory_size 的計算公式:

\[memory\_size = \sqrt{file\_size \times buffer\_size} \]

這裡的 memory_size 對應上圖中 Input Buffer 的大小,公式中更好項外面的 buffer_size 對應上圖中 Output Buffer 的大小,常數 3 和 6 取決於特定的排序演算法。

1 分鐘順序法則推導

對於相同大小的待排序數據來說,單階段排序的磁碟讀寫次數是兩階段排序的一半,但是兩階段排序相比於單階段排序只需要更小的記憶體。當記憶體大小足夠進行單階段排序時,我們是選擇單階段排序還是兩階段排序呢?

這個問題也是 5 分鐘法則公式的一個應用,1997 年的硬體規格如下:

  • P:128 pages/MB
  • A:64 access/second/disk
  • D:2000 $/disk
  • M:15 $/MB

但是由於排序是順序訪問數據,因此 P/A 技術比率不應該按照硬體參數帶入公式,已知磁碟順序訪問的平均速率在 5MB 每秒,如果 P 是 16 pages/MB,那麼 A 就是 5*16 = 80 access/second/disk(訪問一次是 1 個block 對應 1 個 page),也就是 P/A 為 0.2,帶入公式:0.2*2000/15 = 26。

計算得到 I = 26,表示 26 秒 1 次的訪問頻率為盈虧臨界值。但是排序既需要讀也需要寫,IO 成本增加一倍,盈虧臨界值應該在 52 秒,近似為 1 分鐘。

因此可以得出一分鐘順序法則:如果數據順序訪問頻率高於 1 分鐘 1 次,應當使用記憶體來緩存數據。

舉個例子,單階段排序的計算速度大概在 5GB 每分鐘,根據一分鐘順序法則,小於 5GB 的數據應當使用單階段排序。當數據大小超過了 5GB,則應該使用雙階段排序。

這裡解釋一下,這裡的 5GB 每分鐘是計算速度,對於 5GB 及以下的文件,一次性讀取全部數據到記憶體後,1 分鐘以內可以排序完成,因此訪問頻率是高於 1 分鐘 1 次;如果是 10 GB 的數據,一次性讀取數據後,需要 2 分鐘才可以排序完成,因此訪問頻率是 2 分鐘 1 次。還需要註意的是,寫回數據的問題是在 26*2 = 56 時體現的。

類似的,該法則也適用於其他順序操作,例如 group by、rollup、cube、hash join、index build 等等。

總結

對於隨機訪問的數據,訪問頻率高於 5 分鐘 1 次,就緩存在記憶體中;對於順序訪問的數據,訪問頻率高於 1 分鐘 1 次,就緩存在記憶體中。無論是隨機還是順序,前提都是數據不止訪問一次,否則不涉及緩存問題。

參考論文:The Five-Minute Rule Ten Years Later, and Other Computer Storage Rules of Thumb,論文成文於 1997 年,因此主要理解計算方法。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 現象 在ubuntu上編譯內核時,apt-get source時出現如下warning: W: Download is performed unsandboxed as root as file '/var/cache/apt/archives/partial/samba-libs_2%3a4.5. ...
  • 10 | MySQL為什麼有時候會選錯索引? 使用哪個索引是由 MySQL 來確定的 可能遇到的情況:一條本來可以執行得很快的語句,卻由於 MySQL 選錯了索引,而導致執行速度變得很慢 先建一個簡單的表,表裡有 a、b 兩個欄位,並分別建上索引: CREATE TABLE `t` ( `id` i ...
  • 11 | 怎麼給字元串欄位加索引? Q:如何在郵箱這樣的欄位上建立合理的索引? 用戶表的定義: create table SUser( ID bigint unsigned primary key, email varchar(64), ... )engine=innodb; 由於要使用郵箱登錄,所 ...
  • 06 | 全局鎖和表鎖 :給表加個欄位怎麼有這麼多阻礙? Connection連接與Session會話 通俗來講,會話(Session)是通信雙⽅從開始通信到通信結束期間的⼀個上下文(Context)。這個上下文是⼀段位於伺服器端的記憶體:記錄了本次連接的客戶端機器、通過哪個應用程式、哪個用戶登錄等信 ...
  • 09 | 普通索引和唯一索引,應該怎麼選擇? 每個人都有一個唯一的身份證號,而且業務代碼已經保證了不會寫入兩個重覆的身份證號。如果市民系統需要按照身份證號查姓名,就會執行類似這樣的 SQL 語句: select name from CUser where id_card = 'xxxxxxxyyyy ...
  • 分享嘉賓:張鴻志博士 美團 演算法專家 編輯整理:廖媛媛 美的集團 出品平臺:DataFunTalk **導讀:**美團作為中國最大的線上本地生活服務平臺,連接著數億用戶和數千萬商戶,其背後蘊含著豐富的與日常生活相關的知識。美團知識圖譜團隊從2018年開始著力於圖譜構建和利用知識圖譜賦能業務,改善用戶 ...
  • 什麼是 MyBatis? MyBatis 是一款優秀的持久層框架,它支持自定義 SQL、存儲過程以及高級映射。 MyBatis 免除了幾乎所有的 JDBC 代碼以及設置參數和獲取結果集的工作。 MyBatis 可以通過簡單的 XML 或註解來配置和映射原始類型、介面和 Java POJO(Plain ...
  • 1.自然連接 NATURAL JOIN SQL99中新增的自然連接相當於SQL92中的等值連接。它可以自動的查詢兩個表中所有的相同欄位,然後進行等值連接。 在SQL92中: SELECT 表1.欄位1,表2.欄位2 FROM 表1 JOIN 表2 ON 表1.欄位3 = 表2.同名欄位 AND 表2 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...