适合MySQL的Xeon 55XX系列CPU编译参数

日期: 2010-08-29 作者:P.Linux 来源:TechTarget中国 英文

  Xeon 55xx是Intel最新的Nehalem架构处理器,为了充分挖掘它的处理能力,我们做了很多的测试来尝试一些GCC的编译参数,如何获得更高的MySQL性能。

  首先看处理器支持哪些flags:

  processor : 15
  vendor_id : GenuineIntel
  cpu family : 6
  model : 26
  model name : Intel(R) Xeon(R) CPU E5520 @ 2.27GHz
  stepping : 5
  cpu MHz : 2261.088
  cache size : 8192 KB
  physical id : 0
  siblings : 8
  core id : 3
  cpu cores : 4
  apicid : 7
  fpu : yes
  fpu_exception : yes
  cpuid level : 11
  wp : yes
  flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm syscall nx rdtscp lm constant_tsc ida pni monitor ds_cpl vmx est tm2 cx16 xtpr popcnt lahf_lm
  bogomips : 4521.98
  clflush size : 64
  cache_alignment : 64
  address sizes : 40 bits physical, 48 bits virtual
  power management:

  从cupinfo的信息可以看出,支持sse/sse2/mmx这些GCC的flag,查看gcc的文档可以看到全部的优化选项:[点我查看]。

  经过尝试,得到了如下编译参数,经过两周的压力测试,编译MySQL 5.1.46sp1企业版,比Percona 5.1.47 Server性能高出15%,目前也非常稳定的运行在开发测试库上。GCC版本为4.1.3,系统为RHEL 5.4 x64.

  CXX=gcc 
  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 
  -m64 
  -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/alibaba/install/mysql-ent-official-5.1.56 
  –with-server-suffix=alibaba-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

  GCC参数的含义为:

  -fomit-frame-pointer

  对于不需要栈指针的函数就不在寄存器中保存指针,因此可以忽略存储和检索地址的代码,同时对许多函数提供一个额外的寄存器。所有”-O”级别都打开它,但仅在调试器可以不依靠栈指针运行时才有效。在AMD64平台上此选项默认打开,但是在x86平台上则默认关闭。建议显式的设置它。

  -pipe

  在编译过程的不同阶段之间使用管道而非临时文件进行通信,可以加快编译速度。建议使用。

  -march=nocona

  Xoen 55xx处理器在GCC 4.1.3

  -mfpmath=sse

  启用cpu支持”sse”标量浮点指令。

  m128bit-long-double

  指定long double为128位,pentium以上的cpu更喜欢这种标准,并且符合x86-64的ABI标准,但是却不附合i386的ABI标准。

  -mmmx -msse -msse2

  使用相应的扩展指令集以及内置函数

  -maccumulate-outgoing-args

  指定在函数引导段中计算输出参数所需最大空间,这在大部分现代cpu中是较快的方法;缺点是会明显增加二进制文件尺寸。

  -m64

  生成专门运行于64位环境的代码,不能运行于32位环境,仅用于x86_64[含EMT64]环境。

  -ftree-loop-linear

  在trees上进行线型循环转换。它能够改进缓冲性能并且允许进行更进一步的循环优化。

  -fprefetch-loop-arrays

  生成数组预读取指令,对于使用巨大数组的程序可以加快代码执行速度,适合数据库相关的大型软件等。具体效果如何取决于代码。

  -freg-struct-return

  如果struct和union足够小就通过寄存器返回,这将提高较小结构的效率。如果不够小,无法容纳在一个寄存器中,将使用内存返回。建议仅在完全使用GCC编译的系统上才使用。

  -fgcse-sm

  在全局公共子表达式消除之后运行存储移动,以试图将存储移出循环。

  -fgcse-las

  在全局公共子表达式消除之后消除多余的在存储到同一存储区域之后的加载操作。

  -frename-registers

  -fforce-addr

  必须将地址复制到寄存器中才能对他们进行运算。由于所需地址通常在前面已经加载到寄存器中了,所以这个选项可以改进代码。

  -fivopts

  在trees上执行归纳变量优化。

  -ftree-vectorize

  在trees上执行循环向量化。

  -ftracer

  执行尾部复制以扩大超级块的尺寸,它简化了函数控制流,从而允许其它的优化措施做的更好。

  -frename-registers

  试图驱除代码中的假依赖关系,这个选项对具有大量寄存器的机器很有效。

  -minline-all-stringops

  默认时GCC只将确定目的地会被对齐在至少4字节边界的字符串操作内联进程序代码。该选项启用更多的内联并且增加二进制文件的体积,但是可以提升依赖于高速 memcpy, strlen, memset 操作的程序的性能。数据库系统使用这个参数可以显著提高内存操作性能。

  -fbranch-target-load-optimize2

  在执行序启动以及结尾之前执行分支目标缓存器加载最佳化。

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

作者

P.Linux
P.Linux

相关推荐