一、 MYSQL的內存分配問題
1、 MYSQL內存分配函數調用棧
從代碼(ma)就(jiu)可(ke)以看到,INNODB要分配(pei)和釋放內存的時候,并沒(mei)有(you)直接(jie)調(diao)用MALLOC和FREE,而是調(diao)用經過封裝(zhuang)的函數
My_alloc.c::alloc_root




2、 相關的參數


可以(yi)看到(dao)的(de)是,這(zhe)兩個參數(shu)從MYSQL5.6開始就已經(jing)廢棄了,MYSQL5.7更(geng)加(jia)直接(jie)刪除了,我從MARIADB10.0.21(相(xiang)當于MYSQL5.6)的(de)代碼(ma)中找到(dao)的(de)內容也證實了這(zhe)一點

二、 分析
1、 MYSQL是否有自己獨立的內存管理
準(zhun)確的(de)答案是(shi),曾經有過,但現在已經沒有了(le),完全用操作(zuo)系(xi)統(tong)的(de)ALLOCATOR了(le)。
為什么曾(ceng)經(jing)用過(guo),但現在不用了(le),MYSQL手冊(ce)中這(zhe)一(yi)段話說述了(le)這(zhe)一(yi)段的(de)歷(li)史(shi):

INNODB發展的早(zao)戎(rong),MEMORY ALLOCATOR缺(que)乏(fa)性(xing)能和擴展性(xing),沒有專門為多核CPU設計的MEMORY ALLOCATOR,所以(yi)INNODB在MEM模塊(kuai)中寫了自己(ji)的內存分配(pei)器。
但時至今日(ri),操作系統提供的(de)(de)內存分(fen)配器(qi)已經成熟并具高性能(其實(shi)這一段話(hua)也(ye)不完(wan)全對,我們(men)團隊在(zai)之前(qian)壓(ya)測(ce)的(de)(de)過程中遇到的(de)(de)SYS CPU升高的(de)(de)問題,就是用了PTMALLOC引起的(de)(de),替換成TCMALLOC或者(zhe)JEMALLOC之后解決)。
基于這個理由,MYSQL INNODB自己寫的MEMORY ALLOCATOR實(shi)現就沒(mei)必要(yao)存在了。確實(shi),這個應該(gai)是專門的MEM ALLOCATOR的工作(zuo),MYSQL沒(mei)必要(yao)關注 它。
2、當前注流的MEMORY ALLOCATOR

而PERCONA默認(ren)使用的是JEMALLOC
3、代碼上的確認
MY_MALLOC.C



注(zhu)意(yi),MALLOC函數前邊加了::全示全局域名,所以是操作系統的MEMORY ALLOCATOR
這個PFS MEMORY是什么宏??
MYSQL8.0.1的說明有(you)一段話

這個應該是開(kai)PFS MEMORY INSTRUMENT開(kai)關才有的
