"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/