MySQL學習筆記(21):優化磁碟IO

来源:https://www.cnblogs.com/garvenc/archive/2020/07/20/mysql_learning_21_optimize_disk_io.html
-Advertisement-
Play Games

本文更新於2020-04-05,使用MySQL 5.7,操作系統為Deepin 15.4。 使用符號連接分佈IO 利用操作系統的符號連接,將不同的資料庫、表、索引指向不同的物理磁碟,從而達到分佈磁碟IO的目的。 禁止操作系統更新文件的atime屬性 對於讀寫頻繁的資料庫文件來說,記錄文件的訪問時間一 ...


本文更新於2020-04-05,使用MySQL 5.7,操作系統為Deepin 15.4。

目錄

使用符號連接分佈IO

利用操作系統的符號連接,將不同的資料庫、表、索引指向不同的物理磁碟,從而達到分佈磁碟IO的目的。

禁止操作系統更新文件的atime屬性

對於讀寫頻繁的資料庫文件來說,記錄文件的訪問時間一般沒有用處,卻會增加磁碟的負擔,影響IO性能。

用裸設備(Raw Device)存放InnoDB共用表空間

因InnoDB使用緩存機制來緩存索引和數據,操作系統的磁碟IO緩存對其性能不僅沒有幫助,甚至還有反作用。在InnoDB緩存充足的情況下,可以考慮使用裸設備來存放共用表空間。

調整IO調度演算法

Linux實現了4中IO調度演算法:

  • NOOP演算法(No Operation):不對IO請求排序,除了合併請求也不會進行其他任何優化,用最簡單的先進先出FIFO隊列順序提交IO請求。NOOP演算法主要面向隨機訪問設備,如SSD。
  • 最後期限演算法(Deadline):除了維護一個擁有合併和排序功能的請求隊列外,額外維護兩個帶有超時的FIFO隊列,分別是讀請求隊列和寫請求隊列。當調度器發現讀/寫請求隊列中的請求超時,會優先處理這些請求。
  • 預期演算法(Anticipatory):是基於預測的IO演算法,和Deadline類似,也維護了三個請求隊列。區別在於,Anticipatory處理完一個IO請求後並不會直接返回處理下一個請求,而是等待片刻(預設6ms),等待期間如果有新來的相鄰扇區的請求,會直接處理新來的請求。Anticipatory適合寫入較多的環境,不適合資料庫等隨機讀較多的環境。
  • 完全公平隊列(Complete Fair Queuing/CFQ):把IO請求按照進程分別放入進程對應的隊列中,其公平是針對進程而言的。CFQ以時間片演算法為前提,輪轉調動隊列。

建議MySQL資料庫環境設置為Deadline演算法。

使用磁碟陣列(RAID)

RAID(Redundant Array of Inexpensive Disks),即廉價磁碟冗餘陣列,通常叫做磁碟陣列。

RAID級別:

  • RAID0:也叫條帶化。
  • RAID1:也叫磁碟鏡像。
  • RAID10:先做磁碟鏡像,再條帶化。
  • RAID4:像RAID0一樣條帶化,但額外增加一個磁碟用於糾錯。
  • RAID5:對RAID4的改進,但將糾錯數據也分別寫到各個磁碟而不是一個磁碟。

RAID卡電池充放電問題

RAID卡都有寫緩存(Battery Backed Write Cache),寫緩存對IO性能的提升非常明顯。為了避免掉電丟失寫緩存中的數據,RAID卡都有電池(Battery Backup Unit,簡稱BBU)。

RAID緩存策略包括4部分:

  • 寫策略
    • WriteBack:將數據寫入緩存後直接返回。
    • WriteThrough:不使用寫緩存,直接寫入磁碟才返回。
  • 預讀策略
    • ReadAheadNone:不開啟預讀。
    • ReadAhead:開啟預讀,預先把後面的數據載入入緩存。
    • ReadAdaptive:自適應預讀,在緩存和I/O空閑的時候進行預讀。
  • 讀策略
    • Direct:讀操作不進行緩存。
    • Cached:讀操作進行緩存。
  • 故障策略
    • Write Cache OK if Bad BBU:如果BBU出問題,不使用寫緩存,從WriteBack自動切換到WriteThrough。
    • No Write Cache if Bad BBU:如果BBU出問題,仍然使用寫緩存。

RAID卡電池會定期啟動自動校準模式,即定期充放電。期間,RAID卡控制器不會啟動BBU。同時(除非修改緩存策略),也會禁用WriteBack寫緩存策略,以保證數據完整性,造成系統IO性能會出現較大波動。

解決方案:

  • 根據RAID卡電池下次充放電的時間,在業務量較低的時候,提前進行充放電。
  • 即使電池電量低於警戒值甚至電池放電完畢,強制使用WriteBack寫緩存策略。此時一定要有UPS之類的後備電源。

NUMA架構優化

目前的商用伺服器系統架構大體分為三類(一般SMP或NUMA較多):

  • 對稱多處理器架構(SMP/Symmetric Multi-Processor):一臺電腦上彙集了一組CPU,各CPU平等地共用記憶體、IO等資源。SMP也被稱為一致存儲訪問架構(UMA/Uniform Memory Access)。由於共用,導致SMP伺服器的擴展能力非常有限,最受限制的是記憶體,因每個CPU必需通過相同的匯流排訪問相同的記憶體資源。
  • 非一致存儲訪問架構(NUMA/Non-Uniform Memory Access):一臺電腦分為多個節點,每個節點內部擁有多個CPU,節點內部使用共有的記憶體控制器,節點之間通過互聯模塊進行連接和信息交互。節點的所有記憶體對於本節點的所有CPU都是等同的,對於其他節點的所有CPU都是不同的。每個CPU都可以訪問整個系統的記憶體,但訪問本地節點的較快,訪問非本地節點的較慢。因此,隨著CPU數量的增加,系統性能並不能線性增加。
  • 海量並行處理架構(MPP/Massive Parallel Processing):由多個SMP伺服器通過一定的節點互聯網路進行連接,每個節點只訪問本地資源,不訪問其他節點的資源。因而,理論上可以無限擴展。

NUMA的記憶體分配策略有4種:

  • 預設default:總是在當前進程運行的本地節點分配。其節點之間記憶體分配不均衡,當某個CPU節點記憶體不足時,會導致swap產生。
  • 綁定bind:強制分配到指定節點上。
  • 交叉interleave:在所有節點或指定節點上交叉分配記憶體。
  • 優先preferred:在指定節點上分配,失敗則在其他節點上分配。

MySQL對NUMA特性支持不好。


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

-Advertisement-
Play Games
更多相關文章
  • 可以直接用CE進行雷總數修改,下麵是通過C#直接修改雷總數記憶體地址 /// PROCESS_ALL_ACCESS -> (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFF) public const int PROCESS_ALL_ACCESS = (ST ...
  • 在本文中,我將展示如何使用DfaGraphWriter服務在ASP.NET Core 3.0應用程式中可視化你的終結點路由。上面文章我向您演示瞭如何生成一個有向圖(如我上篇文章中所示),可以使用GraphVizOnline將其可視化。最後,我描述了應用程式生命周期中可以檢索圖形數據的點。 作者:依樂 ...
  • nginx的調度演算法中hash $remote_addr 和ip_hash是把IP地址的前24位做hash,所以如果你的IP前三段相同時,nginx它會認為是和nginxserver是同一區域網,所以它會把請求調度到同一區域網之前來請求過的後端server上進行響應;當然除了我們可以對源地址做ha... ...
  • cut 命令在Linux和Unix中的作用是從文件中的每一行中截取出一些部分,並輸出到標準輸出中。我們可以使用 cut 命令從一行字元串中於以位元組,字元,欄位(分隔符)等單位截取一部分內容出來。 在本文中,我們通過一些例子來瞭解 cut 命令的使用,這些使用方法在我們的日常工作中也是非常常用的。 C ...
  • 方法一: 使用原版wine,並配置q4wine,並下載最新的wechat 進行安裝使用; 可能會出現問題,需要自己調試解決; 方法二: 使用deepin-wine 和deepin-wechat,因為這個已經得到了測試,所以錯誤少點,用的人也多一點; 安裝方式: https://gitee.com/w ...
  • Java整個堆大小設置 Xmx 和 Xms設置為老年代存活對象的3-4倍,即FullGC之後的老年代記憶體占用的3-4倍 永久代PermSize和MaxPermSize設置為老年代存活對象的1.2-1.5倍。 永久區並不是老年代的1.2到1.5倍,而是FullGC後永久區的1.2到1.5倍 1.2x ...
  • swap交換記憶體主要是指當物理記憶體不夠用時,系統會啟用硬碟的一部分空間來充當伺服器記憶體,而預設情況下swap記憶體會有一些設置標準,它與物理記憶體的大小也是有關係的,具體標準如下: Ram大小 Swap大小 激活Swap後合計大小 256MB 256MB 512MB 512MB 512MB 1GB 1G ...
  • 一 跨域概述 1.1 同源策略 同源策略是一個安全策略。同源,指的是協議,功能變數名稱,埠相同。瀏覽器處於安全方面的考慮,只允許本功能變數名稱下的介面交互,不同源的客戶端腳本,在沒有明確授權的情況下,不能讀寫對方的資源。 同源策略主要是基於如下可能的安全隱患: 用戶訪問www.mybank.com,登錄併進行網銀 ...
一周排行
    -Advertisement-
    Play Games
  • GoF之工廠模式 @目錄GoF之工廠模式每博一文案1. 簡單說明“23種設計模式”1.2 介紹工廠模式的三種形態1.3 簡單工廠模式(靜態工廠模式)1.3.1 簡單工廠模式的優缺點:1.4 工廠方法模式1.4.1 工廠方法模式的優缺點:1.5 抽象工廠模式1.6 抽象工廠模式的優缺點:2. 總結:3 ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 本章將和大家分享ES的數據同步方案和ES集群相關知識。廢話不多說,下麵我們直接進入主題。 一、ES數據同步 1、數據同步問題 Elasticsearch中的酒店數據來自於mysql資料庫,因此mysql數據發生改變時,Elasticsearch也必須跟著改變,這個就是Elasticsearch與my ...
  • 引言 在我們之前的文章中介紹過使用Bogus生成模擬測試數據,今天來講解一下功能更加強大自動生成測試數據的工具的庫"AutoFixture"。 什麼是AutoFixture? AutoFixture 是一個針對 .NET 的開源庫,旨在最大程度地減少單元測試中的“安排(Arrange)”階段,以提高 ...
  • 經過前面幾個部分學習,相信學過的同學已經能夠掌握 .NET Emit 這種中間語言,並能使得它來編寫一些應用,以提高程式的性能。隨著 IL 指令篇的結束,本系列也已經接近尾聲,在這接近結束的最後,會提供幾個可供直接使用的示例,以供大伙分析或使用在項目中。 ...
  • 當從不同來源導入Excel數據時,可能存在重覆的記錄。為了確保數據的準確性,通常需要刪除這些重覆的行。手動查找並刪除可能會非常耗費時間,而通過編程腳本則可以實現在短時間內處理大量數據。本文將提供一個使用C# 快速查找並刪除Excel重覆項的免費解決方案。 以下是實現步驟: 1. 首先安裝免費.NET ...
  • C++ 異常處理 C++ 異常處理機制允許程式在運行時處理錯誤或意外情況。它提供了捕獲和處理錯誤的一種結構化方式,使程式更加健壯和可靠。 異常處理的基本概念: 異常: 程式在運行時發生的錯誤或意外情況。 拋出異常: 使用 throw 關鍵字將異常傳遞給調用堆棧。 捕獲異常: 使用 try-catch ...
  • 優秀且經驗豐富的Java開發人員的特征之一是對API的廣泛瞭解,包括JDK和第三方庫。 我花了很多時間來學習API,尤其是在閱讀了Effective Java 3rd Edition之後 ,Joshua Bloch建議在Java 3rd Edition中使用現有的API進行開發,而不是為常見的東西編 ...
  • 框架 · 使用laravel框架,原因:tp的框架路由和orm沒有laravel好用 · 使用強制路由,方便介面多時,分多版本,分文件夾等操作 介面 · 介面開發註意欄位類型,欄位是int,查詢成功失敗都要返回int(對接java等強類型語言方便) · 查詢介面用GET、其他用POST 代碼 · 所 ...
  • 正文 下午找企業的人去鎮上做貸後。 車上聽同事跟那個司機對罵,火星子都快出來了。司機跟那同事更熟一些,連我在內一共就三個人,同事那一手指桑罵槐給我都聽愣了。司機也是老社會人了,馬上聽出來了,為那個無辜的企業經辦人辯護,實際上是為自己辯護。 “這個事情你不能怪企業。”“但他們總不能讓銀行的人全權負責, ...