一 簡介 談談磁盤IO的問題二 目的:如何進行IO性能問題的排查
二? linux角度
一 機械硬盤基本定義
尋道時間,表示磁頭在不同磁道之間移動的時間(最耗時)。
旋轉延遲,表示在磁道找到時,中軸帶動盤面旋轉到合適的扇區開頭處。
傳輸時間,表示盤面繼續轉動,實際讀取數據的時間
二 機械盤與SSD盤的對比
1 無論是SSD還是機械盤,隨機讀寫IO的效率都遠遠低于順序讀寫IO
1 對于機械盤,隨機讀寫IO會增加更多的盤片旋轉和磁頭尋道時間
2 對于SSD硬盤,隨機讀寫IO會造成的大量的垃圾回收(垃圾需要先擦除回收然后再進行寫入)
2 機械硬盤的基本單位是扇區(通常是512字節) SSD硬盤的基本單位是頁(通常是4K 8K)
3 SSD對比機械盤最大的優勢就是沒有尋道時間,對于機械盤消耗時間最大的也就是尋道時間
4 SSD本身有寫入次數限制(壽命),還有寫磨損問題 這個需要注意,一般服務器情況下都是SSD+機械硬盤混合搭配
三 linux系統的算法
CFQ 完全公平調度器,為每個進程都創建不同的IO調度隊列,并按照時間片來平均分配每個進程的IO請求,常用于多進程的場景
DEADLINE 為讀寫請求分別創建不同的IO隊列,并保證最先到達deadline的請求會被優先處理,常用于數據庫場景,能提高機械磁盤的吞吐量
NOOP? ? 是一個先入先出的隊列,只做一些合并IO的操作,適合SSD
四 文件系統層
選擇xfs或者ext4文件系統,推薦xfs
五 mysql角度
控制臟頁刷新
1 innodb_flush_neighbors 設置為0 關閉該特性
2 innodb_io_capacity 臟頁刷新數量,建議設置為iops的60%,如果設置的過低,會限制tps的能力,如果設置的過高,會加大磁盤io的壓力,因為一次性刷新的臟頁數量會多
3 調整redo log大小,建議單個redo大于1G,增加多個redo文件,防止出現寫磨損問題
4 調整?innodb_max_dirty_pages_pct 臟頁占用比,進行調低.?nnodb_max_dirty_pages_pct和??innodb_io_capacity 進行合理搭配調節
參數說明
當刷新一個臟頁時,innodb存儲引擎會檢測該頁所在區(extent)的所有頁,如果是臟頁,那么一起進行刷新,這樣做能合并多個IO,減少硬盤壓力
建議 機械硬盤開啟 SSD硬盤關閉
六 壓測
1 壓測磁盤組的隨機讀寫能力
fio -filename=/data/d.txt -direct=1 -iodepth 1 -thread -rw=randrw -ioengine=psync -bs=16k -size=1500M -numjobs=40 -runtime=10 -group_reporting -name=mytest
關心參數
read and write的iops
2 通過壓力測試得出服務器的最大承受值
請注意:util并不能真正反映磁盤組的整體性能,反過來,util值忙,代表磁盤繁忙程度,想要看磁盤壓力
1? 觀察iowait.
2 觀察磁盤的IOPS(w/s+r/s)
3 觀察await
三 mysql角度
一 事務
1 寫日志文件
1 流程 redo log+binlog 二階段提交-> 寫日志文件 順序寫
2 控制參數
innodb_flush_log_at_trx_commit = 1 控制redo log的磁盤刷新
sync_binlog = 1 控制binlog 的磁盤刷新
2 臟頁刷新
1 將內存中改變的數據頁刷新到磁盤中
2 控制參數
innodb_flush_neighbors 控制相鄰臟頁的刷新
innodb_io_capacity 控制臟頁刷新的數量
innodb_max_dirty_pages_pct 臟頁占用比
二 查詢
1 慢語句
使用索引不當的慢sql查詢會造成磁盤的繁忙,這種情況多出現在
1 大表的慢sql查詢
2 表的主鍵碎片化也會造成大量的隨機讀,常見于uuid作為主鍵或者執行過大量更改的情況
3 單個慢sql出現在慢日志,慢sql本身受到影響(1 臟頁刷新 2 日志刷新 3 并發sql查詢)
2 并發語句
大量并發語句并發查詢導致的磁盤繁忙情況
四? 判斷分析
磁盤沒有到達瓶頸
1 根據上文提出的,要分析mysql哪一部分出了問題,日志刷新->臟頁刷新->慢日志,根據某一個環節進行優化
磁盤到達瓶頸
1 mysql慢日志出現了很多不該出現的慢日志語句,通常表現在掃描行數很少,單體執行很快
2 監控圖的iops經常性報警,尤其是在業務高峰期,由于IO限制導致的負載升高,iowait值很高
解決辦法:1 拆分業務 2 做讀寫分離 3 升級硬盤,采用ssd硬盤
五 補充
分析數據庫的IO問題 可以采用 pt-ioprofile定位文件信息
mysql 與linux ~ 內存分析與調優
一 簡介:linux內存和mysql二 分類? ?1 用戶空間和內核空間? ? ? 用戶空間內存,從低到高分別是五種不同的內存段? ? ? 1 只讀段 包含代碼和常量等? ? ? 2 數據段 包含全局 ...
linux性能分析及調優
第一節:cpu 性能瓶頸 計算機中,cpu是最重要的一個子系統,負責所有計算任務: 基于摩爾定律的發展,cpu是發展最快的一個硬件,所以瓶頸很少出現在cpu上: 我們線上環境的cpu都是多核的,并且基 ...
linux性能調分析及調優
轉:https://blog.csdn.net/luokehua789789/article/details/53007456 Linux 性能分析以及調優介紹 寫在前面:計算機要解決的基本問題之一是 ...
linux 內核參數VM調優 之 參數調節和場景分析
1. pdflush刷新臟數據條件 (linux IO 內核參數調優 之 原理和參數介紹)上一章節講述了IO內核調優介個重要參數參數. 總結可知cached中的臟數據滿足如下幾個條件中一個或者多個的時 ...
(轉)linux IO 內核參數調優 之 參數調節和場景分析
1. pdflush刷新臟數據條件 (linux IO 內核參數調優 之 原理和參數介紹)上一章節講述了IO內核調優介個重要參數參數. 總結可知cached中的臟數據滿足如下幾個條件中一個或者多個的時 ...
linux概念之性能調優
目前,對系統進行性能調試的工具有很多,這些可以兩大類:一類是標準的分析工具,即所有的UNIX都會帶的分析工具: 另一類是不同廠商的UNIX所特有的性能分析工具,比如HP-UX就有自己的增值性能分析工具 ...
MySQL基礎普及《MySQL管理之道:性能調優、高可用與監控》
最近工作的內容涉及MySQL運維內容,陸陸續續讀了幾本相關的書,其中一本是. 內容涵蓋性能調優(包括sql優化等).備份.高可用,以及讀寫分離 ...
MySQL管理之道:性能調優、高可用與監控》迷你書
MySQL管理之道:性能調優.高可用與監控>迷你書 MYSQL5.5.X主要改進 1.默認使用innodb存儲引擎2.充分利用CPU多核處理能力3.提高刷寫臟頁數量和合并插入數量,改善I/O4. ...
x86服務器中網絡性能分析與調優 轉
x86服務器中網絡性能分析與調優 2017-04-05?巨楓?英特爾精英匯 [OpenStack 易經]是 EasyStack 官微在2017年新推出的技術品牌,將原創技術干貨分享給您,本期我們討論 ...
隨機推薦
(轉)java中的進程與線程
(轉自地址http://www.ibm.com/developerworks/cn/java/j-lo-processthread/) Java 進程的建立方法 在 JDK 中,與進程有直接關系的類為 ...
學習mongo系列(十一)關系
準備工作:首先在maxh數據庫的address集合中先插入數據 > db.address.insert({child_address:"gansu"}) WriteResul ...
數據庫連接池dbcp基本配置
DBCP(DataBase connection pool),數據庫連接池.是 apache 上的一個 java 連接池項目,也是 tomcat 使用的連接池組件.單獨使用dbcp需要2個包: com ...
C語言之將無符號字符型轉化為ascii碼值
這個宏是在linux內核中獲取的,主要的功能是能夠將一個無符號字符型的參數轉化為ASCII碼值. ASCII : ASCII 編碼里包括了128個字符.用?十進制?0 ?到 127 來表示?.那就對了 ...
Mybatis中sql語句中的in查詢,判斷null和size為0的情況
不嚴謹的寫法,可能會報錯:in (),這種情況不符合SQL的語法,導致程序報錯. 如果簡單只做非空判斷,這樣也有可能會有問題:本來in一個空列表,應該是沒有數據才對,卻變成了獲取全部數據! 所以一個比 ...
Eclipse創建Dynamic Web部署
Eclipse創建Dynamic Web部署 http://blog.csdn.net/sweblish/article/details/6686046 Eclipse3.x中熱部署項目,啟動錯誤問題 ...
JAVA GC優化入門
為什么需要優化GC? JAVA的GC是面試必考的題目,可是在實際項目中什么時候使用GC哪?或者應該什么時候優化GC哪?有句名言:“GC優化永遠是最后一項任務”. 在使用GC之前,應該考慮一下進行GC的 ...
BZOJ2957: 樓房重建(線段樹&;LIS)
2957: 樓房重建 Time Limit:?10 Sec??Memory Limit:?256 MBSubmit:?3727??Solved:?1793[Submit][Status][Discus ...
#define 與 typedef
1.#define:預編譯指令,在預編譯的時候,進行文本替換. 2.typedef:編譯時處理,為類型取一個別名. 3.#define與typedef的順序是相反的,記住typedef就行了.type ...
「小程序JAVA實戰」小程序我的個人信息-注銷功能(42)
轉自:https://idig8.com/2018/09/06/xiaochengxujavashizhanxiaochengxuwodegerenxinxi-zhuxiaogongneng40/ 注 ...