【原創】MySQL5.7.18(ptmalloc VS tcmalloc VS jemalloc)性能測試


ptmalloc(glibc的malloc)是Linux提供的內存分配管理模塊,目前我們MySQL默認使用的內存分配模塊。

tcmalloc是Google提供的內存分配管理模塊。

jemalloc是FreeBSD提供的內存分配管理模塊。

 

下面用sysbench對MySQL5.7.18搭配三種不同的內存分配管理模塊做了壓測。

 

【sysbench配置】

16個tables,單表數據量2500W,OLAP模式,預熱時間600S,單次測試時間600S,每個場景測試5次。

 

【mysql配置】 

關閉預熱,buffer pool調整為16G,服務器物理內存64G

innodb_buffer_pool_load_at_startup=0

innodb_buffer_pool_size=16G

 

【測試數據】

QPS

ptmalloc2

tcmalloc4.1.0

jemalloc-5.0.1

warm up

8158.05

8720.78

8828.06

Threads 16

8788.19

8755.96

9976.9

Threads 32

13481.61

11908.99

13559.32

Threads 64

15722.35

15678.27

17015.05

Threads 128

17957.68

17929.17

19665.71

 

TPS

ptmalloc2

tcmalloc4.1.0

jemalloc-5.0.1

warm up

453.22

484.47

490.44

Threads 16

488.21

486.43

554.25

Threads 32

748.96

661.59

753.28

Threads 64

873.43

870.99

945.24

Threads 128

997.57

996.02

1092.42

 

 

ptmalloc

tcmalloc

jemalloc

VmRSS:

2259272

2325520

2899384

VmRSS:

4942224

4205684

3990556

VmRSS:

7351488

6668696

6585080

VmRSS:

9703240

9031616

9027632

VmRSS:

12005820

11318512

11479836

VmRSS:

14261672

13639416

13845412

VmRSS:

16467972

15919476

16175976

VmRSS:

18358520

18111000

18443324

VmRSS:

18366840

18403856

18649424

VmRSS:

18368820

18404236

18650740

VmRSS:

18368504

18406144

18650896

VmRSS:

18467844

18492448

18718692

VmRSS:

18469004

18492880

18719844

VmRSS:

18469268

18493016

18720412

VmRSS:

18469796

18493568

18721692

 

【圖形展示】

 

 

【結論】 

1、jemalloc在多線程高並發環境下,隨着並發線程數的增加,QPS和TPS增長比較穩定,性能高於ptmalloc和tcmalloc。

2、在目前的壓測場景下,隨着線程數的增加,MySQL進程占用的物理內存並沒有太大的差異。

3、關於jemalloc的應用,相對tcmalloc而言,jemalloc是MariaDB,Redis等默認的內存分配管理模塊,另外AliSQL也集成了jemalloc。

 

【附錄】

1、下圖是其他機構的一個測試報告(針對較早之前的版本),最左邊的是glibc的ptmalloc,最右邊的就是jemalloc,

可以看到jemalloc和tcmalloc的性能差異不大,jemalloc的效率稍高。

 

2、三者的比較

ptmalloc2

tcmalloc4.1.0

jemalloc-5.0.1

ptmalloc的缺陷

  • 后分配的內存先釋放,因為 ptmalloc 收縮內存是從 top chunk 開始,如果與 top chunk 相鄰的 chunk 不能釋放, top chunk 以下的 chunk 都無法釋放。
  • 多線程鎖開銷大, 需要避免多線程頻繁分配釋放。
  • 內存從thread的areana中分配, 內存不能從一個arena移動到另一個arena, 就是說如果多線程使用內存不均衡,容易導致內存的浪費。 比如說線程1使用了300M內存,完成任務后glibc沒有釋放給操作系統,線程2開始創建了一個新的arena, 但是線程1的300M卻不能用了。
  • 每個chunk至少8字節的開銷很大
  • 不定期分配長生命周期的內存容易造成內存碎片,不利於回收。 64位系統最好分配32M以上內存,這是使用mmap的閾值。

tcmalloc的改進

  • ThreadCache會階段性的回收內存到CentralCache里。 解決了ptmalloc2中arena之間不能遷移的問題。
  • Tcmalloc占用更少的額外空間。例如,分配N個8字節對象可能要使用大約8N * 1.01字節的空間。即,多用百分之一的空間。Ptmalloc2使用最少8字節描述一個chunk。
  • 更快。小對象幾乎無鎖, >32KB的對象從CentralCache中分配使用自旋鎖。 並且>32KB對象都是頁面對齊分配,多線程的時候應盡量避免頻繁分配,否則也會造成自旋鎖的競爭和頁面對齊造成的浪費。

jemalloc的優化

  • Jmalloc小對象也根據size-class,但是它使用了低地址優先的策略,來降低內存碎片化。
  • Jemalloc大概需要2%的額外開銷。
  • Jemalloc和tcmalloc類似的線程本地緩存,避免鎖的競爭
  • 相對未使用的頁面,優先使用dirty page,提升緩存命中。

 

參考資料:

ptmalloc,tcmalloc和jemalloc內存分配策略研究

http://www.360doc.com/content/13/0915/09/8363527_314549128.shtml

內存優化總結:ptmalloc、tcmalloc和jemalloc

http://www.cnhalo.net/2016/06/13/memory-optimize/

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM