一、IO是什么
IO統稱為輸入輸出(input/output),又分為IO接口和IO設備,比如像USB接口就是IO接口,硬盤的接口;IO設備像硬盤、鍵盤、藍牙耳機等;
二、為什么會有IO問題
①:CPU訪問內存和訪問硬盤的速度之差
是因為cpu的運行速度與IO運行速度數量級的速度之差導致、cpu訪問內存比cpu訪問硬盤快1000倍,cpu的運行速度是ns級別,而SSD的速度是us級別、HDD是ms毫秒級別,NS = 1000*1000 MS;速度之差如下圖:
為什么不用局部性原理?
可能你會問,加一個緩存不是就可以了嗎?像cpu和memory之間的速度差,加一個告訴緩存L1、L2、L3;cpu訪問內存和硬盤速度差,把內存數據放到Redis里面不就行了嗎,但現在mysql數據庫中,一個表上千萬的數據量已經很正常的,內存不可能緩存那么多數據的;
②:硬盤的訪問更多是隨機讀寫
順序讀寫:文件的指針從頭到尾的讀寫,避免的磁盤的多次尋址和尋道時間
隨機讀寫:文件的指針可以任意的移動,導致磁盤進行大量的尋址和尋道操作;
磁盤順序讀寫,拿HDD的速度在一秒鍾讀寫20萬,但跟平時的開發經驗不符合,為什么?
原因在於磁盤大多數都是在隨機讀寫,而隨機讀寫的速度是順序讀寫的幾十分之一左右;
像我電腦SSD隨機4k的讀取速度是39M/s
磁盤隨機讀寫,7200轉的HDD大概在100次,而SDD大概在10000左右,寫最快也就20000次,
為什么請雙擊鏈接(https://www.cnblogs.com/cpThinker/articles/12688934.html)
硬盤的幾個核心指標,吞吐率、和響應時間、IOPS;
吞吐率:
常規HDD吞吐率是 200M/S, SDD吞吐率是stta3.0的接口,帶寬6G/b(小b),大概是700M/S,速度差3倍左右;
響應時間:
常規HDD響應時間是 0.6ms, SDD相應時間是0.066ms,相差10倍左右;
IOPS:
表示每秒輸入輸出操作的次數;io的核心指標,大家更關注的指標;
IOPS = 平均延遲+平均尋道時間
三、在服務器中如何定位io問題
①:top命令,wa(如截圖)就是表示IOwait的指標,也就是cpu等待IO執行完成花費的時間占cpu的百分比
②:iostat命令,查看每個硬盤的實際讀寫情況,關注每個硬盤的TPS、read/write
沒有此命令通過 yum-y install iostat安裝
③:通過iotop 找出占用io高的進程,搞定問題
謝謝閱讀、一起進步