TCMalloc 对MYSQL 性能 优化的分析

TCMalloc 对MYSQL 性能 优化的分析

 

  • Author:Echo Chen(陈斌)

  • Email:chenb19870707@gmail.com

  • Blog:Blog.csdn.net/chen19870707

  • Date:October 10th, 2014

     

           

          尽管经过研究发现TCMalloc不适合我们现有的游戏框架,但意外收获发现TCMalloc能够大幅度提高MYSQL 性能及内存占用,这里给出配置及測试的结果:

     

    一、配置

        

          关于TCMalloc的安装,在《Google perftools 安装手记(TCMalloc)》 一文中已经具体给出。以下给出将TCMalloc配置到MYSQL的步骤:

     

    1.改动MySQL启动脚本(根据MySQL安装位置):

     

    vi /usr/local/mysql/bin/mysqld_safe
    
    在# executing mysqld_safe的下一行,加入:
    
    export LD_PRELOAD=/usr/local/lib/libtcmalloc.so
    
    保存退出,并重新启动MySQL
    

     

     

    2.根据lsof验证命令查看TCMalloc是否起效

     

    # lsof |grep -i libtcmalloc.so
    
    假设发现下面信息,说明tcmalloc已经起效:
    
    mysqld  13961   mysql  mem    REG  253,0  1948990     196421/usr/local/lib/libtcmalloc.so.4.1.2
    


     

    二、性能測试工具sysbench

       

    sysbench是一个开源的、模块化的、跨平台的多线程性能測试工具,能够用来进行CPU、内存、磁盘I/O、线程、数据库的性能測试。

    眼下支持的数据库有MySQL、Oracle和PostgreSQL。下面操作都将以支持MySQL数据库为例进行。sourceforge已挂,下载地址:http://download.csdn.net/detail/chen19870707/8060033,安装过程例如以下:

     

    tar zxf sysbench-0.4.10.tar.gz 
    cd sysbench-0.4.10
    ./configure && make && make install 
    strip /usr/local/bin/sysbench 
     

    选项说明參考:http://www.cnblogs.com/zhoujinyi/archive/2013/04/19/3029134.html

     

     

    三、性能分析:

     
    数据准备:
    sysbench --test=oltp --mysql-table-engine=innodb --oltp-table-size=10000 --max-requests=10000 --num-threads=16 --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=root --mysql-password=root --mysql-db=test --mysql-socket=/tmp/mysql.sock prepare
     
    性能測试:
    sysbench --test=oltp --mysql-table-engine=innodb --oltp-table-size=10000 --max-requests=10000 --num-threads=16 --mysql-host=127.0.0.1  --mysql-port=3306 --mysql-user=root --mysql-password=root --mysql-db=test --mysql-socket=/tmp/mysql.sock run >> report.txt

     
    数据清理:
    /usr/local/bin/sysbench --test=oltp --mysql-table-engine=innodb --oltp-table-size=10000 --max-requests=10000 --num-threads=16 --mysql-host=127.0.01  --mysql-port=3306 --mysql-user=root --mysql-password=root --mysql-db=test --mysql-socket=/tmp/mysql.sock cleanup

    參数说明:
    --oltp-table-size=N         測试表的记录数。默认是10000 --max-requests=N           limit for total number of requests [10000] #请求的最大数目。

    默觉得10000。0代表不限制。 --max-requests=N           limit for total number of requests [10000] #请求的最大数目。默觉得10000,0代表不限制。

    --num-threads=N            number of threads to use [1] #创建測试线程的数目。默觉得1. --mysql-host=[LIST,...]       MySQL server host [localhost] --mysql-port=N                MySQL server port [3306] --mysql-password=STRING       MySQL password [] --mysql-db=STRING             MySQL database name [sbtest] --mysql-socket=STRING         MySQL socket


     
    測试结果:

                                       未使用TCMalloc

    OLTP test statistics:
        queries performed:
            read:                            140112
            write:                           50019
            other:                           20008
            total:                           210139
        transactions:                        10000  (756.11 per sec.)
        deadlocks:                           8      (0.60 per sec.)
        read/write requests:                 190131 (14376.02 per sec.)
        other operations:                    20008  (1512.83 per sec.)

    Test execution summary:
        total time:                          13.2256s
        total number of events:              10000
        total time taken by event execution: 211.4342
        per-request statistics:
             min:                                  2.96ms
             avg:                                 21.14ms
             max:                                423.52ms
             approx.  95 percentile:     56.25ms

                                    使用TCMalloc

    OLTP test statistics:
        queries performed:
            read:                            140084
            write:                           50017
            other:                           20006
            total:                           210107
        transactions:                        10000  (862.83 per sec.)
        deadlocks:                           6      (0.52 per sec.)
        read/write requests:                 190101 (16402.39 per sec.)
        other operations:                    20006  (1726.17 per sec.)

    Test execution summary:
        total time:                          11.5898s
        total number of events:              10000
        total time taken by event execution: 185.2397
        per-request statistics:
             min:                                  2.81ms
             avg:                                 18.52ms
             max:                                430.03ms
             approx.  95 percentile:              36.49ms


          能够看到使用TCMalloc性能明显优于未使用,这里主要原因是mysql是多线程小内存分配,TCMalloc因为每一个线程均有线程缓冲区,所以对这种小对象分配无竞争,效率很好,能够看到TCMalloc对MYSQL优化效果不错 ,建议使用。

     

    -

    Echo Chen:Blog.csdn.net/chen19870707

    -

  • posted on 2017-06-29 17:02  ljbguanli  阅读(685)  评论(0编辑  收藏  举报