詳解分析MySQL8.0的內(nèi)存消耗
在MySQL8.0在啟動(dòng)的時(shí)候,會(huì)配置各種各樣的buffer和cache來提高數(shù)據(jù)庫的性能。如果我們在一臺(tái)服務(wù)器上配置了MySQL8.0的服務(wù),那么這臺(tái)服務(wù)器的內(nèi)存會(huì)同時(shí)被操作系統(tǒng)、MySQL8.0服務(wù)、以及其他應(yīng)用程序所共享。
生產(chǎn)環(huán)境中,經(jīng)常會(huì)遇到內(nèi)存的報(bào)警,在處理這些報(bào)警之前,你需要知道MySQL本身消耗內(nèi)存最多的點(diǎn)在哪里,這樣才能比較直觀的判斷出來你的MySQL服務(wù)占用的內(nèi)存有多少,以及如何降低MySQL本身的內(nèi)存消耗。
在MySQL配置文件中,最常用的兩個(gè)內(nèi)存相關(guān)的參數(shù)是innodb_buffer_pool_size、innodb_log_buffer_size,我們來看這兩個(gè)參數(shù)。
1、innodb_buffer_pool_size
這個(gè)參數(shù)定義了buffer pool的大小,大家可能都比較熟悉,buffer pool中的內(nèi)容包含innodb 表、索引、以及其他的輔助buffer,buffer pool的大小對MySQL系統(tǒng)性能影響比較大,默認(rèn)情況下,MySQL8.0配置的buffer pool大小是128MB,通常情況下,如果是單機(jī)單實(shí)例,沒有其他業(yè)務(wù),那么MySQL官方建議配置的大小為系統(tǒng)內(nèi)存的50%到75%之間。當(dāng)然,如果你的服務(wù)器上還部署了其他的應(yīng)用程序,那么你需要酌情減小這個(gè)比例,從而騰出內(nèi)存。
如果你的操作系統(tǒng)的內(nèi)存很充裕,你可以設(shè)置多個(gè)innodb buffer pool實(shí)例,可以使用下面的參數(shù)來調(diào)整這個(gè)實(shí)例的個(gè)數(shù):
mysql> show variables like '%innodb_buffer_pool_instances%'; +------------------------------+-------+ | Variable_name | Value | +------------------------------+-------+ | innodb_buffer_pool_instances | 1 | +------------------------------+-------+ 1 row in set (0.00 sec)
2、innodb_log_buffer_size
這個(gè)參數(shù)定義了innodb存儲(chǔ)引擎向磁盤上寫redo log之前,最多在內(nèi)存中緩存數(shù)據(jù)的大小,默認(rèn)是16MB。這個(gè)值增加之后,大的事務(wù)可以不用在事務(wù)提交之前將redo log落盤。如果你的update、delete和insert操作影響行數(shù)比較多,那么你需要考慮增大這個(gè)值。
重點(diǎn)來了:
在操作系統(tǒng)里面,MySQL占用的內(nèi)存不僅僅是上述兩個(gè)內(nèi)存配置參數(shù)有關(guān),通常情況下,我們計(jì)算MySQL占用的內(nèi)存的時(shí)候,會(huì)使用下面4個(gè)值相加的方式:
1、innodb_buffer_pool_size
2、key_buffer_size (這個(gè)參數(shù)通常是myisam表占用內(nèi)存的關(guān)鍵參數(shù))
3、max_connections*(sort_buffer_size+read_buffer_size+binlog_cache_size) (這三個(gè)是連接級別的buffer)
4、max_connections*2MB
所以當(dāng)你使用top命令看到你的MySQL占用的內(nèi)存遠(yuǎn)遠(yuǎn)超過innodb_buffer_pool_size的時(shí)候,你需要考慮的另外一個(gè)關(guān)鍵因素是連接數(shù)是否超標(biāo)了,一旦連接數(shù)過高,那么上述3、4這兩部分消耗的內(nèi)存將會(huì)非常多。
當(dāng)然,上面列舉的,是MySQL最主要占用內(nèi)存的幾個(gè)因素,除此之外,其他的內(nèi)存消耗的地方,可以查看官方文檔:
https://dev.mysql.com/doc/refman/8.0/en/memory-use.html
上述文檔中,還有介紹我們?nèi)绾问褂胮erformance_schema來監(jiān)控MySQL的內(nèi)存使用,這里我提一下整個(gè)流程,詳細(xì)的細(xì)節(jié)以及參數(shù)介紹請參看官方文檔。
1、查看
performance_schema.setup_instruments
這張表,找到你關(guān)注的內(nèi)存變量的名稱(直接搜索,結(jié)果有490多條,分為好幾個(gè)大類,一定記得過濾自己關(guān)注的參數(shù))。舉個(gè)例子,我們搜索memory/innodb相關(guān)參數(shù),代表innodb存儲(chǔ)引擎占用的內(nèi)存,結(jié)果如下:
mysql> SELECT * FROM performance_schema.setup_instruments WHERE NAME LIKE '%memory/innodb%'; +-------------------------------------------+---------+-------+-------------------+------------+---------------+ | NAME | ENABLED | TIMED | PROPERTIES | VOLATILITY | DOCUMENTATION | +-------------------------------------------+---------+-------+-------------------+------------+---------------+ | memory/innodb/adaptive hash index | YES | NULL | | 0 | NULL | | memory/innodb/log and page archiver | YES | NULL | | 0 | NULL | | memory/innodb/buf_buf_pool | YES | NULL | global_statistics | 0 | NULL | | memory/innodb/buf_stat_per_index_t | YES | NULL | | 0 | NULL | | memory/innodb/clone | YES | NULL | | 0 | NULL | | memory/innodb/dict_stats_bg_recalc_pool_t | YES | NULL | | 0 | NULL | | memory/innodb/dict_stats_index_map_t | YES | NULL | | 0 | NULL | | memory/innodb/dict_stats_n_diff_on_level | YES | NULL | | 0 | NULL | | memory/innodb/other | YES | NULL | | 0 | NULL | | memory/innodb/partitioning | YES | NULL | | 0 | NULL | | memory/innodb/row_log_buf | YES | NULL | | 0 | NULL | | memory/innodb/row_merge_sort | YES | NULL | | 0 | NULL | | memory/innodb/std | YES | NULL | | 0 | NULL | | memory/innodb/trx_sys_t::rw_trx_ids | YES | NULL | | 0 | NULL | | memory/innodb/undo::Tablespaces | YES | NULL | | 0 | NULL | | memory/innodb/ut_lock_free_hash_t | YES | NULL | | 0 | NULL | | memory/innodb/api0api | YES | NULL | | 0 | NULL | | memory/innodb/api0misc | YES | NULL | | 0 | NULL | | memory/innodb/btr0btr | YES | NULL | | 0 | NULL |
2、在配置文件中寫上相關(guān)的參數(shù),開啟統(tǒng)計(jì),以memory/innodb/row_log_buf為例,配置文件修改的如下:
performance-schema-instrument='memory/innodb/row_log_buf=COUNTED'
3、啟動(dòng)實(shí)例,并在performance_schema數(shù)據(jù)庫的memory_summary_global_by_event_name表中查看內(nèi)存統(tǒng)計(jì)結(jié)果。
SELECT * FROM performance_schema.memory_summary_global_by_event_name WHERE EVENT_NAME LIKE 'memory/innodb/row_log_buf'\G
當(dāng)然,你還可以根據(jù)sys表中的結(jié)果,查看每個(gè)大類的聚合結(jié)果,如下:
mysql> SELECT SUBSTRING_INDEX(event_name,'/',2) AS code_area, FORMAT_BYTES(SUM(current_alloc)) AS current_alloc FROM sys.x$memory_global_by_current_bytes GROUP BY SUBSTRING_INDEX(event_name,'/',2) ORDER BY SUM(current_alloc) DESC; +---------------------------+---------------+ | code_area | current_alloc | +---------------------------+---------------+ | memory/innodb | 843.24 MiB | | memory/performance_schema | 81.29 MiB | | memory/mysys | 8.20 MiB | | memory/sql | 2.47 MiB | | memory/memory | 174.01 KiB | | memory/myisam | 46.53 KiB | | memory/blackhole | 512 bytes | | memory/federated | 512 bytes | | memory/csv | 512 bytes | | memory/vio | 496 bytes | +---------------------------+---------------+
更詳細(xì)的信息,請參見官方文檔。
以上就是詳解分析MySQL8.0的內(nèi)存消耗的詳細(xì)內(nèi)容,更多關(guān)于MySQL8.0 內(nèi)存消耗的資料請關(guān)注本站其它相關(guān)文章!
版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。