《版权声明:本文为博主原创文章,未经博主允许不得转载》
本次利用SPECCPU2006测试工具来进行Intel CPU Xeon E7-**** v4的测试以及调优,计划在机器I840-G**测试。本次测试主要从硬件调优和操作系统调优两个方面进行。经过最终的测试,SPECint_rate_base和SPECfp_rate_base结果均超过Intel的预期。其中调优过程尤为重要,为后续继续的测试达下基础。下面记录中间的调优过程。
- SPECCPU2006简介
- SPECCPU2006安装和使用
- config文件以及运行脚本介绍
- 测试准备以及基准值测试
- 硬件调优过程
- OS调优过程
- 结果提交过程问题
- FAQ
- 自动化测试脚本
- Numa、memory interleaving、cgroup等相关内容学习
- 常用监控工具使用,最好写成自动化脚本时称log文件,可以用来观察。
- top、sar、vmstat、oprofile、重拾pcp功能等
一、SPECCPU2006简介
SPECCPU2006是SPEC组织(SPEC,Standard PerformanceEvaluation Corporation)推出的CPU评估软件。SPECCPU2006包括了CINT2006(整型)和C FP2006(浮点)两个子项目,前者用于测量和对比整数性能,而后者则用于测量和对比浮点性能。最终的批判指标(bench)主要有四个SPECCPUint_speed_2006、SPECCPUfp_speed_2006、SPECCPUint_rate2006、SPECCPUfp_rate2006。其中speed表示考虑的则是CPU的运行速度,即单个任务所需要的时间;rate表示吞吐率,即一定时间内完成的任务数量。作为Intel最看重的数据是SPECCPUint_rate2006和SPECfp_rate2006,这两个结果能够真正表达CPU和主板搭配下的实际性能。
SPECCPU测试中,测试系统的CPU、内存和编译器(SPEC CPU提供的是源代码,并且允许测试用户进行一定的编译优化)都会影响最终的测试性能,而I/O(磁盘)、网络、操作系统和图形子系统对于SPECCPU2006的影响非常的小。
由上可见,影响最终结果的主要是:硬件(CPU、内存)、编译器优化参数。但是,为了进一步提高最终的结果,操作系统可以进行一些调优来进一步提高结果。
SPECCPU2006包括12个整型、17个浮点测试的bench。具体可以参见如下表
CIN2006包含12个benchmark,其中9个利用C程序完成、3个利用C++完成。具体如下表所示:
C |
PERL Programming Language |
|
C |
Compression |
|
C |
C Compiler |
|
C |
Combinatorial Optimization |
|
C |
Artificial Intelligence: go |
|
C |
Search Gene Sequence |
|
C |
Artificial Intelligence: chess |
|
C |
Physics: Quantum Computing |
|
C |
Video Compression |
|
C++ |
Discrete Event Simulation |
|
C++ |
Path-finding Algorithms |
|
C++ |
XML Processing |
CFP2006包含17个benchmark,其中4个用C++,3个使用C,6个使用Fortran,4个混合使用C语言和Fortran语言。详细如下表所示:
Fortran |
Fluid Dynamics |
|
Fortran |
Quantum Chemistry |
|
C |
Physics: Quantum Chromodynamics |
|
Fortran |
Physics/CFD |
|
C/Fortran |
Biochemistry/Molecular Dynamics |
|
C/Fortran |
Physics/General Relativity |
|
Fortran |
Fluid Dynamics |
|
C++ |
Biology/Molecular Dynamics |
|
C++ |
Finite Element Analysis |
|
C++ |
Linear Programming, Optimization |
|
C++ |
Image Ray-tracing |
|
C/Fortran |
Structural Mechanics |
|
Fortran |
Computational Electromagnetics |
|
Fortran |
Quantum Chemistry |
|
C |
Fluid Dynamics |
|
C/Fortran |
Weather Prediction |
|
C |
Speech recognition |
二、SPECCPU2006安装和使用
2.1安装准备工作
安装此工具必须要在一定的操作系统情况下,speccpu支持windows、linux。本文主要安装国产操作系统NeoKylinV7.0Update2操作系统。同时,speccpu还需要一些额外的开发包及库才能正常的使用,因此需要安装一些额外的包。
由上介绍可知,SPECCPU2006给用户的是源码包,需要用户进行编译,因此需要安装合适的编译器进行编译。由于测试的CPU大部分是intel的,因此本文主要介绍intel公司的编译器icc、ifort的安装和使用。
2.1.1 操作系统安装
本次测试使用操作系统信息如下所示,使用NeoKylin V7Update2-b04
#cat /etc/.productinfo
[root@sky 桌面]# cat /etc/.productinfo
NeoKylin Linux Advanced Server
release V7Update2/(Potassium)-x86_64
b04.lic/20151230
[root@sky 桌面]# cat /etc/neokylin-release
NeoKylin Linux Advanced Server releaseV7Update2 (Potassium)
安装过程
选择最小化作为一个基准,用来进行后续的比较而用,其中各种缺的包可以临时安装即可。不过spec安装需要一些额外的static包,需要配置远程的yum源才能正常使用。
本次安装使用Lagency模式的最小化安装,标准化分区、关闭kdump服务。示例图像如下所示,选择其中的minimor install,不选择其他任何的额外包。
其中分区包括500MB的boot分区,4G的swap分区,500GB的根分区,且均采用xfs文件系统。
安装的方式有多种,本次测试主要两种:1.光盘安装;2.利用BMC虚拟机挂载功能挂载iso镜像文件进行远程安装。
硬件信息:
1.2TB raid0 两块硬盘;
2.4CPU 24cores/CPU
3.内存:64*16GB=8(内存板)*4(channel)*2(条)*16
2.1.2 安装必须的软件并关闭无用的服务
安装必须安装包
系统安装完成后,则安装必须的开发包或库包。根据以往经验,得到如下必须安装包列表
glibc、glibc.i686、glibc-devel、glibc-devel.i686、glibc-static、glibc-static.i686、gcc、libgcc、 libgcc.i686、gcc-c++.x86_64、compat-gcc*.x86_64、gcc-objc++*.x86_64、libstdc++、libstdc++*.i686、libstdc++-devel、libstdc++-devel*.i686、nss-softokn-freebl、nss-softokn-freebl-devel、 nss-softokn-freebl*.i686、nss-softokn-freebl-devel*.i686、numactl lsb
系统中默认yum配置就可以正常使用,因此利用yum install脚本完成安装,如下代码所示:
#!/usr/bin/sh
packagelist={glibc glibc.i686 glibc-develglibc-devel.i686 glibc-static glibc-static.i686 gcc libgcc libgcc.i686gcc-c++.x86_64 compat-gcc*.x86_64 gcc-objc++*.x86_64 libstdc++ libstdc++*.i686libstdc++-devel libstdc++-devel*.i686 nss-softokn-freeblnss-softokn-freebl-devel nss-softokn-freebl*.i686nss-softokn-freebl-devel*.i686 numactl lsb}
for package in $packagelist
do
yuminstall -y $package
done
如果过程中有需要的其他安装包,则可以利用yum进行安装即可。
关闭额外服务
为了减少系统额外的干扰,此次实验需要关闭一些额外的服务。具体列表如下所示:
同时需要修改/etc/selinux/config文件,将selinux修改为disabled模式。
#!/usr/bin/sh
#disable some service
systemctl disable auditd.service
systemctl disable libvirtd
systemctl disable firewalld
systemctl disable irqbalance
systemctl disable postfix
systemctl disable crond
此处利用“systemctl list-unit-files |grep enable >test”输出到本地的一个文件,然后利用vim工具进行替换最终完成如上的脚本。
2.1.2安装icc以及ifort编译器
由上介绍可知,speccpu的安装需要编译器,因此安装icc成为必须的准备工作之一。
注册一个账户,选择免费使用的版本进行下载。两种下载方式,一种将所有的离线文件都下载到本地;另外一种则是下载一个在线安装的脚本进行在线安装,可以只下载部分需要内容。parallel_studio_xe_2016_update2_online.sh
本文使用第一种方式,将整个离线包全部下载到本地。同时安装时也可以使用两种方法,一种是互动安装,将需要输入的选项输入到终端,完成安装。另外一种则是利用silent.cfg文件进行静默安装。
下载完成之后,安装。
1)解压到本地:
#tar xfparallel_studio_xe_2016_update2.tgz
安装方式一:
#sh install.sh
首先,按下Enter,它首先会检查系统必须条件。提示如下:
#Checking the prerequisites. It can takeseveral minutes. Please wait...
接着,检查完成则会提示如下,此时按下q则继续,不用看所有内容。
--More--[Press space to continue, 'q' toquit.]
然后会提示是否接受licence信息,提示如下所示,输入accept则可以完成。
Do you agree to be bound by the terms andconditions of this license agreement?
Type 'accept' to continue or 'decline' togo back to the previous menu:
接着会提示激活软件的方式,选择试用或者稍后激活。一般为第二项,输入2。提示如下所示:
1. I want to activate my product using aserial number [default]
2. I want to evaluate Intel(R) ParallelStudio XE 2016 Update 2 Cluster Edition
for Linux* or activate later
3. I want to activate by using a licensefile, or by using Intel(R) Software
License Manager
此次检查过程比较长,等候时间较长。完成后会提示是否参加促进intel软件。一般可以选择不参加2.
--------------------------------------------------------------------------------
1. Yes, I am willing to participate andimprove Intel software. (Recommended)
2. No, I don't want to participate in theIntel Software Improvement Program at
this time.
完成后则会提示选择安装,此处尤为重要,可以选择安装模块,选择2.Installation target,可以输入安装目录;/opt/intel
This product can be installed on clusternodes.
--------------------------------------------------------------------------------
1. Finish configuring installation target[default]
2. Installation target [ Current system only ]
输入Enter后则会提示接下来需要安装的文件信息,部分如下所示:
Component(s) selected:
Intel(R) MPI Library 5.1 Update 3 763MB
Intel MPI Benchmarks
Intel MPI Library for applications running on Intel(R) 64Architecture
Intel MPI Library for applications running on Intel(R) ManyIntegrated
Core Architecture
Intel(R) Trace Analyzer and Collector 9.1 Update 2 424MB
Intel(R) Trace Analyzer for Intel(R) 64 Architecture
Intel(R) Trace Collector for Intel(R) 64 Architecture
Intel(R) Trace Collector for Intel(R) Many Integrated Core Architecture
Intel(R) Cluster Checker 3.1 Update 2 152MB
Cluster Checker common files
Cluster Checker Analyzer
Cluster Checker Collector
Cluster Checker Database
看完提示信息之后则是正式选择安装,尤为重要的一点,选择2.Customize installation,则可以选择安装哪部分软件。
1. Start installation Now [default]
2. Customize installation
此处选择安装的架构,默认只有Intel(R) 64,但是speccpu中需要IA-32架构,因此需要在此处选择IA-32。按下1再按下Enter则可以完成选择。
Target Architecture(s) of yourapplications:
--------------------------------------------------------------------------------
1. [ ] IA-32
2. [x] Intel(R) 64
3. Finish architecture selection[default]
选完之后
Target Architecture(s) of yourapplications:
--------------------------------------------------------------------------------
1. [x] IA-32
2. [x] Intel(R) 64
3. Finish architecture selection[default]
此时完成选择之后则可以选择3完成架构选择。并选择开始安装。根据提示则可以看到是否安装完成。
Step 7 of 7 | Complete
--------------------------------------------------------------------------------
Thank you for installing and for usingIntel(R) Parallel Studio XE 2016 Update 2
Cluster Edition for Linux*.
由上述过程可见,比较复杂,因此,建议实际使用中使用silent.cfg来进行静默安装。
2)利用install.sh脚本进行安装或者修改silent.cfg文件,利用如下方式进行静默安装:
#sh install.sh -s silent.cfg &
其中silent.cfg主要需要修改如下几项:
PSET_INSTALL_DIR=/opt/intel (选择安装路径)
COMPONENTS=ALL(选择所有组件)
ACTIVATION_TYPE=trial_lic (试用)
ARCH_SELECTED=ALL(架构处选择ALL安装IA32和INTEL64)、
具体参考附件:silent.cfg
完成安装后,需要配置环境变量;
#cat “source/opt/intel/bin/compilervars.sh intel64”>> ~/.bashrc
#source ~/.bashrc
#icc -v
结果显示:icc version 16.0.2 (gcc version 4.8.5 compatibility)
如果结果没有提示错误,则表示安装完成。
2.2 SPECCPU安装
在安装好操作系统,配置好icc编译器之后则可以正式安装SPECCPU了。一般speccpu2006以iso形式存在。具体安装方式如下所示
1)挂载cpu2006-1.2.iso
#mount -o loop cpu2006.iso /mnt
2)运行安装脚步进行安装
#sh install.sh
提示信息如下,输入安装目录:/cpu2006
SPEC CPU2006 Installation
Top of the CPU2006 tree is '/mnt'
Enter the directory you wish to install to(e.g. /usr/cpu2006)
/cpu2006
根据系统的情况,最终选择工具集:linux-suse10-amd64,提示信息如下:
Attempting to install the linux-suse10-amd64toolset...
很快则是解压所有的bench最终看到如下提示则表示完成安装:
Installation successful. Source the shrc or cshrc in
/cpu2006
to set up your environment for thebenchmark.
验证是否安装完成:
#source /cpu2006/shrc
#runspec –help
如果有选项的提示,则表示安装完成。部分显示结果如下:
[root@spec cpu2006]# runspec --help
Usage: /cpu2006/bin/runspec [options]
If a long option shows an argument asmandatory, then it is mandatory
for the equivalent short option also. Similarly for optional arguments.
Optional arguments are enclosed in [].
When using long arguments, the equals sign('=') is optional.
Option list (alphabetical order):
-aACTION Same as'--action ACTION'
--action=ACTION Set the action for runspec totake. ACTION is
one of: build, buildsetup, clean,clobber,
configpp,scrub, report, run, setup, trash,
validate
--nobuild Do not attempt to buildbinaries
-cFILE Same as '--config FILE'
-CUSERS[,USERS...] Same as'--copies USERS[,USERS...]
--check_version Check the suite version evenfor non-
reportableruns
最终,在操作系统正常安装,必须软件包安装成功,icc编译器成功安装的情况下,完成了speccpu2006的安装,接下来则可以正常的去使用了。runspec命令是跑测试的最重要工具。
三、config文件介绍
3.1 测试需要准备的工作
安装完成speccpu2006后进入安装目录/cpu2006后可以看到其下主要有如下文件:
[root@spec cpu2006]# ls
Docs LICENSE MANIFEST README.txt SUMS.tools bin cshrc install.sh result shrc.bat uninstall.sh
Docs.txt LICENSE.txt README Revisions benchspec config install.bat redistributable_sources shrc tmp version.txt
文件 |
描述 |
Docs/Docs.txt |
文档,包括各种userguide等信息十分有用 |
LICENCE/LICENCE.txt |
序列号信息 |
README/README.txt |
speccpu简介 |
SUMS.tools |
各种工具列表 |
Bin/ |
一些工具(runspec)所在目录 |
Cshrc/shrc.bat/shrc |
设置环境变量脚本,linux下shrc |
Install.sh/uninstall.sh/install.bat |
安装和卸载脚本 |
Benchspec/ |
存放bench的目录十分重要,运行过程文件均在其中.包括测试所需数据、源码、二进制包等 |
Version.txt |
版本信息 |
Result/ |
运行结果和日志目录 |
Config/ |
config文件以及flag文件所在目录 |
1)config文件
如上所述,进入config文件夹中会有一些示例配置文件,一个flags文件夹,其下包含一些示例xml文件作为flag文件。config文件是运行过程中十分重要的文件,编译参数、运行脚本、软硬件描述等内容均在其中。Config文件更加详细的信息请参考:《SPECCPUconfig详解.odt》。其中详细介绍了config文件包含五个部分,并介绍了每个部分如何进行书写。
本文以实际使用过程中使用的例子来具体介绍config文件。这次测试使用的config文件是:cpu2006-1.2-ic16.0u2-lin64-ws-avx2-rate-20160328.cfg。根据名称可以发现其为cpu2006v1.2测试工具,使用的icc为16.02,64位的操作系统,指令集为avx2,测试对象为rate,日期为20160328。下面开始利用注释来逐段解读config文件。
如下为config文件最开始的一段,为一段注释文件。
############################################################################
# This is a sample config file. It wastested with:
#
# Compiler name/version: IntelCompiler 16.0u2
#编译器版本
# Operating system version: 64-Bit NeoKylin Advanced Linux V7Update2 #os系统
# Hardware: Intelprocessors supporting AVX2
#CPU指令集AVX2
#
############################################################################
# SPEC CPU2006 Intel Linux64 config file
# 20160328 Intel Compiler 16.0 forLinux64
############################################################################
接下来为主要内容:
action = validate
#runspec参数,默认,编译,运行,结果正确性检查,报告生成
tune = base,peak
#测试范围既包括基准测试也包括峰值测试,和runspec 加入 # --tune=all一样,
接下来内容,关键为一个日期定义和fail_build,如果修改为0,则需要修改version日期,否则会出现报错。
%define version 20160328
ext = cpu2006-1.2-ic16.0u2-lin64-ws-avx2-rate-%{version}
#可执行文件扩展名
#
# vvvvvvvvvvvv # do not change unless you read NOTE above
fail_build=1 # do not change unless you read NOTE above
# ^^^^^^^^^^^^ # do not change unless you read NOTE above
#
########################################################
#
重要内容,如下所示:
PATHSEP = /
#路径
check_md5=1
#使用MD5散列来验证可执行文件同配置文件匹配,如果不匹配,重新编译
reportable=1
# 遵循报告规则,生成规范的报告文件
bench_post_setup=sync
#在每个benchmark的运行目录配置完成后,都执行命令:sync将内存缓冲区内的数据写入磁盘。
parallel_test=0
#设置并行进行test和train workload下benchmark二进制文件验证正确性工作的数量
mean_anyway=1
#即使测试过程有invalid状态也要计算结果值。
sysinfo_program = specperl$[top]/config/sysinfo.rev6914
#用specperl获取软硬件信息的脚本
flagsurl1=Intel-ic16.0-official-linux64.xml
#flag文件的文件名称,默认目录在/cpu2006下
%ifdef %{default-platform-flags}
#如果runpsec中定义了default-platform-flags参数则
flagsurl2=Default-Platform-Flags.xml
#利用另外一个flag文件Default-Platform-Flags.xml
%endif
# Set some environment variables
preENV_LD_LIBRARY_PATH =$[top]/libs/32:$[top]/libs/64:$[top]/sh
#库文件目录,其中libs、sh均为smarheap库的连接和库文件。
接下来的内容主要为针对base和peak的编译参数。主要的规则如下:benchmark[,...]=tuning[,...]=extension[,...]=machine[,...]
每个部分的可选内容如下所示:
benchmark: |
1.default |
tuning: |
1.default |
extension: |
1default |
machine: |
1.default |
int=default=default=default:
#根据上述表格,其表示int测试集、测试方式包含base和 peak。同时扩展名按照上面ext内容;机器为默认。
CC= icc -m32-L/opt/intel/compilers_and_libraries_2016/linux/compiler/lib/ia32_lin
#C编译方式,icc编译,生成32位,连接库为后面的目录。
CXX= icpc -m32-L/opt/intel/compilers_and_libraries_2016/linux/compiler/lib/ia32_lin
#c++编译方式,和上述C语言编译一致
OBJ = .o
#编译对象文件扩展为.o文件
SMARTHEAP32_DIR = /sh #32位smartheap库目录,因此需要将其拷贝到根目录下
SMARTHEAP64_DIR = /sh
#64位smartheap库目录
PORTABILITY = -D_FILE_OFFSET_BITS=64 #portability参数,文件偏移位数:64
fp=default=default=default:
#同上int
CC= icc -m64
#问题,此处-m64表示生成64位程序,为啥这么做呢?
CXX= icpc -m64
FC= ifort -m64
OBJ = .o
接下来为关键的绑定策略。默认都会自动提交
default:
#submit关键字则是提交的shell命令,内容是对于每个子线程命令$command,进行绑定操作,内存为本地绑定,核绑定则是绑定则是按顺序绑定core:0~191。$SPECCOPYNUM是runspec脚本中的全局变量。是因为runspec脚本中看到submit关键词就进行下面操作?根据文档表示,$SPECCOPYNUM根据你的runspec命令中copy数量来定,一般从0开始,到你的核数本次测试即:0~191.
submit = numactl --localalloc--physcpubind=$SPECCOPYNUM $command
%ifdef %{no-numa}
#如果在runspec命令中添加了no-numa定义(define)则执行如下命令,即利用taskset来进行cpu绑定。
submit = taskset -c $SPECCOPYNUM $command
%endif
下面是编译器的选项
default:
SSE = -xCORE-AVX2
#使用指令集为xCORE-AVX2,这个是目前效率最高,适合对应的intel的CPU。
FASTNOSTATIC = $(SSE) -ipo -O3 -no-prec-div #优化选项,后面三项均是编译
优化参数,详细见icc编译器参数
FAST = $(SSE) -ipo -O3 -no-prec-div #同上所示
后续是针对每一个基准设置的不同的Portability选项,举例如下
400.perlbench=default:
#其他的编译参数均为默认的,如上所示
CPORTABILITY= -DSPEC_CPU_LINUX_IA32
#可移植性选项,具体意义待定
后续471、473和483三个基准使用了smartheap库,具体使用的参数如下所示:
471.omnetpp,473.astar,483.xalancbmk=default:
EXTRA_LIBS= -L$(SMARTHEAP32_DIR) -lsmartheap
#链接到smartheap库中
EXTRA_LDFLAGS= -Wl,-z,muldefs
#待定
后续则是一些优化选项,COPTIMIZE或者CXXOPTIMIZE等选项
int=base=default=default:
COPTIMIZE= $(FASTNOSTATIC) -opt-prefetch -opt-mem-layout-trans=3 #默认编译器后面添加了几项-opt-prefetch,-opt-mem-layout-trans=3
CXXOPTIMIZE= $(FASTNOSTATIC) -opt-prefetch -opt-mem-layout-trans=3
fp=base=default=default:
#浮点优化选项
OPTIMIZE= $(FAST) -opt-prefetch
COPTIMIZE= -auto-p32 -ansi-alias-opt-mem-layout-trans=3
CXXOPTIMIZE= -auto-p32 -ansi-alias -opt-mem-layout-trans=3
前面的结果均为编译base的参数,后续则是编译peak的一些参数,如下所示为整型峰值参数信息
:
int=peak=default:
COPTIMIZE= -ansi-alias -opt-mem-layout-trans=3
CXXOPTIMIZE= -ansi-alias -opt-mem-layout-trans=3
PASS1_CFLAGS = -prof-gen:threadsafe -par-num-threads=1
PASS2_CFLAGS = $(FASTNOSTATIC) -prof-use
PASS1_CXXFLAGS = -prof-gen:threadsafe -par-num-threads=1
PASS2_CXXFLAGS = $(FASTNOSTATIC) -prof-use
PASS1_LDCFLAGS = -prof-gen:threadsafe -par-num-threads=1
PASS2_LDCFLAGS = $(FASTNOSTATIC) -prof-use
PASS1_LDCXXFLAGS = -prof-gen:threadsafe-par-num-threads=1
PASS2_LDCXXFLAGS = $(FASTNOSTATIC)-prof-use
紧接着则是每个整型bench的单独peak参数,同时后续则是浮点相关的参数。接下来则是一些和自己信息匹配的系统和硬件信息。如下部分示例信息所示:
default=default=default=default:
license_num = 13
#序号,每个厂商有自己的序列号
test_sponsor = Intel Corporation
#厂商
hw_avail = Dec-9999
#硬件获取日期
sw_avail = Jan-2016
#系统获取日期
tester = Intel Corporation
#测试厂商
hw_cpu_name = Intel Trademarked CPU Name
#cpu的名称
最后则是md5校验信息,这个信息十分重要,用于检验结果的正确性,编译的准确性,如果已经生成了一组md5校验结果,后续将config文件修改,则会要求修改failbuild,否则出现错误。下面画出config文件的sections。
runspec选项 |
base选项(编译器) |
peak选项(编译器) |
hw和os信息(结果显示) |
md5校验信息(结果验证) |
2)flag文件
flag脚本目的在于格式化测试结果,一般选用官网已有的一些xml文件即可,不需要手动修改内容。