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. 用pip install升级已安装的包的附加包, 以tabulate包为例

    用pip install升级已安装的附加包, 以tabulate包为例 去pypi官网查看tabulate包的介绍, 发现tabulate 0.7.6才开始支持宽字符的美化打印. 而且还需要安装它的附 ...

  2. HttpContext.Current為空匯總

    1. async異步模式下為空 解决办法: <httpRuntime targetFramework="4.5" /> 或者: In your appSettings, ...

  3. MySQL在net中Datatime转换

    <add name="adDb"         connectionString="Persist Security Info=False;database=ad ...

  4. input输出类型

    http://www.w3school.com.cn/html5/html_5_form_input_types.asp

  5. 【leetcode 简单】 第八十六题 有效的完全平方数

    给定一个正整数 num,编写一个函数,如果 num 是一个完全平方数,则返回 True,否则返回 False. 注意:不要使用任何内置的库函数,如  sqrt. 示例 1: 输入: 16 输出: Tr ...

  6. Java 8 Lambda表达式,让你的代码更简洁

    Lambda表达式是Java 8一个非常重要的新特性.它像方法一样,利用很简单的语法来定义参数列表和方法体.目前Lambda表达式已经成为高级编程语言的标配,像Python,Swift等都已经支持La ...

  7. Dream------scala--开发环境搭建

    scala简介: scala是一门函数式编程和面向对象编程结合的语言 函数式编程非常擅长数值计算而面向对象特别适合于大型工程或项目的组织以及团队的分工合作 我们借助scala可以非常优雅的构造出各种规 ...

  8. vi 编辑器使用技巧

    1.由命令"vi --version"所显示的内容知vi的全局配置文件 2.显示行号   ,非编辑模式输入 : set nu 3.显示颜色 1)在文件中找到 "synta ...

  9. python的新特性

    http://www.jb51.net/article/67699.htm Python中用format函数格式化字符串的用法:http://www.jb51.net/article/63672.ht ...

  10. 从Python到Web开发

    基础部分: 1-编程基础及Python环境部署 2-Python基础语法-内存管理-运算符-程序控制 3-Python内置结构-列表 4-Python数据类型之元组-字符串 5-python的封装与结 ...