`
钟增生
  • 浏览: 31235 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

google-perftools TCMalloc 安装手册

阅读更多


  TCMallocThread-Caching Malloc)是google开发的开源工具──google-perftools中的成员。与标准的glibc库的malloc相比,TCMalloc在内存的分配上效率和速度要高得多,可以在很大程度上提高MySQL服务器在高并发情况下的性能,降低系统负载。

  TCMalloc的实现原理和测试报告请见一篇文章:《TCMalloc:线程缓存的Malloc

  为MySQL添加TCMalloc库的安装步骤(Linux环境):

  164位操作系统请先安装libunwind库,32位操作系统不要安装。libunwind库为基于64CPU和操作系统的程序提供了基本的堆栈辗转开解功能,其中包括用于输出堆栈跟踪的API、用于以编程方式辗转开解堆栈的API以及支持C++异常处理机制的API

wget http://download.savannah.gnu.org/releases/libunwind/libunwind-0.99-alpha.tar.gz
tar zxvf libunwind-0.99-alpha.tar.gz
cd libunwind-0.99-alpha/
CFLAGS=-fPIC ./configure
make CFLAGS=-fPIC
make CFLAGS=-fPIC install



  2、安装google-perftools

wget http://google-perftools.googlecode.com/files/google-perftools-0.97.tar.gz
tar zxvf google-perftools-0.97.tar.gz
cd google-perftools-0.97/
./configure
make && make install

echo "/usr/local/lib" > /etc/ld.so.conf.d/usr_local_lib.conf
/sbin/ldconfig



  3、修改MySQL启动脚本(根据你的MySQL安装位置而定):

vi /usr/local/mysql/bin/mysqld_safe


  在# executing mysqld_safe的下一行,加上:

引用

export LD_PRELOAD=/usr/local/lib/libtcmalloc.so


  保存后退出,然后重启MySQL服务器。


  4、使用lsof命令查看tcmalloc是否起效:

/usr/sbin/lsof -n | grep tcmalloc


  如果发现以下信息,说明tcmalloc已经起效:
  mysqld    10847   mysql  mem       REG        8,5  1203756   20484960 /usr/local/lib/libtcmalloc.so.0.0.0   



  注:200862日,修正了libunwindx86_64位操作系统下的编译错误,TCMalloc无法加载等问题。

  涉及修改内容:
  1libunwind的编译参数改为:
  CFLAGS=-fPIC ./configure
  make CFLAGS=-fPIC
  make CFLAGS=-fPIC install

  2、增加:
  echo "/usr/local/lib" > /etc/ld.so.conf.d/usr_local_lib.conf
  /sbin/ldconfig

  3、修改MySQL加载TCMalloc的语句:
  export LD_PRELOAD=/usr/local/lib/libtcmalloc.so

  感谢网友router

[ 2008-5-31 09:53 | by 张宴 ]

  [文章作者:张宴 本文版本:v1.1 最后修改:2008.06.02 转载请注明出自:http://blog.s135.com]

 

  TCMallocThread-Caching Malloc)是google开发的开源工具──“google-perftools”中的成员。与标准的glibc库的malloc相比,TCMalloc在内存的分配上效率和速度要高得多,可以在很大程度上提高MySQL服务器在高并发情况下的性能,降低系统负载。

 

  TCMalloc的实现原理和测试报告请见一篇文章:《TCMalloc:线程缓存的Malloc

 

  为MySQL添加TCMalloc库的安装步骤(Linux环境):

 

  164位操作系统请先安装libunwind库,32位操作系统不要安装。libunwind库为基于64CPU和操作系统的程序提供了基本的堆栈辗转开解功能,其中包括用于输出堆栈跟踪的API、用于以编程方式辗转开解堆栈的API以及支持C++异常处理机制的API

wget http://download.savannah.gnu.org/releases/libunwind/libunwind-0.99-alpha.tar.gz

tar zxvf libunwind-0.99-alpha.tar.gz

cd libunwind-0.99-alpha/

CFLAGS=-fPIC ./configure

make CFLAGS=-fPIC

make CFLAGS=-fPIC install

 

 

  2、安装google-perftools

wget http://google-perftools.googlecode.com/files/google-perftools-0.97.tar.gz

tar zxvf google-perftools-0.97.tar.gz

cd google-perftools-0.97/

./configure

make && make install

 

echo "/usr/local/lib" > /etc/ld.so.conf.d/usr_local_lib.conf

/sbin/ldconfig

 

 

  3、修改MySQL启动脚本(根据你的MySQL安装位置而定):

vi /usr/local/mysql/bin/mysqld_safe

 

  在# executing mysqld_safe的下一行,加上:

引用

export LD_PRELOAD=/usr/local/lib/libtcmalloc.so

 

  保存后退出,然后重启MySQL服务器。

 

 

  4、使用lsof命令查看tcmalloc是否起效:

/usr/sbin/lsof -n | grep tcmalloc

 

  如果发现以下信息,说明tcmalloc已经起效:

  mysqld    10847   mysql  mem       REG        8,5  1203756   20484960 /usr/local/lib/libtcmalloc.so.0.0.0  

 

 

  注:200862日,修正了libunwindx86_64位操作系统下的编译错误,TCMalloc无法加载等问题。

 

  涉及修改内容:

  1libunwind的编译参数改为:

  CFLAGS=-fPIC ./configure

  make CFLAGS=-fPIC

  make CFLAGS=-fPIC install

 

  2、增加:

  echo "/usr/local/lib" > /etc/ld.so.conf.d/usr_local_lib.conf

  /sbin/ldconfig

 

  3、修改MySQL加载TCMalloc的语句:

  export LD_PRELOAD=/usr/local/lib/libtcmalloc.so

 

  感谢网友router

 

 

 

 

Tags: linux , mysql , google , tcmalloc

 技术大类 » 数据库技术 | 评论(33) | 引用(0) | 阅读(27579)

router 2008-5-31 23:45

make 报错啊,老大,怎么办?

 

gcc: unrecognized option `-static-libcxa'

/usr/bin/ld: dwarf/.libs/Lfind_proc_info-lsb.o: relocation R_X86_64_PC32 against `_ULx86_64_dwarf_search_unwind_table' can not be used when making a shared object; recompile with -fPIC

/usr/bin/ld: final link failed: Bad value

collect2: ld returned 1 exit status

make[2]: *** [libunwind.la] Error 1

make[2]: Leaving directory `/usr/local/src/libunwind-0.99-alpha/src'

make[1]: *** [all] Error 2

make[1]: Leaving directory `/usr/local/src/libunwind-0.99-alpha/src'

make: *** [all-recursive] Error 1

张宴 回复于 2008-6-1 16:40

32位操作系统不要安装libunwind库,直接安装google-perftools即可。

router 2008-6-1 18:37

我是64位系统啊

router 2008-6-1 21:13

解决了64libunwind编译不成功的问题

加上

CFLAGS=-fPIC ./configure

make CFLAGS=-fPIC

make CFLAGS=-fPIC install

 

就可以了

router 2008-6-1 21:17

新问题:

加入export LD_PRELOAD = "/usr/local/lib/libtcmalloc.so" 后启动mysql

/bin/sh /usr/local/webserver/mysql/bin/mysqld_safe --defaults-file=/usr/local/webserver/mysql/my.cnf &

 

报错

 

/usr/local/webserver/mysql/bin/mysqld_safe: line 12: export: `=': not a valid identifier

/usr/local/webserver/mysql/bin/mysqld_safe: line 12: export: `/usr/local/lib/libtcmalloc.so': not a valid identifier

Starting mysqld daemon with databases from /usr/local/webserver/mysql/data

router 2008-6-1 21:27

export LD_PRELOAD = "/usr/local/lib/libtcmalloc.so"更改为LD_PRELOAD = "/usr/local/lib/libtcmalloc.so"

 

则提示

LD_PRELOAD: command not found

 

mysql版本为5.0.22

老大帮忙解决下啊

router 2008-6-1 21:39

把启动的问题解决了,如下:

 

# 修改 mysql 啟動, 讓他使用 TCMalloc

# 修改 387 , 於此行最前面加入 LD_PRELOAD="/usr/lib/libtcmalloc.so"( mysql 啟動前先載入環境變數(mysql 啟動的 script 就是 /usr/bin/mysqld_safe), tcmalloc = glibc malloc(), 於最前面加入環境變數即可)

387 行就是 mysql start 的那行命令, 此行修改完成如下:

 

   LD_PRELOAD="/usr/lib/libtcmalloc.so" $NOHUP_NICENESS $ledir/$MYSQLD $defaults --basedir=$MY_BASEDIR_VERSION --datadir=$DATADIR $USER_OPTION --pid-file    =$pid_file --skip-external-locking 2>&1 | $ERR_LOGGER -t mysqld & wait

 

但新问题又来了

使用lsof命令查看tcmalloc是否起效:

/usr/sbin/lsof -n | grep tcmalloc

没有发现tcmalloc

router 2008-6-2 00:24

哎,忙活了一晚上,还是不行

 

试着编译mysql

./configure --prefix=/usr/local/webserver/mysql/ --without-debug --with-unix-socket-path=/tmp/mysql.sock --with-client-ldflags=-all-static --with-mysqld-ldflags="-all-static -ltcmalloc" --enable-assembler --with-extra-charsets=gbk,gb2312,utf8 --with-pthread --enable-thread-safe-client

 

make提示

/lib/libtcmalloc.a(stacktrace.o)(.text+0xdf): In function `GetStackTrace(void**, int, int)':

src/stacktrace_libunwind-inl.h:65: undefined reference to `_ULx86_64_init_local'

/usr/local/lib/libtcmalloc.a(stacktrace.o)(.text+0x103):src/stacktrace_libunwind-inl.h:70: undefined reference to `_ULx86_64_get_reg'

/usr/local/lib/libtcmalloc.a(stacktrace.o)(.text+0x115):src/stacktrace_libunwind-inl.h:78: undefined reference to `_ULx86_64_step'

/usr/local/lib/libtcmalloc.a(stacktrace.o)(.text+0x28f): In function `GetStackFrames(void**, int*, int, int)':

src/stacktrace_libunwind-inl.h:126: undefined reference to `_ULx86_64_init_local'

/usr/local/lib/libtcmalloc.a(stacktrace.o)(.text+0x2a4):src/stacktrace_libunwind-inl.h:130: undefined reference to `_ULx86_64_step'

/usr/local/lib/libtcmalloc.a(stacktrace.o)(.text+0x2be):src/stacktrace_libunwind-inl.h:130: undefined reference to `_ULx86_64_get_reg'

/usr/local/lib/libtcmalloc.a(stacktrace.o)(.text+0x2e8):src/stacktrace_libunwind-inl.h:137: undefined reference to `_ULx86_64_get_reg'

/usr/local/lib/libtcmalloc.a(stacktrace.o)(.text+0x2f4):src/stacktrace_libunwind-inl.h:139: undefined reference to `_ULx86_64_step'

/usr/local/lib/libtcmalloc.a(stacktrace.o)(.text+0x30e):src/stacktrace_libunwind-inl.h:139: undefined reference to `_ULx86_64_get_reg'

 

重新写参数

CFLAGS=-fPIC LDFLAGS="-lunwind -lunwind-ULx86_64" ./configure........

make LDFLAGS="-lunwind -lunwind-ULx86_64" CFLAGS=-fPIC

提示

/usr/bin/ld: cannot find -lunwind-ULx86_64

于是

ln -s /usr/local/lib/libunwind-x86_64.so.7.0.0 /usr/local/lib/libunwind-ULx86_64.so

还是提示/usr/bin/ld: cannot find -lunwind-ULx86_64

 

估计是google这个工具CPU参数是x86_64而我服务器参数是ULx86_64造成的这个bug

崩溃了!老大救命啊!

张宴 回复于 2008-6-2 11:36

启动MySQL之前:

echo "/usr/local/lib" > /etc/ld.so.conf.d/usr_local_lib.conf

/sbin/ldconfig

 

本文已修正。

router 2008-6-2 11:54

老大,mysql采用的静态编译with-mysqld-ldflags=-all-static

是不是不能使用外挂方式哦?

LD_PRELOAD=/usr/local/lib/libtcmalloc.so

能否告知我您的gtalk QQ 或者msn等联系方式,我想请教下,我的email gtalk : keaideala@gmail.com

jack 2008-6-2 14:09

应该是采用了with-mysqld-ldflags=-all-static 就不行!我也遇到同样问题!

router 2008-6-2 17:18

请问张老师,我本来想用编译到mysql的方式使用TCMalloc,但无法编译成功mysql,报错undefined reference to `_ULx86_64_init_local'

然后我在make加上参数make LDFLAGS="-lunwind -lunwind-ULx86_64" CFLAGS=-fPIC

报错/usr/bin/ld: cannot find -lunwind-ULx86_64lib里面没有unwind-ULx86_64.so类似的文件,只有unwind-x86_64,我打算放弃编译,采用外挂的方式使用TCMalloc,但以前的mysql采用的with-mysqld-ldflags=-all-static 方式编译,不支持外挂,请问应该怎么重新编译mysql才能支持外挂

router 2008-6-3 00:18

编译不成功

但外挂搞好了

sh        29861    root  mem       REG              253,0   1598671    7646979 /usr/local/lib/libtcmalloc.so.0.0.0

mysqld    29882   mysql  mem       REG              253,0   1598671    7646979 /usr/local/lib/libtcmalloc.so.0.0.0

lsof      29913    root  mem       REG              253,0   1598671    7646979 /usr/local/lib/libtcmalloc.so.0.0.0

grep      29914    root  mem       REG              253,0   1598671    7646979 /usr/local/lib/libtcmalloc.so.0.0.0

lsof      29915    root  mem       REG              253,0   1598671    7646979 /usr/local/lib/libtcmalloc.so.0.0.0

 

具体步骤和张老师的一模一样,只是重新编译了mysql

取消掉静态链接。

odinxu 2008-6-5 00:27

终于也安装成功了,和 router 说的一样,

需要重新编译一次MYSQL

configure时要去掉这一个参数 with-mysqld-ldflags=-all-static

我的环境:CentOS 4.6 32bit,不需要安装libunwind库。

freeke  2008-6-5 13:09

有没有不需要重新编译的办法,对于运营系统不能随便动啊!

freeke   2008-6-5 13:11

有没有不需要重新编译MYSQL的办法呢?因为运营系统哪能随便重新编译程序呢?

张宴 回复于 2008-6-5 14:19

原有MySQL不停止,重新编译MySQL,到make && make install完成,不会影响到原有服务。重启MySQL,新编译的配置生效。

 

为安全起见,你也可以将新的MySQL程序编译安装到不同的路径,启动时数据库文件存放路径指定以前的位置即可。

freeke  2008-6-5 13:12

请教博主帮忙!

xooass   2008-6-11 17:55

我完全按上面写的操作修改后重启了也没发现启用这个库,我的mysql是用官方提供的RPM包安装的,可能也是全静态编译了的版本。

freeke   2008-6-12 12:24

我按照张兄的方法重新编译了也没有看到那个tcmalloc!不知道什么原因!

 

MYSQL下载的不用安装的源码不知道是否可以? 还有rpm包如何解决呢?

phpsir 2008-6-13 12:00

--with-mysqld-ldflags="-all-static -ltcmalloc -lstacktrace"

 

这个是否可以启用 tcmalloc 呢,lsof 里面没有发现,难道静态编译不进去吗?

 

QQ  733905

freeke  2008-8-4 12:58

--with-mysqld-ldflags="-all-static -ltcmalloc -lstacktrace"

 

-lstacktrace 参数添加后会报错,说找不到stacktrace,但去掉这个-lstacktrace参数重新编译是可以成功的,但在执行下面的命令时:

 

[root@Chinarenservice oracle]# lsof -n | grep tcmalloc           

[root@Chinarenservice oracle]#

 

什么也没有发现!说明不成功!

mcz 2008-8-30 23:52

tcmalloc,我已经装上了,lsof也能看到

请问张老师,mysql使用该插件和不使用该插件,您有性能测试数据对比么?

分享到:
评论
1 楼 javacty 2012-11-14  
u12下/etc/init/mysql启动脚本好像不是调用mysqld_safe脚本启动mysql的,尝试各种修改1sudo lsof -n |grep tcmalloc查看都没效果?

OEL6下倒是正常!

相关推荐

    google-perftools下载

    在实际应用中,下载并安装Google Perftools的1.8版本,可以通过编译选项链接到Nginx,让其使用TCMalloc。同时,我们还可以在Nginx运行时开启CPU Profiler和Heap Profiler,收集性能数据,然后使用Perftools提供的...

    google-perftools-1.8.2.tar.gz

    `google-perftools`包含两个主要组件:`tcmalloc`和`pprof`。 1. `tcmalloc`(Thread-Caching Malloc):这是一个高效的内存分配器,通过线程缓存机制,减少了内存分配和释放时的系统调用开销。它还提供了内存泄漏...

    谷歌的google-perftools-1.7.zip

    在使用`google-perftools`时,你需要先将其编译并安装到系统中。编译过程通常包括配置、编译和安装三个步骤。在Linux环境下,可以使用`./configure`,`make`和`sudo make install`命令来完成。安装后,你可以通过`...

    google-perftools-1.6.tar.gz

    在Linux环境下,可以使用包管理器或者源码编译的方式安装google-perftools-1.6。配置时,确保链接了必要的库,并在编译目标程序时启用gperftools的支持。 3. **pprof的使用** - **CPU Profiling**:运行程序时...

    google-perftools-1.8.3-1.el6.x86_64.rpm

    google-perftools-1.8.3-1.el6.x86_64.rpm

    google-perftools.rar

    Google Perftools是一款由Google开发的性能分析和内存管理工具包,主要包含tcmalloc(Thread-Caching Malloc)和CPU、内存等性能剖析器。tcmalloc是一种高效的内存分配器,它通过优化内存分配和回收过程来提高系统...

    google-perftools 源码 (一款针对 C/C++ 程序的性能分析工具)

    google-perftools 简介 google-perftools 是一款针对 C/C++ 程序的性能分析工具,它是一个遵守 BSD 协议的开源项目。使用该工具可以对 CPU 时间片、内存等系统资源的分配和使用进行分析,本文将重点介绍如何进行 CPU...

    使用google-perftools优化nginx在高并发时的性能的教程(完整版)

    google-perftools是一款由Google开发的性能分析和内存调试工具,它包括了多个模块,如tcmalloc(一种高效的内存分配器)和cpuprofile(用于CPU性能分析)。在高并发场景下,通过替换Nginx默认的内存分配机制,使用...

    devtoolset-10-perftools-10.0-0.el7.x86_64.rpm

    离线安装包,亲测可用

    google-perftools-开源

    在文件列表中,"google-perftools-0.8"可能表示的是该工具的一个特定版本,包含了编译后的库文件、头文件以及相关的文档和示例。用户可以通过这些文件在自己的项目中集成和使用Google Perftools,或者对其进行编译以...

    rabbitmq-perf-test-2.7.0-bin.tar.gz

    "rabbitmq-perf-test-2.7.0-bin.tar.gz" 是一个针对RabbitMQ性能测试的工具包,版本为2.7.0,用户可以直接下载并解压使用,无需进行复杂的安装过程。 该工具的主要功能是对RabbitMQ服务器进行性能测试,评估其在高...

    rack-perftools_profiler, 使用 perftools.rb 配置 rack 兼容应用程序的中间件.zip

    rack-perftools_profiler, 使用 perftools.rb 配置 rack 兼容应用程序的中间件 Rack::PerftoolsProfiler使用 perftools.rb 配置机架兼容应用的中间件快速启动假定应用程序使用 Rails 3 ( 你已经在下一节中安装了需求...

    python-perf-3.10.0-1160.6.1.el7.x86_64.rpm

    官方离线安装包,亲测可用。使用rpm -ivh [rpm完整包名] 进行安装

    spark-perf

    【Spark-Perf:Spark流处理性能基准测试】 Spark-Perf是一个专注于评估Apache Spark流处理(Spark Streaming)性能的工具。它为开发者、研究人员和系统管理员提供了基准测试的框架,帮助他们理解Spark Streaming在...

    gcc-toolset-11-perftools-11.0-1.el8.aarch64.rpm

    离线安装包,亲测可用

    python-perf-3.10.0-1160.2.1.el7.centos.plus.x86_64.rpm

    python-perf-3.10.0-1160.2.1.el7.centos.plus.x86_64

    gcc-toolset-10-perftools-10.1-0.el8.aarch64.rpm

    离线安装包,亲测可用

    vue-perf-devtool.zip

    vue性能检查工具, ubuntu系统下的手动编译版本,适用于离线安装. 安装方法: 1. 解压本文件 2. 打开chrome, 进入extension 页面, 选择 unpack 安装方式, 选择解压的文件夹中的shells目录下的chrome文件夹

Global site tag (gtag.js) - Google Analytics