- 論壇徽章:
- 0
|
Xeon 55xx是Intel最新的Nehalem架構(gòu)處理器,為了充分挖掘它的處理能力,我們做了很多的測試來嘗試一些GCC的編譯參數(shù),如何獲得更高的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的文檔可以看到全部的優(yōu)化選項:[<a href="http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html">點我查看</a>]。
經(jīng)過嘗試,得到了如下編譯參數(shù),經(jīng)過兩周的壓力測試,編譯MySQL 5.1.46sp1企業(yè)版,比Percona 5.1.47 Server性能高出15%,目前也非常穩(wěn)定的運行在開發(fā)測試庫上。GCC版本為4.1.3,系統(tǒng)為RHEL 5.4 x64.
<blockquote>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</blockquote>
GCC參數(shù)的含義為:
-fomit-frame-pointer
對于不需要棧指針的函數(shù)就不在寄存器中保存指針,因此可以忽略存儲和檢索地址的代碼,同時對許多函數(shù)提供一個額外的寄存器。所有"-O"級別都打開它,但僅在調(diào)試器可以不依靠棧指針運行時才有效。在AMD64平臺上此選項默認(rèn)打開,但是在x86平臺上則默認(rèn)關(guān)閉。建議顯式的設(shè)置它。
-pipe
在編譯過程的不同階段之間使用管道而非臨時文件進行通信,可以加快編譯速度。建議使用。
-march=nocona
Xoen 55xx處理器在GCC 4.1.3
-mfpmath=sse
啟用cpu支持"sse"標(biāo)量浮點指令。
m128bit-long-double
指定long double為128位,pentium以上的cpu更喜歡這種標(biāo)準(zhǔn),并且符合x86-64的ABI標(biāo)準(zhǔn),但是卻不附合i386的ABI標(biāo)準(zhǔn)。
-mmmx -msse -msse2
使用相應(yīng)的擴展指令集以及內(nèi)置函數(shù)
-maccumulate-outgoing-args
指定在函數(shù)引導(dǎo)段中計算輸出參數(shù)所需最大空間,這在大部分現(xiàn)代cpu中是較快的方法;缺點是會明顯增加二進制文件尺寸。
-m64
生成專門運行于64位環(huán)境的代碼,不能運行于32位環(huán)境,僅用于x86_64[含EMT64]環(huán)境。
-ftree-loop-linear
在trees上進行線型循環(huán)轉(zhuǎn)換。它能夠改進緩沖性能并且允許進行更進一步的循環(huán)優(yōu)化。
-fprefetch-loop-arrays
生成數(shù)組預(yù)讀取指令,對于使用巨大數(shù)組的程序可以加快代碼執(zhí)行速度,適合數(shù)據(jù)庫相關(guān)的大型軟件等。具體效果如何取決于代碼。
-freg-struct-return
如果struct和union足夠小就通過寄存器返回,這將提高較小結(jié)構(gòu)的效率。如果不夠小,無法容納在一個寄存器中,將使用內(nèi)存返回。建議僅在完全使用GCC編譯的系統(tǒng)上才使用。
-fgcse-sm
在全局公共子表達(dá)式消除之后運行存儲移動,以試圖將存儲移出循環(huán)。
-fgcse-las
在全局公共子表達(dá)式消除之后消除多余的在存儲到同一存儲區(qū)域之后的加載操作。
-frename-registers
-fforce-addr
必須將地址復(fù)制到寄存器中才能對他們進行運算。由于所需地址通常在前面已經(jīng)加載到寄存器中了,所以這個選項可以改進代碼。
-fivopts
在trees上執(zhí)行歸納變量優(yōu)化。
-ftree-vectorize
在trees上執(zhí)行循環(huán)向量化。
-ftracer
執(zhí)行尾部復(fù)制以擴大超級塊的尺寸,它簡化了函數(shù)控制流,從而允許其它的優(yōu)化措施做的更好。
-frename-registers
試圖驅(qū)除代碼中的假依賴關(guān)系,這個選項對具有大量寄存器的機器很有效。
-minline-all-stringops
默認(rèn)時GCC只將確定目的地會被對齊在至少4字節(jié)邊界的字符串操作內(nèi)聯(lián)進程序代碼。該選項啟用更多的內(nèi)聯(lián)并且增加二進制文件的體積,但是可以提升依賴于高速 memcpy, strlen, memset 操作的程序的性能。數(shù)據(jù)庫系統(tǒng)使用這個參數(shù)可以顯著提高內(nèi)存操作性能。
-fbranch-target-load-optimize2
在執(zhí)行序啟動以及結(jié)尾之前執(zhí)行分支目標(biāo)緩存器加載最佳化。 |
|