在飞腾FT2000+/64上的UnixBench测试和优化过程
硬件系统描述
组件 | 描述 |
---|---|
CPU | FT2000+/64, 硬件加速部件为 fp asimd evtstrm crc32 cpuid |
memory | 128GB |
软件系统描述简单描述一下:
相关软件 | 版本号 | 查看命令 |
---|---|---|
Linux内核 | 5.9.1 | unam -a |
GCC编译器 | 8.3.1 | gcc -v |
GLibc库 | 2.28 | ldd --version |
Unixbench Version 5.1.3 |
另外:文件系统类型为xfs
因为我们Unixbench是在/home目录下进行测试,所以根据mount命令找到下面信息
/dev/sda5 on /home type xfs (rw,relatime,attr2,inode64,logbufs=8,logbsize=32k,noquota)
UnixBench测试用例分析
备注:不包含图形测试部分
测试用例 | 依赖动态库 |
---|---|
dhry2reg | libc |
whetstone-double | libc、 libm |
execl | libc |
fstime | libc |
pipe | libc |
context1 | libc |
spawn | libc |
syscall | libc |
looper | libc |
GLibc库介绍
几乎所有C程序都要调用glibc的库函数,所以glibc是Linux平台C程序运行的基础。glibc提供一组头文件和一组库文件,最基本、最常用的C标准库函数和系统函数在libc.so库文件中,几乎所有C程序的运行都依赖于libc.so,有些做数学计算的C程序依赖于libm.so,以后我们还会看到多线程的C程序依赖于libpthread.so。以后我说libc时专指libc.so这个库文件,而说glibc时指的是glibc提供的所有库文件。
第一次测试结果(单线)
System Benchmarks Index Values BASELINE RESULT INDEX
Dhrystone 2 using register variables 116700.0 22876131.1 1960.3
Double-Precision Whetstone 55.0 3793.8 689.8
Execl Throughput 43.0 2605.6 606.0
File Copy 1024 bufsize 2000 maxblocks 3960.0 409345.3 1033.7
File Copy 256 bufsize 500 maxblocks 1655.0 124795.5 754.1
File Copy 4096 bufsize 8000 maxblocks 5800.0 1131279.2 1950.5
Pipe Throughput 12440.0 699804.3 562.5
Pipe-based Context Switching 4000.0 105264.7 263.2
Process Creation 126.0 3776.8 299.7
Shell Scripts (1 concurrent) 42.4 3443.9 812.2
Shell Scripts (8 concurrent) 6.0 1052.5 1754.1
System Call Overhead 15000.0 544993.7 363.3
========
System Benchmarks Index Score 743.7
第一次测试结果(64线)
修改Run脚本的
'system' => { 'name' => "System Benchmarks", 'maxCopies' => 16 },
将16修改为64或更大,才可以运行64线的测试
System Benchmarks Index Values BASELINE RESULT INDEX
Dhrystone 2 using register variables 116700.0 1449204777.6 124182.1
Double-Precision Whetstone 55.0 242239.1 44043.5
Execl Throughput 43.0 5791.5 1346.9
File Copy 1024 bufsize 2000 maxblocks 3960.0 432326.9 1091.7
File Copy 256 bufsize 500 maxblocks 1655.0 139901.0 845.3
File Copy 4096 bufsize 8000 maxblocks 5800.0 1270166.2 2189.9
Pipe Throughput 12440.0 44426009.8 35712.2
Pipe-based Context Switching 4000.0 4071857.2 10179.6
Process Creation 126.0 14748.2 1170.5
Shell Scripts (1 concurrent) 42.4 18286.5 4312.9
Shell Scripts (8 concurrent) 6.0 2376.7 3961.2
System Call Overhead 15000.0 2648428.6 1765.6
========
System Benchmarks Index Score 4899.0
1. 对UnixBench进行编译优化
在编译时默认的优化级别是"2"(使用"-O2"选项)
OPTON = -O2 -fomit-frame-pointer -fforce-addr -ffast-math -Wall
基本思路:
- -O3: 在O2的基础上进行更多的优化
- 编译选项修改为
-O3 -fomit-frame-pointer -fforce-addr -ffast-math -Wall
-march=armv8-a \
-mtune=cortex-a53
2. 服务裁剪
用ps aux
查看系统线程,用systemctl -a
查看后台服务,最终用
systemclt stop
暂时停止服务,或者用systemctl disable
用于停止服务。
服务 | 描述 |
---|---|
nfs-server.service | 网络文件系统服务 |
irqbalance.service | 中断均衡服务 |
numad.service | numa调度服务 |
plymouth-xx.service | plymouth启动过程服务 |
cups.service | 打印服务 |
upower.service | 电池管理服务 |
gdm.service | 图形登录服务 |
rhsmcertd.service | 软件升级和管理服务 |
avahi-daemon.service | DNS发现和组播服务 |
注意:请用
systemctl set-default multi-user.target
将系统设置为字符界面。
3. 存储和IO调度
主要考虑介质、IO调度算法和文件系统类型之间的匹配关系。
IO调度算法选择基本原则是:
- 内存、PCIe nvme用none
- SSD固态盘用mq-deadline
- 普通机械磁盘用bfq
当前IO调度类型,根据cat /sys/block/sda/queue/scheduler
可以查询到。
直接修改echo xxx > /sys/block/sda/queue/scheduler
3.1 介质
最好是内存,然后PCIe NVMe,然后是 SSD固态盘,最后才是硬盘。硬盘本身也可以采用软硬raid方式来提升IO性能。
1. 用内存的方式(后面我们不讨论)
用内存方式,直接在/dev/shm目录下运行Unixbench测试程序即可。
System Benchmarks Index Values BASELINE RESULT INDEX
Dhrystone 2 using register variables 116700.0 24700949.1 2116.6
Double-Precision Whetstone 55.0 3795.0 690.0
Execl Throughput 43.0 2630.2 611.7
File Copy 1024 bufsize 2000 maxblocks 3960.0 529035.4 1335.9
File Copy 256 bufsize 500 maxblocks 1655.0 168548.7 1018.4
File Copy 4096 bufsize 8000 maxblocks 5800.0 1346940.5 2322.3
Pipe Throughput 12440.0 698881.7 561.8
Pipe-based Context Switching 4000.0 106585.3 266.5
Process Creation 126.0 3794.2 301.1
Shell Scripts (1 concurrent) 42.4 3483.8 821.6
Shell Scripts (8 concurrent) 6.0 1054.8 1757.9
System Call Overhead 15000.0 544360.1 362.9
========
System Benchmarks Index Score 798.0
2. 单SSD固态硬盘(我们只讨论这种情况,因为条件也就这样)
1)单SS固态硬盘
当前存储是Marvell 9215 SATA控制器,根据lspci -v
可以获得
09:00.0 SATA controller: Marvell Technology Group Ltd. Device 9215 (rev 11) (prog-if 01 [AHCI 1.0])
Subsystem: Marvell Technology Group Ltd. Device 9215
Flags: bus master, fast devsel, latency 0, IRQ 23, NUMA node 0
I/O ports at 4020 [size=8]
I/O ports at 4030 [size=4]
I/O ports at 4028 [size=8]
I/O ports at 4034 [size=4]
I/O ports at 4000 [size=32]
Memory at 80061210000 (32-bit, non-prefetchable) [size=2K]
Expansion ROM at 80061200000 [disabled] [size=64K]
Capabilities: [40] Power Management version 3
Capabilities: [50] MSI: Enable+ Count=1/1 Maskable- 64bit-
Capabilities: [70] Express Legacy Endpoint, MSI 00
Capabilities: [e0] SATA HBA v0.0
Capabilities: [100] Advanced Error Reporting
Kernel driver in use: ahci
上面看到SATA控制器驱动程序为ahci,中断号为23,属于NUMA节点0,即CPU0~CPU7为第O个NUMA节点(这个不一定正确,本机是正确的)。
cat /proc/interrupsts | grep ahci
观察到当前SATA控制器中断确实是在CPU0~CPU7上。
2)根据磁盘类型选择IO调度类型。
硬盘是Samsung SSD 860 EVO 500GB,根据hdparm -i /dev/sda
或者smartclt -i /dev/sda
可以获得。
[root@localhost ~]# smartctl -i /dev/sda
smartctl 6.6 2017-11-05 r4594 [aarch64-linux-5.9.1] (local build)
Copyright (C) 2002-17, Bruce Allen, Christian Franke, www.smartmontools.org
=== START OF INFORMATION SECTION ===
Device Model: Samsung SSD 860 EVO 500GB
Serial Number: S3Z3NB0M534111K
LU WWN Device Id: 5 002538 e41009a48
Firmware Version: RVT03B6Q
User Capacity: 500,107,862,016 bytes [500 GB]
Sector Size: 512 bytes logical/physical
Rotation Rate: Solid State Device
Form Factor: 2.5 inches
Device is: Not in smartctl database [for details use: -P showall]
ATA Version is: ACS-4 T13/BSR INCITS 529 revision 5
SATA Version is: SATA 3.2, 6.0 Gb/s (current: 6.0 Gb/s)
Local Time is: Thu Nov 19 14:06:18 2020 CST
SMART support is: Available - device has SMART capability.
SMART support is: Enabled
fs defaults,async,noatime,nodiratime,barrier=0