mysql innodb刷寫策略

2021-10-25 06:37:08 字數 2235 閱讀 7149

首先,你要正確地告訴 innodb 所在主機的 io 能力,這樣 innodb 才能知道需要全力刷髒頁的時候,可以刷多快。這就要用到 innodb_io_capacity 這個引數了,它會告訴 innodb 你的磁碟能力。這個值我建議你設定成磁碟的 iops。磁碟的 iops 可以通過 fio 這個工具來測試,下面的語句是我用來測試磁碟隨機讀寫的命令:

fio  -direct=1 -iodepth 1 -thread -rw=randrw -ioengine=psync -bs=16k -size=500m -numjobs=10 -runtime=10 -group_reporting -name=mytest
其實,因為沒能正確地設定 innodb_io_capacity 引數,而導致的效能問題也比比皆是。

之前,就曾有其他公司的開發負責人找我看乙個庫的效能問題,說 mysql 的寫入速度很慢,tps 很低,但是資料庫主機的 io 壓力並不大。

經過一番排查,發現罪魁禍首就是這個引數的設定出了問題。他的主機磁碟用的是 ssd,但是 innodb_io_capacity 的值設定的是 300。於是,innodb 認為這個系統的能力就這麼差,所以刷髒頁刷得特別慢,甚至比髒頁生成的速度還慢,這樣就造成了髒頁累積,影響了查詢和更新效能。

雖然我們現在已經定義了「全力刷髒頁」的行為,但平時總不能一直是全力刷吧?畢竟磁碟能力不能只用來刷髒頁,還需要服務使用者請求。所以接下來,我們就一起看看 innodb 怎麼控制引擎按照「全力」的百分比來刷髒頁。根據我前面提到的知識點,試想一下,如果你來設計策略控制刷髒頁的速度,會參考哪些因素呢?這個問題可以這麼想,如果刷太慢,會出現什麼情況?首先是記憶體髒頁太多,其次是 redo log 寫滿。

所以,innodb 的刷盤速度就是要參考這兩個因素:乙個是髒頁比例,乙個是 redo log 寫盤速度。innodb 會根據這兩個因素先單獨算出兩個數字。引數 innodb_max_dirty_pages_pct 是髒頁比例上限,預設值是 75%。innodb 會根據當前的髒頁比例(假設為 m),算出乙個範圍在 0 到 100 之間的數字,計算這個數字的偽**類似這樣:

f1

(m)

innodb 每次寫入的日誌都有乙個序號,當前寫入的序號跟 checkpoint 對應的序號之間的差值,我們假設為 n。innodb 會根據這個 n 算出乙個範圍在 0 到 100 之間的數字,這個計算公式可以記為 f2(n)。f2(n) 演算法比較複雜,你只要知道 n 越大,算出來的值越大就好了。

要盡量避免這種情況,你就要合理地設定 innodb_io_capacity 的值,並且平時要多關注髒頁比例,不要讓它經常接近 75%。其中,髒頁比例是通過 innodb_buffer_pool_pages_dirty/innodb_buffer_pool_pages_total 得到的,具體的命令參考下面的**:

mysql>

select variable_value into @a from global_status where variable_name =

'innodb_buffer_pool_pages_dirty'

;select variable_value into @b from global_status where variable_name =

'innodb_buffer_pool_pages_total'

;select @a/@b;

接下來,我們再看乙個有趣的策略。一旦乙個查詢請求需要在執行過程中先 flush 掉乙個髒頁時,這個查詢就可能要比平時慢了。而 mysql 中的乙個機制,可能讓你的查詢會更慢:在準備刷乙個髒頁的時候,如果這個資料頁旁邊的資料頁剛好是髒頁,就會把這個「鄰居」也帶著一起刷掉;而且這個把「鄰居」拖下水的邏輯還可以繼續蔓延,也就是對於每個鄰居資料頁,如果跟它相鄰的資料頁也還是髒頁的話,也會被放到一起刷。在 innodb 中,innodb_flush_neighbors 引數就是用來控制這個行為的,值為 1 的時候會有上述的「連坐」機制,值為 0 時表示不找鄰居,自己刷自己的。找「鄰居」這個優化在機械硬碟時代是很有意義的,可以減少很多隨機 io。機械硬碟的隨機 iops 一般只有幾百,相同的邏輯操作減少隨機 io 就意味著系統效能的大幅度提公升。而如果使用的是 ssd 這類 iops 比較高的裝置的話,我就建議你把 innodb_flush_neighbors 的值設定成 0。因為這時候 iops 往往不是瓶頸,而「只刷自己」,就能更快地執行完必要的刷髒頁操作,減少 sql 語句響應時間。

在 mysql 8.0 中,innodb_flush_neighbors 引數的預設值已經是 0 了。

ICD3刷寫注意事項

1.icd3狀態出現紅色後需重新插拔 2.除錯口的藍色線對著響應的電阻方向 3.對儀表而言,需要供電刷寫 4.模組不用供電刷寫 5.供電與否都應該調整icd3的設定中的power選項,使icd3對目標供電 否則無法連線 6.刷寫儀表時供電電壓設定5v,但刷寫模組時,5v會造成刷寫不成功現象.targ...

MySQL innoDB效能優化

起因 有乙個innodb引擎的表table,在乙個大概3000次的foreach迴圈中執行 insert into table columna,columnb values valuea,valueb 結果居然超出了60s的php執行限制 當然這個限制可以在php.ini中修改 讓我很不解為何插入效...

mysql innodb 效能優化

預設情況下,innodb的引數設定的非常小,在生產環境中遠遠不夠用 比如最重要的兩個引數 innodb buffer pool size 預設是8m innodb flush logs at trx commit 預設設定的是1 也就是同步重新整理log 可以這麼理解 innodb buffer p...