讀高性能MySQL(第4版)筆記04_操作系統和硬體優化

来源:https://www.cnblogs.com/lying7/archive/2023/09/08/17685446.html
-Advertisement-
Play Games

![](https://img2023.cnblogs.com/blog/3076680/202309/3076680-20230907165115014-2093238023.png) # 1. 從軟體本身和它運行的典型工作負載來看,MySQL通常也更適合運行在廉價硬體上 # 2. 基本資源 ## ...


1. 從軟體本身和它運行的典型工作負載來看,MySQL通常也更適合運行在廉價硬體上

2. 基本資源

2.1. CPU

2.2. 記憶體

2.3. 磁碟

2.4. 瓶頸

2.5. 網路資源

3. CPU

3.1. 最常見的瓶頸是CPU耗盡

3.2. 檢查CPU使用率來確定工作負載是否受CPU限制

3.3. 低延遲(快速響應時間)

3.3.1. 需要更快的CPU,因為每個查詢將只使用一個CPU

3.4. 高吞吐量

3.4.1. 如果可以同時運行多個查詢,那麼可以使用多個CPU為查詢提供服務

4. 記憶體

4.1. 記憶體耗盡的情況也會發生,但通常只在你試圖將太多記憶體分配給MySQL時才會發生

4.2. 配置大記憶體的主要原因並不是為了在記憶體中保存大量數據,而是為了避免磁碟I/O

4.3. 磁碟I/O比訪問記憶體中的數據要慢幾個數量級

4.4. 如果有足夠的記憶體,可以完全避開磁碟讀取操作

4.5. 如果所有數據都能裝入記憶體,那麼一旦伺服器的緩存預熱完成,每次讀取都將是一次緩存命中

4.6. 寫入可以像讀取一樣在記憶體中執行,但遲早必須被寫入磁碟,才能持久保留數據

4.7. 緩存可以延遲寫操作,但緩存不能像消除讀操作那樣消除寫操作

4.8. 多次寫操作,一次刷新

4.8.1. 一個數據片段可以在記憶體中被多次更改,而無須每一次都將新值寫入磁碟

4.8.2. 當數據被最終刷新到磁碟時,自上次物理寫入以來發生的所有修改都將被持久化

4.9. I/O合併

4.9.1. 許多不同的數據片段可以在記憶體中被修改,這些修改可以被收集在一起,因此物理寫可以作為單個磁碟操作執行

4.9.2. 提前寫日誌(write-ahead logging)策略

4.9.2.1. 允許在記憶體中更改頁面,而不用將更改刷新到磁碟,這通常涉及隨機I/O,速度非常慢

4.9.2.2. 將更改的記錄寫入順序日誌文件,這樣要快得多

4.9.2.3. 後臺線程可以稍後將修改過的頁面刷新到磁碟,這樣做可以優化寫操作的性能

4.10. 寫操作從緩衝中獲益,因為可以將隨機I/O轉換為順序I/O

4.11. 非同步(緩衝)寫操作通常由操作系統處理,並且是被成批處理的,因此可以更優地被刷新到磁碟

4.12. 同步(無緩衝)寫入必須等待數據落盤

5. 固態(快閃記憶體)存儲

5.1. I/O飽和也會發生,但比CPU耗盡的頻率低得多

5.2. 用HDD硬碟時,最好嘗試找到一個有效的記憶體/磁碟比率

5.2.1. HDD延遲較高、IOPS較低

5.3. 使用SSD時,記憶體對磁碟的比率就變得不那麼重要了

5.4. 固態設備對於提高伺服器整體性能非常有用,現在通常應該成為資料庫的標準配置,尤其對於OLTP工作負載

5.4.1. SSD通常比HDD快10到20倍

5.4.2. 只有在預算極為有限的系統中,或者在需要驚人的高達數PB的磁碟空間的數據倉庫場景下,才考慮繼續使用HDD

5.5. 比硬碟驅動器明顯更好的隨機讀寫性能

5.6. 快閃記憶體設備讀的能力通常略好於寫的能力

5.7. 比硬碟驅動器更好的順序讀寫性能

5.8. 比硬碟驅動器更好的併發支持

5.8.1. 只有在擁有大量併發性的情況下,快閃記憶體設備才能真正實現最高吞吐量

5.9. 固態存儲設備使用非易失性快閃記憶體晶元組成的單元

5.9.1. 非易失隨機訪問記憶體(NVRAM)

5.10. 固態存儲建立在快閃記憶體之上

5.11. 快閃記憶體的特點

5.11.1. 可以被快速地多次讀取,而且以很小的單元讀取數據

5.11.2. 寫入則要困難得多

5.11.2.1. 只有進行特殊的擦除操作之後,存儲單元才能被重新寫入數據,並且每次擦除的塊大小較大

5.12. 寫操作的限制是固態存儲複雜性的原因

5.12.1. 為了使寫操作能夠很好地執行,並避免過早地耗盡快閃記憶體塊寫壽命,設備必須能夠重新定位頁面,並執行垃圾收集和所謂的損耗均衡

5.13. 為了使某些塊保持新鮮併為新的寫入做好準備,設備會回收塊

5.14. 100GB文件在160GB的SSD上的性能與在320GB的SSD上的性能是不同的

5.14.1. 當沒有空閑塊時,必須等待擦除操作完成,從而導致速度減慢

5.14.2. 寫入空閑塊需要幾百微秒,但擦除速度要慢得多,通常需要幾毫秒

6. RAID

6.1. 存儲引擎通常將數據/索引保存在單個大文件中,這意味著RAID通常是存儲大量數據的最佳選項

6.2. 不要認為RAID是數據安全方面的強有力的保證

6.2.1. RAID並不能消除,甚至不能減少備份的需要

6.3. 保存在損壞的物理媒介中的數據很少被訪問,可能幾個月都不會被髮現,直到嘗試讀取數據,或者當另一個驅動器出現故障,RAID控制器嘗試使用損壞的數據重建陣列時才發現問題

6.3.1. 硬碟空間越大,出現這種情況的可能性就越大

6.4. 大多數控制器都提供了一些軟體來報告陣列的狀態,你需要對此進行跟蹤,否則可能完全不知道驅動器已出現故障

6.4.1. 到第二個驅動器出現故障時就太晚了

6.5. 通過定期主動檢查陣列的一致性,可以降低潛在的損壞風險

6.6. 很多RAID控制器不能很好地處理大數據塊

6.7. RAID緩存是物理安裝在硬體RAID控制器上的(相對)少量記憶體

6.7.1. 在RAID緩存中緩存讀取都是浪費記憶體

6.8. RAID控制器的記憶體是一種稀缺資源,應該明智地使用它

6.9. 對事務日誌發出fsync()調用,併在啟用sync_binlog的情況下創建二進位日誌,但除非控制器有備用電池單元(BBU)或其他非易失性存儲,否則不應啟用寫緩存

6.9.1. 硬碟也可能會撒謊。應該確保在fsync()時刷新緩存,或者乾脆在沒有備用電池時禁用它們

6.9.2. 當安裝新硬體時,最好進行真正的暴力碰撞測試(例如把電源插頭拔出來)。這通常是發現細微的錯誤配置或偷偷摸摸的硬碟行為的唯一方法

6.10. 要測試RAID控制器的BBU是否真的可靠,請確保將電源線拔下一段時間

6.10.1. 有些BBU設備在沒電的情況下無法維持足夠的時間(將RAID緩存的數據刷新到磁碟

6.10.2. 一個環節出問題可能會導致整個存儲系統鏈變得無用

6.11. RAID 0

6.11.1. 最便宜和性能最好的RAID配置

6.11.2. 永遠不適合用於生產資料庫

6.11.3. 在開發環境中,當伺服器完全失效也不會變成突發事件時,可以選擇RAID 0

6.11.4. 不提供任何冗餘

6.11.5. RAID 0陣列的故障概率高於任何單磁碟的故障概率,而不是更低

6.12. RAID 1

6.12.1. 良好的讀性能,並且可以跨磁碟複製數據

6.12.2. 良好的冗餘

6.12.3. 讀取速度略高於RAID 0

6.12.4. 順序寫入不需要許多底層磁碟就能執行得很好

6.12.5. 需要冗餘但只有兩個硬碟驅動器的低端伺服器的典型選擇

6.12.6. 大多數操作系統都允許你輕鬆地創建軟體RAID 0和RAID 1捲

6.13. RAID 5

6.13.1. 將數據分佈在具有分散式奇偶校驗塊的多塊磁碟上,以便在任何一塊磁碟出現故障時,可以從奇偶校驗塊重建數據

6.13.2. 如果兩塊磁碟同時出現故障,整個捲將無法恢復

6.13.2.1. 丟失兩塊磁碟時會產生災難性的後果

6.13.3. RAID 5的可伸縮性不能超過10塊磁碟

6.13.4. 良好的RAID 5的性能在很大程度上依賴於RAID控制器的緩存,這可能與資料庫伺服器的需求相衝突

6.14. RAID 6

6.14.1. 允許你在承受兩次磁碟故障的情況下仍然能重建陣列

6.14.2. 計算額外的奇偶校驗會使寫操作比RAID 5慢

6.15. RAID 10

6.15.1. 一個非常好的數據存儲選擇

6.15.2. 條帶化的鏡像對組成,因此在讀寫方面都能很好地被擴展

6.15.2.1. 最佳的條帶塊大小取決於工作負載和硬體

6.15.2.2. 對於隨機I/O來說,擁有較大的塊大小是很好的,因為這意味著可以從單個驅動器中滿足更多的讀取需求

6.15.3. 與RAID 5相比,它的重建速度快且容易

6.15.4. 以很好地在軟體中被實現

6.16. RAID 50

6.16.1. 由條帶化的RAID 5陣列組成,如果有很多磁碟,它可以很好地兼顧RAID 5的經濟性和RAID 10的性能

6.16.2. 主要用於非常大的數據集,如數據倉庫或非常大的OLTP系統

7. 網路

7.1. 延遲和帶寬是網路連接的限制因素

7.2. 網路運行不正常是主要的性能瓶頸

7.3. 數據包丟失是一個常見的問題

7.3.1. 即使是1%的丟失也足以導致性能顯著下降,因為協議棧中的各個層都會嘗試通過等待一段時間然後重新發送數據包等策略來解決問題,這會增加額外的響應時間

7.4. DNS解析異常中斷或緩慢成為一個致命弱點

7.4.1. 對於生產伺服器來說,啟用skip_name_resolve是一個好主意

7.4.2. 當MySQL收到連接請求時,它會同時進行正向和反向DNS查找

7.4.3. 如果啟用skip_name_resolve選項,MySQL不會進行任何DNS查找

7.4.3.1. 意味著用戶賬號在host列中只能有IP地址、“localhost”或IP地址通配符

7.4.3.2. host列中包含主機名的任何用戶賬號都將無法登錄

8. 文件系統

8.1. 文件系統是在資料庫中保證數據完整性的最低層

8.2. Windows

8.2.1. 只有一個(NTFS)是真正可行的

8.3. GNU/Linux

8.3.1. 大多數時候,給定的文件系統跟其他文件系統相比不會有明顯的差別

8.3.2. 只有在某些情況下,達到文件系統的處理極限時,例如,需要處理高併發性、處理許多文件、碎片,等等,不同文件系統的差異才會體現出來

8.3.3. 最好使用日誌型文件系統,如ext4、XFS或ZFS

8.3.4. 建議使用XFS文件系統,並將交換率和磁碟隊列調度器設置為適合於伺服器的值

8.4. 磁碟隊列調度器

8.4.1. 完全公平排隊,即CFQ(Complete FairQueuing)

8.4.2. 在MySQL的工作負載類型下,CFQ會導致非常糟糕的響應時間,因為會不必要地阻塞隊列中的一些請求

8.4.3. 不要使用CFQ,它可能會導致嚴重的性能問題

8.5. 記憶體和交換

8.5.1. 給MySQL分配大量記憶體後,它的表現最好

8.5.2. InnoDB使用記憶體作為緩存來避免磁碟訪問

8.5.2.1. 意味著記憶體系統的性能會直接影響查詢的速度

8.5.3. 當使用SSD時,性能損失不像使用HDD時那樣明顯

8.5.3.1. 仍然應該積極地避免交換,即使只是為了避免不必要的寫操作,因為寫操作可能會縮短磁碟整體壽命

8.5.4. 更改存儲引擎讀寫數據的方式

8.5.4.1. 設置innodb_flush_method=O_DIRECT可以減輕I/O壓力

8.5.4.2. 該參數僅對InnoDB有效

8.6. 很多技巧都是特定於內核版本的,所以要小心,特別是在升級時

8.7. Linux剖析器perf是一個非常有用的工具,可以用它來檢查操作在系統級別發生的事情


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

-Advertisement-
Play Games
更多相關文章
  • 大家好,我是棧長。 最近看到一個話題: > **前幾天去華為面試,後來說通過了,但是HR告訴我簽約簽的是華為慧通的,我該不該去?** > > 來源:https://www.zhihu.com/question/310409624/answer/2437587008 面對這一問題,網友們紛紛表示當然不 ...
  • ### 歡迎訪問我的GitHub > 這裡分類和彙總了欣宸的全部原創(含配套源碼):[https://github.com/zq2599/blog_demos](https://github.com/zq2599/blog_demos) ### 本機情況 - 省吃儉用入手了ThinkPad T14, ...
  • 在 Spring 中,`@Autowired` 註解的使用在不同的上下文中會產生不同的效果,這取決於所在的組件或類是否由**Spring**管理。 1. **`@Aspect` 註解的使用**:`@Aspect` 註解通常用於聲明切麵,而切麵是 Spring 管理的組件。因此,`@Autowired ...
  • # Unity UGUI的ScrollRect(滾動視圖)組件的介紹及使用 ## 1. 什麼是ScrollRect組件? ScrollRect(滾動視圖)是Unity UGUI中的一個常用組件,用於在UI界面中創建可滾動的區域。通過ScrollRect組件,可以實現在有限的空間內顯示大量的內容,並且 ...
  • [toc] | 說明 | 內容 | | | | | 漏洞編號 | CVE-2017-10271 | | 漏洞名稱 | Weblogic 其中使用了XMLDecoder來解析用戶傳入的XML數據在解析的過程中出現反序列化漏洞,導致可執行任意命令 | | 修複方案 | 打補丁上設備升級組件 | ### ...
  • 博主之前發佈了紅帽體系的Centos7關於openssl和openssh的升級操作;本文就Ubuntu系統再次分享和交流ssh的升級。如有不正確,歡迎在評論區指出。 之前博主的相關文章: openssh-淺談openssl和openssh的升級 - 李宗盛 - 博客園 (cnblogs.com) o ...
  • 對於有科班背景的讀者,可以跳過本系列文章。這些文章的主要目的是通過簡單易懂的彙總,幫助非科班出身的讀者理解底層知識,進一步瞭解為什麼在面試中會涉及這些底層問題。否則,某些概念將始終無法理解。這些電腦基礎文章將為你打通知識的任督二脈,祝你在編程領域中取得成功! ...
  • 1. 進程和線程的區別 進程(Process)和線程(Thread)是操作系統中的重要概念,它們表示執行中的程式的不同執行單元。下麵是它們的區別: 定義:進程是一個獨立的執行環境,具有獨立的記憶體空間,包含程式代碼、數據和執行狀態。線程是進程內的一個執行單元,共用相同的記憶體空間和系統資源。 資源占用: ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...