mysql抖動可能的原因,12 | 為什么我的MySQL會“抖”一下?

你的 SQL 語句為什么變“慢”了

平時執行很快的更新操作,其實就是在寫內存和日志,而 MySQL 偶爾“抖”一下的那個瞬間,可能就是在刷臟頁(flush)。

當內存數據頁跟磁盤數據頁內容不一致的時候,我們稱這個內存頁為“臟頁”。內存數據寫入到磁盤后,內存和磁盤上的數據頁的內容就一致了,稱為“干凈頁”

什么情況會引發數據庫的 flush 過程呢?

InnoDB 的 redo log 寫滿了

這時候系統會停止所有更新操作,把 checkpoint 往前推進,redo log 留出空間可以繼續寫,checkpoint 往前推進時,會把對應的所有臟頁都 flush 到磁盤上

系統內存不足

當需要新的內存頁,而內存不夠用的時候,就要淘汰一些數據頁,空出內存給別的數據頁使用。如果淘汰的是“臟頁”,就要先將臟頁寫到磁盤。

刷臟頁一定會寫盤,就保證了每個數據頁有兩種狀態:

a. 一種是內存里存在,內存里就肯定是正確的結果,直接返回;

b.另一種是內存里沒有數據,就可以肯定數據文件上是正確的結果,讀入內存后返回。這樣的效率最高。

MySQL 認為系統“空閑”的時候

MySQL 正常關閉的情況

MySQL 會把內存的臟頁都 flush 到磁盤上,這樣下次 MySQL 啟動的時候,就可以直接從磁盤上讀數據,啟動速度會很快

四種場景對性能的影響

“redo log 寫滿了,要 flush 臟頁”

這種情況是 InnoDB 要盡量避免的。因為出現這種情況的時候,整個系統就不能再接受更新了,所有的更新都必須堵住。如果你從監控上看,這時候更新數會跌為 0。

“內存不夠用了,要先將臟頁寫到磁盤”

這種情況其實是常態。InnoDB 用緩沖池(buffer pool)管理內存,緩沖池中的內存頁有三種狀態:

a. 第一種是,還沒有使用的;

b. 第二種是,使用了并且是干凈頁;

c. 第三種是,使用了并且是臟頁。

InnoDB 的策略是盡量使用內存,因此對于一個長時間運行的庫來說,未被使用的頁面很少。而當要讀入的數據頁沒有在內存的時候,就必須到緩沖池中申請一個數據頁。這時候只能把最久不使用的數據頁從內存中淘汰掉:如果要淘汰的是一個干凈頁,就直接釋放出來復用;但如果是臟頁呢,就必須將臟頁先刷到磁盤,變成干凈頁后才能復用。

所以,刷臟頁雖然是常態,但是出現以下這兩種情況,都是會明顯影響性能的:

a. 一個查詢要淘汰的臟頁個數太多,會導致查詢的響應時間明顯變長;

b. 日志寫滿,更新全部堵住,寫性能跌為 0,這種情況對敏感業務來說,是不能接受的。

所以,InnoDB 需要有控制臟頁比例的機制,來盡量避免上面的這兩種情況。

InnoDB 刷臟頁的控制策略

innodb_io_capacity 參數會告訴 InnoDB 你的磁盤能力,這樣 InnoDB 就能知道需要全力刷臟頁的時候,可以刷多快,建議設置成磁盤的 IOPS,磁盤的 IOPS 可以通過 fio 工具測試

fio -filename=$filename -direct=1 -iodepth 1 -thread -rw=randrw -ioengine=psync -bs=16k -size=500M -numjobs=10 -runtime=10 -group_reporting -name=mytest

innodb_max_dirty_pages_pct 參數是臟頁比例上限,默認值是 75%。InnoDB 會根據當前的臟頁比例(假設為 M),算出一個范圍在 0 到 100 之間的數字 F1(M) ,InnoDB 每次寫入的日志都有一個序號,當前寫入的序號跟 checkpoint 對應的序號之間的差值,我們假設為 N。InnoDB 會根據這個 N 算出一個范圍在 0 到 100 之間的數字 F2(N),根據上述算得的 F1(M) 和 F2(N) 兩個值,取其中較大的值記為 R,之后引擎就可以按照 innodb_io_capacity 定義的能力乘以 R% 來控制刷臟頁的速度。

e23912146a824dcb0c72f216733f3b22.png

InnoDB 會在后臺刷臟頁,而刷臟頁的過程是要將內存頁寫入磁盤。所以,無論是你的查詢語句在需要內存的時候可能要求淘汰一個臟頁,還是由于刷臟頁的邏輯會占用 IO 資源并可能影響到了你的更新語句,都可能是造成你從業務端感知到 MySQL“抖”了一下的原因

要盡量避免這種情況,你就要合理地設置 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;

MySQL 在準備刷一個臟頁的時候,如果這個數據頁旁邊的數據頁剛好是臟頁,就會把這個“鄰居”也帶著一起刷掉;而且這個把“鄰居”拖下水的邏輯還可以繼續蔓延,也就是對于每個鄰居數據頁,如果跟它相鄰的數據頁也還是臟頁的話,也會被放到一起刷。

innodb_flush_neighbors 參數就是用來控制這個行為的,值為 1 的時候會有上述的“連坐”機制,值為 0 時表示不找鄰居,自己刷自己的

找“鄰居”這個優化在機械硬盤時代是很有意義的,可以減少很多隨機 IO。機械硬盤的隨機 IOPS 一般只有幾百,相同的邏輯操作減少隨機 IO 就意味著系統性能的大幅度提升。

而如果使用的是 SSD 這類 IOPS 比較高的設備的話,我就建議你把 innodb_flush_neighbors 的值設置成 0。因為這時候 IOPS 往往不是瓶頸,而“只刷自己”,就能更快地執行完必要的刷臟頁操作,減少 SQL 語句響應時間。

在 MySQL 8.0 中,innodb_flush_neighbors 參數的默認值已經是 0 了。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/528913.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/528913.shtml
英文地址,請注明出處:http://en.pswp.cn/news/528913.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

怎樣快速畫出一個正方體_圖形與幾何---正方體

一.概念描述現代數學:正方體亦稱立方體。它是一種正多面體。即棱長相等的長方體,因此亦稱正六面體,如下圖。小學數學:2007年北京版教材第10冊的第3頁指出:長、寬、高都相等的長方體叫作正方體(也叫作立方體…

python argvparser_Python ArgumentParse的subparser用法說明

在寫一些很小的機器學習項目的時候,我們往往希望training, testing和inference能共用一個入口main,但是不同的功能使用不同的input參數.當然如果三個功能對應三個.py腳本問題也不大,但是畢竟覺得不太優雅.這個時候就需要考慮如何讓代碼更加簡單有條理.主要是最近在看parser有關…

python生成器函數(generator),python3學習筆記:生成器generator

簡單了解下生成器generator,主要是yield的返回值和send的傳參,記錄下。生成器的基本屬性generator 函數 yield簡單說,就是一個函數,里面用到了關鍵字yield,就成為了一個生成器生成器和函數的不同主要在于&#xff1a…

復旦微電子fpga數據手冊_專注FPGA圖像加速領域 深維科技跨入發展快車道

日前,在2019賽靈思開發者大會(美洲站)上,深維科技正式面向全球發布ThunderImage三款重磅圖像加速產品:全球最快的JPEG2JPEG縮略圖方案、超高性能的JPEG2WebP轉碼方案及世界級超高密度算力的JPEG2JPEG縮略圖方案。新產品一經發布立即“技驚”四…

oracle Blob保存方式,關于文件保存到Oracle中BLOB字段的方法及例子

關于文件保存到Oracle中BLOB字段的方法及例子-------------------------------------------public class FileOpClass{public static byte[] GetFileStream(string filepath){byte[] byteArray null;FileStream fs null;try{fs new FileStream(filepath, FileMode.Open);lon…

python 調c++生成的dll 中識別char *_基于tensorflow 實現端到端的OCR:二代身份證號識別...

最近在研究OCR識別相關的東西,最終目標是能識別身份證上的所有中文漢字數字,不過本文先設定一個小目標,先識別定長為18的身份證號,當然本文的思路也是可以復用來識別定長的驗證碼識別的。 本文實現思路主要來源于Xlvector的博客&a…

php友價商城手游,2019年T5友價商城網站程序-偽靜態規則

# Version 3.1.0.73RewriteEngine on#RewriteBase /RewriteRule vip(.*) /shop/view.php?str$1RewriteRule ^(.*)/search(.*).html /$1/index.php?str$2RewriteRule ^(.*)/goods([0-9]*).html /$1/goods.php?id$2RewriteRule ^(.*)/(.*)list(.*).html /$1/$2list.php?str$3…

oracle 的跨天查詢,考勤跨天如何統計 - Oracle開發 - ITPUB論壇-中國專業的IT技術社區...

本帖最后由 yaksha1 于 2020-9-11 17:29 編輯請問下,目前正在統計每個人每天考勤數據是否正常,上班打一次卡,下班打一次卡,算是正常。打卡情況大致分兩種,一種是正常白班,朝九晚五,一種是跨天&a…

php程序員學什么語言好就業_2019年初中畢業生學什么專業好?學什么專業好就業?...

前言:據了解,目前我國職業人才缺口較大,市場供需不平衡。許多學生往往還沒畢業,就已經與企業簽訂了就業協議。因此,有許多家長愿意把小孩子送到專業學校進行就讀。畢竟可以學的一門好專業,對學生將來的路是…

中print中加f_Python3中的格式化輸出

Python3字符串格式化輸出有兩種形式實現:a:字符串格式化表達式: ...%... % (values)b:字符串格式化方法調用:...{}....format(values) 或者 f...{xx}...1:字符串格式化的類型碼(typecode)(表1)2: 字符串格式化表達式格…

Json-ServerMockJs簡單快速生成測試數據

Json-Server&MockJs簡單快速生成測試數據 1、Json-Server 和 MockJs的安裝 npm install -g json-server //全局安裝2、創建目錄和初始話 例如:創建D:\ProjectOne文件夾 3、打開終端或者powershell進入ProjectOne文件夾 4、初始化項目 npm init5、安裝Mock…

oracle索引sys_nc,通過dba_ind_columns表查到索引所在列的名字為SYS_NC00133$

使用下面的腳本查看表上索引相關信息:selectind.uniqueness uniq,ind.owner||.||col.index_name indname,col.column_name colnamefromdba_ind_columns col,dba_indexes indwhereind.owner upper(&ixowner)andind.table_name upper(&tabname)andcol.index…

oracle nvl和coalesce,NVL與Coalesce之間的Oracle差異

慕碼人8056858COALESCE是更現代的功能,是ANSI-92標準的一部分。NVL在Oracle具體的,它在推出80的前存在任何標準。在兩個值的情況下,它們是同義詞。但是,它們的實現方式不同。NVL總是計算兩個參數,同時COALESCE通常在找…

安卓簽名生成工具_ios app如何進行內測?ios app和安卓app的內測有何區別?

目前手機主流的操作系統分為Android和iOS兩大陣營,分別是由谷歌和蘋果進行開發維護。這兩大平臺的應用都相互獨立,無論是運行機制還是底層原理,都不一樣,所以即使是同一款App也是需要針對在兩大平臺上分別進行內測和運營、發布。那…

cx oracle dpi 1002,cx_Oracle連接數據庫總結

python中連接oracle數據庫使用第三方庫文件cx_Oracle時遇到了各種問題,網上查找資料調試了幾天才弄好,下面是不斷調試后總結的一些經驗。1.oracle客戶端(Oracle Instant Client)版本需要和操作系統版本位數相同,同時cx_Oracle官方文檔(http:/…

虛擬機python建站_搭建本地虛擬服務器linux(CentOS 7)的python虛擬環境(Hyper-V演示)...

新建虛擬機->安裝CentOS7->新建虛擬交換機:內部網絡->CentOS7設置->網絡適配器:虛擬交換機:新建虛擬交換機->進入CentOS#cd /etc/sysconfig/network-scripts/#ls -a#vi ifcfg-eth0 #(有些系統不是eth0,前面ifcfg-的…

matlab 輸入日期,matlab輸入年月日算一年中的第幾天.doc

matlab輸入年月日算一年中的第幾天clc,clear all,close alldisp This program calculates the day of year given the ;disp current date. ;month input Enter current month 1-12 : ;day input Enter current day 1-31 : ;year input Enter current year yyyy : ;%Check for …

深拷貝的缺點_拷貝?還傻傻分不清深淺?

「引言」?臣聞求木之長者,必固其根本;欲流之遠者,必浚其泉源。---- 魏征 《諫太宗十思疏》?或許你會問到,網上已經把深淺拷貝(算一個面試的高頻考點了吧)的文章都快寫爛了,為什么自己還要重新操刀寫一遍呢&#xff0…

php 失去 焦點 另一個表單獵取值,同一表單如何根據某一個文本框的值 改變另一個文本框的值...

我用的是失去焦點,然后后臺查詢到了數據,返回回來顯示不了!!$(document).ready(function(){$("#card").blur(function(){var card$("#card").val();if(card!""){$.get("{:U(guoye/yanzheng)}&…

實現文件中名詞的統計計數_通過勤哲EXCEL和Excel中的rank函數實現排名統計

如今,信息化已成為各行業企業轉型和發展的關鍵所在,信息化技術最明顯的特點是企業不同部門的人在信息技術的支撐下,可以利用豐富的資源與工具展開協作學習,在相對自由的模式和環境下,改變傳統設計相對局限、固定思維的…