共計 1438 個字符,預(yù)計需要花費(fèi) 4 分鐘才能閱讀完成。
本篇內(nèi)容介紹了“MySQL 內(nèi)存的 bug 分析”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓丸趣 TV 小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
所有 percona 所支持的客戶都有獲得 bug 修復(fù)的資格,但他們也有不同的選擇。比如,vip 客戶在軟件補(bǔ)丁正式發(fā)布之前就可以獲得 hotfiix 版本,高級客戶甚至不需要使用 percona 的軟件,我們也可以為他們把補(bǔ)丁推到上游。但對于與 percona 產(chǎn)品來說,所有支持等級都有權(quán)得到 bug 修復(fù)。
即便如此,這并不意味著我們會修復(fù)所有的意外情況,即使我們接受這種情況為一個有效 bug。做出這樣的決定的原因之一可能是這個意外情況雖然很明確是錯誤的,但對于 percona 產(chǎn)品本身來說確實一個產(chǎn)品需求
作為學(xué)習(xí)案例的一個 bug
最近一個很好的案例是 PS-5312 鏈接 3 ——這個 bug 可在上游復(fù)現(xiàn)并被記錄在 bugs.mysql.com/95065 鏈接 4。
這個報告闡述了一種情況,當(dāng)訪問 InnoDB 的全文索引的時候會導(dǎo)致內(nèi)存使用量增長。這種情況出現(xiàn)在一些全文索引的查詢,內(nèi)存會持續(xù)增長直到達(dá)到最大值,并且很長時間不會釋放。
來自 Percona 工程團(tuán)隊的 Yura Sorokin 研究表明,這種情況并不屬于內(nèi)存泄漏范疇。
當(dāng) InnoDB 解析一個全文查詢時,它會在 fts_query_phrase_search 函數(shù)中創(chuàng)建一個內(nèi)存堆,這個堆可能增長到 80M。另外,這個過程還會使用到大量非連續(xù)塊 (mem_block_t) 進(jìn)而產(chǎn)生的內(nèi)存碎片。
在函數(shù)出口,這些內(nèi)存堆會被釋放。InnoDB 會為其分配的每一個塊做這個操作。在函數(shù)執(zhí)行結(jié)束時,調(diào)用一個內(nèi)存分配器庫中的 free()操作,比如 malloc 或者 jemalloc。從 MySQL 本身來看,這都是沒問題的,不存在內(nèi)存泄漏。
然而,free()函數(shù)被調(diào)用時確實應(yīng)該釋放內(nèi)存,但不需要將其返回給操作系統(tǒng)。如果內(nèi)存分配器發(fā)現(xiàn)這些內(nèi)存塊馬上還需要被用到,則會將他們保留住繼續(xù)用于 mysqld 進(jìn)程。這就解釋了為什么 mysqld 在完成工作及釋放內(nèi)存都結(jié)束后還會占用大量內(nèi)存。
這個在實際生產(chǎn)中并不是一個大問題,按道理不應(yīng)該造成任何事故。但是如果你需要更快地將內(nèi)存返回給操作系統(tǒng),你可以嘗試非傳統(tǒng)的內(nèi)存分配器,類似 jemallolc。它被證明可以解決 PS-5312 鏈接 5 的問題。
另一個改善內(nèi)存管理的因素是 cpu 內(nèi)核數(shù)量:在測試中,cpu 核數(shù)越多,內(nèi)存返回給操作系統(tǒng)的速度會越快。這可能是你擁有多個 CPU,而其中一個可專門用作內(nèi)存分配器釋放內(nèi)存給操作系統(tǒng)。
修復(fù)方法
我們有兩種方法來修復(fù)這個問題:
1. 修改 InnoDB 全文索引的實現(xiàn)
2. 使用自定義內(nèi)存庫,例如 jemalloc
這兩種方法都有各自的優(yōu)缺點。
方法 1 意味著我們引入了與軟件上游不兼容性的風(fēng)險,這可能會導(dǎo)致新版本中出現(xiàn)未知的錯誤。也意味著徹底重寫 InnoDB 全文索引部分代碼,這在用戶們使用的 GA 版本中是有風(fēng)險的。
方法 2 則意味著我們可能會命中一些 jemalloc 庫中專門為性能設(shè)計但不是最安全的內(nèi)存分配的 bug。
因此我們不得不在這兩個并不完美的方法中選擇一個。
鑒于方法一可能導(dǎo)致 percona 服務(wù)與上游的不兼容,我們更傾向于用方法二來解決問題,并期待著上游修復(fù)這個 bug。
“MySQL 內(nèi)存的 bug 分析”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注丸趣 TV 網(wǎng)站,丸趣 TV 小編將為大家輸出更多高質(zhì)量的實用文章!