硬菜點(diǎn)播臺(tái) | MySQL阿里實(shí)踐經(jīng)典案例之參數(shù)調(diào)優(yōu)最佳實(shí)踐

硬菜點(diǎn)播臺(tái) | MySQL阿里實(shí)踐經(jīng)典案例之參數(shù)調(diào)優(yōu)最佳實(shí)踐

最近,不少RDS用戶在后臺(tái)咨詢,如何調(diào)優(yōu)RDS MySQL的參數(shù)。

長(zhǎng)假天兒,學(xué)習(xí)天兒。

本期,我們特別邀請(qǐng)到阿里云資深RDS專家玄慚撰文解答:

哪一些參數(shù)不能修改

那一些參數(shù)可以修改

這些提供修改的參數(shù)是不是已經(jīng)是最佳設(shè)置

如何才能利用好這些參數(shù)

哪些參數(shù)可以改

話說(shuō)本文內(nèi)容的一小部分曾在云棲大會(huì)·深圳峰會(huì)上分享。

當(dāng)時(shí)的畫風(fēng)是這樣滴:

由于時(shí)間限制,當(dāng)時(shí)很多用戶覺(jué)得沒(méi)有挺過(guò)癮。

好了,這次我們慢慢聊……

小伙伴最關(guān)心的問(wèn)題

細(xì)心的用戶在購(gòu)買RDS的時(shí)候都會(huì)看到,不同規(guī)格能夠提供的最大連接數(shù)以及內(nèi)存是不同的,所以這一些產(chǎn)品規(guī)格的限制參數(shù):連接數(shù)、內(nèi)存用戶是不能夠修改的。

如果內(nèi)存或者連接數(shù)出現(xiàn)了瓶頸:

內(nèi)存瓶頸:實(shí)例會(huì)出現(xiàn)OOM,然后導(dǎo)致主備發(fā)生切換

連接數(shù)瓶頸:應(yīng)用不能新建立連接到數(shù)據(jù)庫(kù)

則需要進(jìn)行應(yīng)用優(yōu)化、慢SQL優(yōu)化或者進(jìn)行彈性升級(jí)實(shí)例規(guī)格來(lái)解決。

還有一些涉及主備數(shù)據(jù)安全的參數(shù)比如innodb_flush_log_at_trx_commit、sync_binlog、gtid_mode、semi_sync、binlog_format等為了保證主備的數(shù)據(jù)安全,目前還暫不提供給用戶進(jìn)行修改。

除上述的這些參數(shù)外,絕大部分的參數(shù)都已經(jīng)由DBA團(tuán)隊(duì)和源碼團(tuán)隊(duì)優(yōu)化過(guò),用戶不需要過(guò)多調(diào)整線上的參數(shù)就可以把數(shù)據(jù)庫(kù)比較好的運(yùn)行起來(lái)。

但這些參數(shù)只是適合大多數(shù)的應(yīng)用場(chǎng)景,個(gè)別特殊的場(chǎng)景還是需要個(gè)別對(duì)待。

舉兩個(gè)栗子:

如何用戶使用了tokudb引擎,這個(gè)時(shí)候就需要調(diào)整tokudb引擎能使用的內(nèi)存比例(tokudb_buffer_pool_ratio)

如果用戶的應(yīng)用特點(diǎn)本身需要很大的一個(gè)鎖超時(shí)時(shí)間,那么則需要調(diào)整innodb_lock_wait_timeout參數(shù)的大小以適應(yīng)應(yīng)用等等。

如何調(diào)參數(shù)

下面我將把控制臺(tái)中能夠修改的一些比較重要的參數(shù)給大家介紹一下,這些參數(shù)如果設(shè)置不當(dāng),則可能會(huì)出現(xiàn)性能問(wèn)題或應(yīng)用報(bào)錯(cuò)。

open_files_limit

1、作用

該參數(shù)用于控制MySQL實(shí)例能夠同時(shí)打開使用的文件句柄數(shù)目。

2、原因

當(dāng)數(shù)據(jù)庫(kù)中的表(MyISAM 引擎表在被訪問(wèn)的時(shí)候需要消耗文件描述符,InnoDB引擎會(huì)自己管理已經(jīng)打開的表—table_open_cache)打開越來(lái)越多后,會(huì)消耗分配給每個(gè)實(shí)例的文件句柄數(shù)目,RDS在起初初始化實(shí)例的時(shí)候設(shè)置的open_files_limit為8192,當(dāng)打開的表數(shù)目超過(guò)該參數(shù)則會(huì)導(dǎo)致所有的數(shù)據(jù)庫(kù)請(qǐng)求報(bào)錯(cuò)誤。

3、現(xiàn)象

如果參數(shù)設(shè)置過(guò)小可導(dǎo)致應(yīng)用報(bào)錯(cuò)

[ERROR] /mysqld: Can't open file: './mysql/user.frm' (errno: 24 -Too many open files);

4、建議

提高open_files_limit的值,RDS目前可以支撐最大為65535,同時(shí)建議替換MyISAM存儲(chǔ)引擎為InnoDB引擎。

back_log

1、作用

MySQL每處理一個(gè)連接請(qǐng)求的時(shí)候都會(huì)對(duì)應(yīng)的創(chuàng)建一個(gè)新線程與之對(duì)應(yīng)。

那么在主線程創(chuàng)建新線程期間,如果前端應(yīng)用有大量的短連接請(qǐng)求到達(dá)數(shù)據(jù)庫(kù),MySQL 會(huì)限制此刻新的連接進(jìn)入請(qǐng)求隊(duì)列,由參數(shù)back_log控制。

如果等待的連接數(shù)量超過(guò)back_log,則將不會(huì)接受新的連接請(qǐng)求。

所以如果需要MySQL能夠處理大量的短連接,需要提高此參數(shù)的大小。

2、現(xiàn)象

如果參數(shù)過(guò)小可能會(huì)導(dǎo)致應(yīng)用報(bào)錯(cuò)SQLSTATE[HY000] [2002] Connection timed out;

3、建議

提高此參數(shù)值的大小(注意需要重啟實(shí)例),RDS在起初初始化的值的默認(rèn)值是50,現(xiàn)在初始化值已經(jīng)調(diào)大了3000。

innodb_autoinc_lock_mode

1、作用

在MySQL5.1.22后,InnoDB為了解決自增主鍵鎖表的問(wèn)題,引入了參數(shù)innodb_autoinc_lock_mode,用于控制自增主鍵的鎖機(jī)制。

該參數(shù)可以設(shè)置的值為0/1/2,RDS 默認(rèn)的參數(shù)值為1,表示InnoDB使用輕量級(jí)別的mutex鎖來(lái)獲取自增鎖,替代最原始的表級(jí)鎖。

但是在load data(包括:INSERT … SELECT, REPLACE … SELECT)場(chǎng)景下會(huì)使用自增表鎖,這樣會(huì)則可能導(dǎo)致應(yīng)用在并發(fā)導(dǎo)入數(shù)據(jù)出現(xiàn)死鎖。

2、現(xiàn)象

如果應(yīng)用并發(fā)使用load data(包括:INSERT … SELECT, REPLACE … SELECT)導(dǎo)入數(shù)據(jù)的時(shí)候出現(xiàn)死鎖:

RECORD LOCKS space id xx page no xx n bits xx index PRIMARY of table xx.xx trx id xxx lock_mode X insert intention waiting. TABLE LOCK table xxx.xxx trx id xxxx lock mode AUTO-INC waiting;

3、建議

建議將參數(shù)設(shè)置改為2,則表示所有情況插入都使用輕量級(jí)別的mutex鎖(只針對(duì)row模式),這樣就可以避免auto_inc的死鎖。

同時(shí)在INSERT … SELECT 的場(chǎng)景下會(huì)提升很大的性能(注意該參數(shù)設(shè)置為2,binlog的格式需要設(shè)置為row)。

query_cache_size

1、作用

該參數(shù)用于控制MySQL query cache的內(nèi)存大小。

如果MySQL開啟query cache,再執(zhí)行每一個(gè)query的時(shí)候會(huì)先鎖住query cache,然后判斷是否存在query cache中。

如果存在直接返回結(jié)果,如果不存在,則再進(jìn)行引擎查詢等操作。

同時(shí)insert、update和delete這樣的操作都會(huì)將query cahce失效掉。

這種失效還包括結(jié)構(gòu)或者索引的任何變化,cache失效的維護(hù)代價(jià)較高,會(huì)給MySQL帶來(lái)較大的壓力。

所以當(dāng)我們的數(shù)據(jù)庫(kù)不是那么頻繁的更新的時(shí)候,query cache是個(gè)好東西。

但是如果反過(guò)來(lái),寫入非常頻繁,并集中在某幾張表上的時(shí)候,那么query cache lock的鎖機(jī)制會(huì)造成很頻繁的鎖沖突,對(duì)于這一張表的寫和讀會(huì)互相等待query cache lock解鎖,導(dǎo)致select的查詢效率下降。

2、現(xiàn)象

數(shù)據(jù)庫(kù)中有大量的連接狀態(tài)為checking query cache for query、Waiting for query cache lock、storing result in query cache;

3、建議

RDS默認(rèn)是關(guān)閉query cache功能的。

如果您的實(shí)例打開了query cache,當(dāng)出現(xiàn)上述情況后可以關(guān)閉query cache。

當(dāng)然有些情況也可以打開query cache,比如:巧用query cache解決數(shù)據(jù)庫(kù)性能問(wèn)題(詳閱請(qǐng)復(fù)制此鏈接:http://hidba.org/?p=870)。

net_write_timeout

1、作用

等待將一個(gè)block發(fā)送給客戶端的超時(shí)時(shí)間。

2、現(xiàn)象

參數(shù)設(shè)置過(guò)小可能導(dǎo)致客戶端報(bào)錯(cuò)the last packet successfully received from the server was milliseconds ago,the last packet sent successfully to the server was milliseconds ago。

3、建議

該參數(shù)在RDS中默認(rèn)設(shè)置為60S。

一般在網(wǎng)絡(luò)條件比較差的時(shí),或者客戶端處理每個(gè)block耗時(shí)比較長(zhǎng)時(shí),由于net_write_timeout設(shè)置過(guò)小導(dǎo)致的連接中斷很容易發(fā)生,建議增加該參數(shù)的大小。

tmp_table_size

1、作用

該參數(shù)用于決定內(nèi)部?jī)?nèi)存臨時(shí)表的最大值。

每個(gè)線程都要分配(實(shí)際起限制作用的是tmp_table_size和max_heap_table_size的最小值)。

如果內(nèi)存臨時(shí)表超出了限制,MySQL就會(huì)自動(dòng)地把它轉(zhuǎn)化為基于磁盤的MyISAM表,優(yōu)化查詢語(yǔ)句的時(shí)候,要避免使用臨時(shí)表。

如果實(shí)在避免不了的話,要保證這些臨時(shí)表是存在內(nèi)存中的。

2、現(xiàn)象

如果復(fù)雜的SQL語(yǔ)句中包含了group by/distinct等不能通過(guò)索引進(jìn)行優(yōu)化而使用了臨時(shí)表,則會(huì)導(dǎo)致SQL執(zhí)行時(shí)間加長(zhǎng)。

3、建議

如果應(yīng)用中有很多group by/distinct等語(yǔ)句,同時(shí)數(shù)據(jù)庫(kù)有足夠的內(nèi)存,可以增大tmp_table_size(max_heap_table_size)的值,以此來(lái)提升查詢性能。

RDS MySQL 新增參數(shù)

下面介紹幾個(gè)比較有用的 RDS MySQL 新增參數(shù)。

loose_rds_max_tmp_disk_space

1、作用

用于控制MySQL能夠使用的臨時(shí)文件的大小,RDS初始默認(rèn)值是10G,如果臨時(shí)文件超出此大小,則會(huì)導(dǎo)致應(yīng)用報(bào)錯(cuò)。

2、現(xiàn)象

The table ‘/home/mysql/dataxxx/tmp/#sql_2db3_1’ is full。

3、建議

需要先分析一下導(dǎo)致臨時(shí)文件增加的SQL語(yǔ)句是否能夠通過(guò)索引或者其他方式進(jìn)行優(yōu)化。

其次如果確定實(shí)例的空間足夠,則可以提升此參數(shù)的值,以保證SQL能夠正常執(zhí)行。

此外,注意此參數(shù)需要重啟實(shí)例。

loose_tokudb_buffer_pool_ratio

1、作用

用于控制TokuDB引擎能夠使用的buffer內(nèi)存大小,比如innodb_buffer_pool_size設(shè)置為1000M,tokudb_buffer_pool_ratio設(shè)置為50(代表50%),那么tokudb引擎的表能夠使用的buffer 內(nèi)存大小則為500M。

2、建議

該參數(shù)在RDS中默認(rèn)設(shè)置為0。

如果RDS中使用tokudb引擎,則建議調(diào)大該參數(shù),以此來(lái)提升TokuDB引擎表的訪問(wèn)性能。該參數(shù)調(diào)整需要重啟數(shù)據(jù)庫(kù)實(shí)例。

loose_max_statement_time

1、作用

用于控制查詢?cè)贛ySQL的最長(zhǎng)執(zhí)行時(shí)間,如果超過(guò)該參數(shù)設(shè)置時(shí)間,查詢將會(huì)自動(dòng)失敗,默認(rèn)是不限制。

2、建議

如果用戶希望控制數(shù)據(jù)庫(kù)中SQL的執(zhí)行時(shí)間,則可以開啟該參數(shù),單位是毫秒。

3、現(xiàn)象

ERROR 3006 (HY000): Query execution was interrupted, max_statement_time exceeded

loose_rds_threads_running_high_watermark

1、作用

用于控制MySQL并發(fā)的查詢數(shù)目,比如將rds_threads_running_high_watermark該值設(shè)置為100,則允許MySQL同時(shí)進(jìn)行的并發(fā)查詢?yōu)?00個(gè)。

超過(guò)水位的查詢將會(huì)被拒絕掉,該參數(shù)與rds_threads_running_ctl_mode配合使用(默認(rèn)值為select)。

2、建議

該參數(shù)常常在秒殺或者大并發(fā)的場(chǎng)景下使用,對(duì)數(shù)據(jù)庫(kù)具有較好的保護(hù)作用。

作者簡(jiǎn)介

玄慚,阿里云資深DBA專家。有著豐厚的DBA經(jīng)驗(yàn),經(jīng)歷阿里歷年“雙11”考驗(yàn),保持著“無(wú)一丟單”的優(yōu)異紀(jì)錄。同時(shí),積累了6年對(duì)阿里云數(shù)據(jù)庫(kù)用戶的運(yùn)維、調(diào)優(yōu)、診斷等豐富的經(jīng)驗(yàn)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,406評(píng)論 6 538
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,034評(píng)論 3 423
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,413評(píng)論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,449評(píng)論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,165評(píng)論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,559評(píng)論 1 325
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,606評(píng)論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,781評(píng)論 0 289
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,327評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,084評(píng)論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,278評(píng)論 1 371
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,849評(píng)論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,495評(píng)論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,927評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,172評(píng)論 1 291
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,010評(píng)論 3 396
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,241評(píng)論 2 375

推薦閱讀更多精彩內(nèi)容