一、 选择编译参数
编译mysql需要设置两种编译参数:GCC/ICC的编译参数,mysql的编译参数。编译参数是控制编译器的优化动作,MYSQL编译参数是控制mysql功能模块的处理动作。
注:GCC是GNU推出的功能强大、性能优越的多平台编译器。gcc是可以在多种硬体平台上编译出可执行程序的超级编译器。Gcc编译器能将C、C++语言源程序、汇程式化序和目标程序编译、连接成可执行文件,如果没有给出可执行文件的名字,gcc将生成一个名为a.out的文件。在Linux系统中,可执行文件没有统一的后缀,系统从文件的属性来区分可执行文件和不可执行文件。而gcc则通过后缀来区别输入文件的类别ICC是Intel自家的编译器,号称X86上最好的编译器一般用于一些对性能要求极高的领域,比如内核、游戏等等。缺点是文档不多,尤其是中文的,不是很流行,有一定的门槛。先查看cpu支持哪些flags,如下图:
shell界面,编译自己所需参数,也可将flags写入Makefile文件中。root@alex:/opt/src/mysql-5.0.40# CXX=gcc CHOST="x86_64-pc-linux-gnu" CFLAGS=" -O3 -msse -msse2 -maccumulate-outgoing-args -ftree-loop-linear -fprefetch-loop-arrays -freg-struct-return -fgcse-sm -fgcse-las -frename-registers -fforce-addr -fivopts -ftree-vectorize -ftracer -frename-registers -minline-all-stringops -fbranch-target-load-optimize2" CXXFLAGS="${CFLAGS}" ./configure --prefix=/usr/soft/install/mysql-ent-official-5.1.56 --with-server-suffix=custom-mysql --with-mysqld-user=mysql --with-plugins=partition,blackhole,csv,heap,innobase,myisam,myisammrg --with-charset=utf8 --with-collation=utf8_general_ci --with-extra-charsets=gbk,gb2312,utf8,ascii --with-big-tables --with-fast-mutexes --with-zlib-dir=bundled --enable-assembler --enable-profiling --enable-local-infile --enable-thread-safe-client --with-readline --with-pthread --with-embedded-server --with-client-ldflags=-all-static --with-mysqld-ldflags=-all-static --without-query-cache --without-geometry --without-debug --without-ndb-debug注:./configure 要在编译包中执行,其他设置环境变量可在任意处。其他—with参数请查看./configure --help注:GCC参数的含义:
fomit-frame-pointer |
对于不需要栈指针的函数就不在寄存器中保存指针,因此可以忽略存储和检索地址的代码,同时对许多函数提供一个额外的寄存器。在AMD64平台上此选项默认打开,但是在x86平台上默认关闭。建议设置它。 |
pipe |
可以加快编译速度。建议使用。 |
mfpmath=sse |
启用cpu支持”sse”标量浮点指令。 |
m128bit-long-double |
指定long double为128位,pentium以上的cpu更喜欢这种标准,并且符合x86-64的ABI标准,但是不附合i386的ABI标准。 |
mmmx /msse /msse2 |
使用相应的扩展指令集以及内置函数 |
maccumulate-outgoing-args |
计算输出参数所需最大空间;缺点是会明显增加二进制文件尺寸。 |
m64\m32注:需要自行查看设备 uname –r或者file /sbin/init i***基本属于32位;x86-64属于64位 |
生成专门运行于64\32位环境的代码。 |
ftree-loop-linear |
在trees上进行线型循环转换。改进缓冲性能并且允许进行更进一步的循环优化。 |
fprefetch-loop-arrays |
生成数组预读取指令,对于使用巨大数组的程序可以加快代码执行速度,适合数据库相关的大型软件等。具体效果如何取决于代码。 |
freg-struct-return |
如果struct和union足够小就通过寄存器返回,这将提高较小结构的效率。 |
fgcse-sm |
在全局公共子表达式消除之后运行存储移动,以试图将存储移出循环。 |
fgcse-las |
在全局公共子表达式消除之后消除多余的在存储到同一存储区域之后的加载操作。 |
frename-registers \ fforce-addr |
将地址复制到寄存器中才能对他们进行运算。 |
fivopts |
在trees上执行归纳变量优化。 |
ftree-vectorize |
在trees上执行循环向量化。 |
ftracer |
执行尾部复制以扩大超级块的尺寸,它简化了函数控制流,从而允许其它的优化措施做的更好。 |
frename-registers |
试图驱除代码中的假依赖关系,这个选项对具有大量寄存器的机器很有效。 |
minline-all-stringops |
增加二进制文件的体积,但是可以提升依赖于高速 memcpy, strlen, memset 操作的程序的性能。数据库系统使用这个参数可以显著提高内存操作性能。 |
fbranch-target-load-optimize2 |
在执行序启动以及结尾之前执行分支目标缓存器加载最佳化。 |
编译器的优化选项的4个级别:O0/O1/O2/O3;-O0表示没有优化,-O1为缺省值,-O2为安全启动,-O3优化级别最高。一般情况下 –O2启动绝大多数安全选项,-O3在-O2基础上,手工添加几项。在服务器中,建议用-O2,已经最安全、稳定,桌面建议使用-O3。 二、 使用TC-Malloc内存管理:利用内存池来改进内存分配效率。Google开源的tcmalloc则改进了malloc的一些效率问题,在大量malloc和free时,操作系统的内存曲线明显比Linux下malloc函数要平稳,在大并发情况下,提升程序稳定性和性能。一般网上都是把tcmalloc动态库加到mysqld_safe中启动,但是我们的MySQL都是静态编译的,所以还是静态编译入MySQL好。编译tcmalloc先要编译libunwindlibunwind: wget root@alex:/opt/src# tar zxvf libunwind-0.99.tar.gzroot@alex:/opt/src# cd libunwind-0.99root@alex:/opt/src/libunwind-0.99# CHOST="x86_64-pc-linux-gnu" CFLAGS="-O3 -fPIC -fomit-frame-pointer -pipe -march=nocona -mfpmath=sse -m128bit-long-double -mmmx -msse -msse2 -maccumulate-outgoing-args -ftree-loop-linear -fprefetch-loop-arrays -freg-struct-return -fgcse-sm -fgcse-las -frename-registers -fforce-addr -fivopts -ftree-vectorize -ftracer -frename-registers -minline-all-stringops -fbranch-target-load-optimize2" CXXFLAGS="${CFLAGS}" ./configure && make && make install 编译tcmalloc:root@alex:/opt/src# wget root@alex:/opt/src# tar zxvf google-perftools-1.7.tar.gzroot@alex:/opt/src# cd google-perftools-1.7 CHOST="x86_64-pc-linux-gnu" CFLAGS=" -O3 -fomit-frame-pointer -pipe -march=nocona -mfpmath=sse -m128bit-long-double -mmmx -msse -msse2 -maccumulate-outgoing-args -ftree-loop-linear -fprefetch-loop-arrays -freg-struct-return -fgcse-sm -fgcse-las -frename-registers -fforce-addr -fivopts -ftree-vectorize -ftracer -frename-registers -minline-all-stringops -fbranch-target-load-optimize2" CXXFLAGS=”${CFLAGS}” ./configure -disable-cpu-profiler -disable-heap-profiler -disable-heap-checker -disable-debugalloc -enable-minimal -enable-frame-pointers && make && make installroot@alex:/opt/src/google-perftools-1.7# echo “/usr/local/lib” > /etc/ld.so.conf.d/usr_local_lib.conf
root@alex:/opt/src/google-perftools-1.7# /sbin/ldconfig 编译mysql:root@alex:/opt/src/mysql-5.0.40# CXX=gcc CHOST="x86_64-pc-linux-gnu" CFLAGS="-O2" ./configure --prefix=/usr/local/mysql --with-mysqld-user=mysql --with-plugins=partition,blackhole,csv,heap,innobase,myisam,myisammrg --with-big-tables --with-zlib-dir=bundled --enable-assembler --enable-local-infile --enable-thread-safe-client --with-readline --with-embedded-server --without-query-cache --without-debugroot@alex:/opt/src/mysql-5.0.40# makeroot@alex:/opt/src/mysql-5.0.40# make installroot@alex:/opt/src/mysql-5.0.40# cd /usr/local/mysql/binroot@alex:/usr/local/mysql/bin# ./mysql_install_db --user=mysql \\初始化数据库root@alex:/usr/local/mysql/bin# cp ../share/mysql/mysql.server /etc/init.d/mysqld \\拷贝启动项到init.droot@alex:/usr/local/mysql/bin# ./mysql –u root
ICC编译ICC没有免费的 所以要像intel公司申请试用30天。编译安装libunwindroot@alex:/opt/src# wget root@alex:/opt/src# tar zxvf libunwind-0.99.tar.gzroot@alex:/opt/src# cd libunwind-0.99root@alex:/opt/src/libunwind-0.99#
阅读(1937) | 评论(0) | 转发(0) |