mysql性能测试(使用TCMalloc前后对比)
"TCMalloc(Thread-Caching Malloc)是google-perftools工具中的一个,与标准的glibc库的malloc相 比,TCMalloc在内存的分配上效率和速度要高得多,可以提高Mysql服 务器在高并发情况下的性能,降低系统负载。"
今天动手测试了一下TCMalloc对mysql的影响,以下是我测试的流水过程:
硬件:
CPU:Intel(R) Xeon(R) CPU 5110@1.60GHz(四核心)
MEMORY:4G
软件:
OS:CentOS release 5.3 (Final)
MySQL edition:5.5.12-log
测试工具:
sysbench
tpcc(暂缺)
mysql相关参数:
sync_binlog=1
transaction-isolation=READ-COMMITTED
innodb_buffer_pool_size = 2500M
innodb_thread_concurrency = 9
innodb_flush_log_at_trx_commit = 1
innodb_io_capacity = 400
为了避免块设备的IO瓶颈,数据基本上全部在内存中读取 。
装载1kw条记录:
# sysbench --test=oltp --db-driver=mysql --mysql-user=root --mysql-host=127.0.0.1 --mysql-db=sbtest --mysql-socket=/tmp/mysql.sock --mysql-table-engine=innodb --oltp-table-size=10000000 prepare
安装TCMalloc:
# tar -zxvf google-perftools-1.7.tar.gz
# cd google-perftools-1.7
# mkdir /tmp/tc
# ./configure --prefix=/tmp/tc --disable-cpu-profiler --disable-heap-profiler --disable-heap-checker --disable-debugalloc --enable-minimal
# make && make install --编译报错,说没有g++
# yum install gcc-c++ libstdc++-devel
# cp /tmp/tc/lib/libtcmalloc_minimal.so.0.1.0 /usr/local/lib
# ln -s /usr/local/lib/libtcmalloc_minimal.so.0.1.0 /usr/local/lib/libtcmalloc.so
# ln -s /usr/local/lib/libtcmalloc_minimal.so.0.1.0 /usr/local/lib/libtcmalloc.so.0
# ln -s /usr/local/lib/libtcmalloc_minimal.so.0.1.0 /usr/local/lib/libtcmalloc.so.0.1.0
# cd google-perftools-1.7
# mkdir /tmp/tc
# ./configure --prefix=/tmp/tc --disable-cpu-profiler --disable-heap-profiler --disable-heap-checker --disable-debugalloc --enable-minimal
# make && make install --编译报错,说没有g++
# yum install gcc-c++ libstdc++-devel
# cp /tmp/tc/lib/libtcmalloc_minimal.so.0.1.0 /usr/local/lib
# ln -s /usr/local/lib/libtcmalloc_minimal.so.0.1.0 /usr/local/lib/libtcmalloc.so
# ln -s /usr/local/lib/libtcmalloc_minimal.so.0.1.0 /usr/local/lib/libtcmalloc.so.0
# ln -s /usr/local/lib/libtcmalloc_minimal.so.0.1.0 /usr/local/lib/libtcmalloc.so.0.1.0
"Mysql加入动态库
修改mysql服 务的启动脚本mysqld_safe,在“ # executing mysqld_safe”行后添加行:
export LD_PRELOAD="/usr/local/lib/libtcmalloc.so"
目的是在启动mysql前, 加载tcmalloc动态库。
重启Mysql服 务:
/usr/local/mysql/bin/mysqladmin shutdown
/usr/local/mysql/bin/mysqld_safe –user=mysql &
验证TCMalloc
使用lsof查看mysql进 程是否已经加载了tcmalloc库:"
# lsof -n | grep tcmalloc
mysqld 10472 mysql mem REG 253,0 873557 15970541 /usr/local/lib/libtcmalloc_minimal.so.0.1.0
sysbench运行语句:
# time sysbench --test=oltp --db-driver=mysql --mysql-user=root --mysql-host=127.0.0.1 --mysql-socket=/tmp/mysql.sock --mysql-table-engine=innodb --mysql-db=sbtest --num-threads=[1...64] --max-requests=10000 --oltp-read-only=on --oltp-table-size=10000000 run
测试结果如下:
横轴为并发线程数
纵轴为每秒完成的事务量(只读)
从文档中得知,TCmalloc的从两个地方改善性能:
一是执行一次malloc/free的速度;
二是减少了多线程程序中的锁争用情况。对于小对象,几乎已经达到了零争用。对于大对象,TCMalloc尝试使用粒度较好和有效的自旋锁。
参考:
http://code.google.com/p/google-perftools/