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/

【原创】MySQL5.7.18(ptmalloc VS tcmalloc VS jemalloc)性能测试的更多相关文章

  1. ptmalloc、tcmalloc和jemalloc

    内存优化总结:ptmalloc.tcmalloc和jemalloc 转载 2017年09月05日 18:57:12 3674 转载于:http://www.cnhalo.net/2016/06/13/ ...

  2. 内存优化总结:ptmalloc、tcmalloc和jemalloc(转)

    转载于:http://www.cnhalo.net/2016/06/13/memory-optimize/ 概述 需求 系统的物理内存是有限的,而对内存的需求是变化的, 程序的动态性越强,内存管理就越 ...

  3. 内存优化总结:ptmalloc、tcmalloc和jemalloc

    概述 需求 系统的物理内存是有限的,而对内存的需求是变化的, 程序的动态性越强,内存管理就越重要,选择合适的内存管理算法会带来明显的性能提升.比如nginx, 它在每个连接accept后会malloc ...

  4. Apache2.4.23+PHP5.6.30+MySQL5.7.18安装教程

    最近在工作中常常接触到PHP,自己也写过一些简单的PHP页面.我们知道PHP是在服务器端运行的脚本语言,因此我们需要配置服务器环境.之前为了省事直接使用的是wamp集成环境,但是突然某一天领导要求我们 ...

  5. mac下,mysql5.7.18连接出错,错误信息为:Access denied for user 'root'@'localhost' (using password: YES)

    mac下,mysql5.7.18连接出错,错误信息为:Access denied for user 'root'@'localhost' (using password: YES)()里面的为shel ...

  6. mysql5.7.18的安装与主从复制

    CentOS6.7安装mysql5.7.18 1.  解压到/usr/local目录 # tar -zxvf mysql-5.7.18-linux-glibc2.5-i686.tar.gz -C /u ...

  7. Centos7.3下mysql5.7.18安装并修改初始密码的方法

    Centos7.3下mysql5.7.18安装并修改初始密码的方法 原文链接:http://www.jb51.net/article/116032.htm 作者:Javen205 字体:[增加 减小] ...

  8. windows10下 MySQL5.7.18版本安装过程及遇到的问题

    windows10下 MySQL5.7.18版本安装过程及遇到的问题           mysql-5.7.18-winx64 安装           1.解压 此次将MySQL装在H盘,依个人喜 ...

  9. Windows下安装MySQL5.7.18的方法

    准备: 操作系统:win7 下64位的zip版本的MySQL,路径:http://dev.mysql.com/downloads/mysql/ 我下的是最新版的MySQL,解压后,目录如下: 可以看到 ...

随机推荐

  1. JS代码判断浏览器版本,支持IE6,IE7,IE8,IE9!三种方法!

    web开发的时候有时候会用到JS检测IE的版本,下面是检测Microsoft Internet Explorer版本的三种代码! 方法一: <script type="text/jav ...

  2. UNIX环境高级编程 第4章 文件和目录

    第三章说明了关于文件I/O的基本函数,主要是针对普通regular类型文件.本章描述文件的属性,除了regular文件还有其他类型的文件. 函数stat.fstat.fstatat和lstat sta ...

  3. 20165227 《Java程序设计》实验一(Java开发环境的熟悉)实验报告

    20165227 <Java程序设计>实验一(Java开发环境的熟悉)实验报告 一.实验报告封面 课程:Java程序设计 班级:1652班 姓名:朱越 学号:20165227 指导教师:娄 ...

  4. sqlplus设置长度

    1.set linesize   100 2.col  XX format  a30 3.col  XXX format 9,999,999,999 3.set heading off  表头不显示

  5. 让arch阻止某个软件包的升级

    我更新了eclipse-java Mars版本的,感觉特别的卡,而且还有好多bug,不知道为什么,因此我去官网下载了luna版本的eclipse的安装包,不知道怎么下载的点击这里,然后安装luna版本 ...

  6. 4 - django-orm基本使用

    目录 1 数据库与ORM 2 orm的配置 2.1 引擎和配置 2.2 mysql驱动程序 3 orm 表模型 3.1 创建表对象 3.2 Django字段类型 3.3 常用字段参数说明 3.4 特殊 ...

  7. bind系统调用

    /* * Bind a name to a socket. Nothing much to do here since it's * the protocol's responsibility to ...

  8. mysql状态查看 QPS/TPS/缓存命中率查看【转】

    运行中的mysql状态查看   对正在运行的mysql进行监控,其中一个方式就是查看mysql运行状态.    (1)QPS(每秒Query量)  QPS = Questions(or Queries ...

  9. ps查看CPU和内存占用前10的进程

    内存增序 ps aux --sort rss 内存减序 ps aux --sort -rss cpu增序 ps auxw --sort=%cpu cpu减序 ps auxw --sort=-%cpu ...

  10. 关于vc++ 6.0 编译器,点打开文件时自动关闭

    装好VC++ 6.0后,点打开文件时编译器会自动关闭掉,然后在网上找到各位大神写的资料,果然是因为之前有安装vs2010冲突的缘故,然后http://download.csdn.net/source/ ...