查看mysql占用的缓冲池大小(关于MySQL配置tcmalloc后在高并发下内存使用情况)

1、概述

tcmalloc非常出名了,由google推出的内存管理模块,比传统模块控制更合理,能应付更高的并发,而且也更稳定。现在可以将MySQL使用了tcmalloc来管理内存,应对高并发的场景。

但是两者结合后,它们的内存使用情况,我尝试用压测的方式记录内存使用情况,再与默认的glibc内存分配器做对比,看看其内存分配性能分配差异。

注意:由于是通过压测的方式得出结果,下面的测试结果,仅供参考;毕竟在实际场景中,需要长时间的运作,才能有效体现tcmalloc内存管理的性能。

2、准备

测试环境为2台虚拟主机VM,配置如下:

查看mysql占用的缓冲池大小(关于MySQL配置tcmalloc后在高并发下内存使用情况)(1)

MySQL配置参数:

shell> vim /etc/my.cnf # innodb缓冲池大小设置为内存的80% innodb_buffer_pool_size = 6442450944 # 文件描述符 open_files_limit = 655350 innodb_open_files=655350 # 最大连接数 max_connections=10240

修改系统文件描述符

shell> vim /etc/sysctl.conf fs.file-max = 655350 # 激活 shell> sysctl -p shell> ulimit -n 655350 shell> vim /etc/security/limits.conf * - nofile 655350 root hard nofile 655350 root soft nofile 655350

3、安装tcmalloc

开始安装

选择其中一台VM安装tcmalloc

先安装相关运行库,因为是用c 写的,需要make,还有一个运行环境libunwind

shell> yum -y install gcc make gcc-c libunwind

然后下载并安装google-perftools

#下载源码包 shell> wget https://github.com/gperftools/gperftools/releases/download/gperftools-2.10/gperftools-2.10.tar.gz shell> tar zxvf gperftools-2.10.tar.gz #开始编译安装 shell> cd gperftools-2.10 shell> ./configure shell> make && make install #搜索找到安装好的相关C库文件 shell> find / -name libtcmalloc.so /usr/local/lib/libtcmalloc.so /opt/gperftools-2.5/.libs/libtcmalloc.so #创建lib库软连接,这样就不需要用ldconfig了 shell> ln -sf /usr/local/lib/libtcmalloc.so /usr/lib/ shell> ln -sf /usr/local/lib/libtcmalloc.so /usr/lib64/ # 查看一下 shell> ll /usr/lib/libtcmalloc.so

配置MySQL使用

使用MySQL调用这个模块,本文采用加载的配置文件的方法。不过,都要重启MySQL程序才能生效。

没有任何应用服务加载的话,下面这条命令是没有返回的:

shell> lsof -n | grep tcmalloc

然后,我们加到MySQL的配置文件my.cnf来使用

shell> vim /usr/lib/systemd/system/mysqld.service # Use this to switch malloc implementation EnvironmentFile=-/etc/sysconfig/mysql # 写入配置文件 shell> echo 'LD_PRELOAD=/usr/local/lib/libtcmalloc.so' > /etc/sysconfig/mysql # 重启 shell> systemctl daemon-reload shell> systemctl restart mysqld # 注意: 如果是正常安装并加载libtcmalloc.so的话,是不会报错的,重启将直接生效。 shell> lsof -n | grep tcmalloc mysqld 31423 mysql mem REG 253,1 2632824 4734064 /usr/local/lib/libtcmalloc.so.4.5.10 mysqld 31423 31424 mysql mem REG 253,1 2632824 4734064 /usr/local/lib/libtcmalloc.so.4.5.10 mysqld 31423 31437 mysql mem REG 253,1 2632824 4734064 /usr/local/lib/libtcmalloc.so.4.5.10 mysqld 31423 31438 mysql mem REG 253,1 2632824 4734064 /usr/local/lib/libtcmalloc.so.4.5.10 mysqld 31423 31439 mysql mem REG 253,1 2632824 4734064 /usr/local/lib/libtcmalloc.so.4.5.10 mysqld 31423 31440 mysql mem REG 253,1 2632824 4734064 /usr/local/lib/libtcmalloc.so.4.5.10 mysqld 31423 31441 mysql mem REG 253,1 2632824 4734064 /usr/local/lib/libtcmalloc.so.4.5.10 mysqld 31423 31442 mysql mem REG 253,1 2632824 4734064 /usr/local/lib/libtcmalloc.so.4.5.10 mysqld 31423 31443 mysql mem REG 253,1 2632824 4734064 /usr/local/lib/libtcmalloc.so.4.5.10 mysqld 31423 31444 mysql mem REG 253,1 2632824 4734064 /usr/local/lib/libtcmalloc.so.4.5.10

开始压测

压测工具采用MySQL官方提供的mysqlslap工具命令,至于具体用法,可以从官网查阅;以下是简单说明:

shell> mysqlslap -h127.0.0.1 -uroot -p --concurrency=<并发量> --iterations=1 --auto-generate-sql --auto-generate-sql-load-type=mixed --auto-generate-sql-add-autoincrement --engine=innodb --number-of-queries=<总的测试查询次数> 说明:测试100个并发线程,测试次数1次,自动生成SQL测试脚本,读、写、更新混合测试,自增长字段,测试引擎为innodb,共运行1000次查询 shell> mysqlslap -h127.0.0.1 -uroot -p --concurrency=100 --iterations=1 --auto-generate-sql --auto-generate-sql-load-type=mixed --auto-generate-sql-add-autoincrement --engine=innodb --number-of-queries=1000

我们围绕并发量与查询次数两个维度,分别用tmalloc与glibc来压测,看看内存的使用情况。

并发量:100

查看mysql占用的缓冲池大小(关于MySQL配置tcmalloc后在高并发下内存使用情况)(2)

查看mysql占用的缓冲池大小(关于MySQL配置tcmalloc后在高并发下内存使用情况)(3)

并发量1000

查看mysql占用的缓冲池大小(关于MySQL配置tcmalloc后在高并发下内存使用情况)(4)

查看mysql占用的缓冲池大小(关于MySQL配置tcmalloc后在高并发下内存使用情况)(5)

并发量10000

查看mysql占用的缓冲池大小(关于MySQL配置tcmalloc后在高并发下内存使用情况)(6)

查看mysql占用的缓冲池大小(关于MySQL配置tcmalloc后在高并发下内存使用情况)(7)

总结

1、从并发量100,1000两个指标来看,tmalloc占用的内存较少,减少内存碎片化会较为明显。

2、但是在并发量10000的指标来看, 两者的差异就不大了,反而在查询1万次,glibc占用内存更少(当时测试都觉得诧异,单独压测3次的)。

3、在并发量10000,并且查询1百万次情况下,tmalloc多次压测都是OOM的,反而glibc会相对稳定,压测时长平均在10分钟左右。

4、单纯从以上数据观察, 建议使用tmalloc前,根据现有的配置,做多次测试,找出最佳的并发量平衡点,可以发挥稳定的性能。

以上就是今天的内容,希望读者朋友看完这篇文章后有所启发。

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页