「鲲鹏软件性能调优基础知识」之「基于硬件特性的性能调优方向」
CPU及内存优化
1.1 硬件特性就是优化的“作弊器”
NEON 向量指令:ARM最早支持SIMD指令集是ARMv6。这一代SIMD指令集依赖的向量寄存器,复用了ARM本身的通用寄存器。支持8/16bit整数,可以实现4个8bit整数或者2个16bit整数的并行计算。在ARMv7-A架构中,ARM进一步发展自身的SIMD指令集,并命名为NEON。这一代的指令集,有32个64bit的NEON向量寄存器,同时也支持单精度浮点。而在ARM v8-A架构中,NEON指令集进一步得到发展,32个向量寄存器的长度都增加到128bit。支持8/16/32/64bit整数,同时支持单精度和双精度浮点运算。
https://www.hikunpeng.com/document/detail/zh/perftuning/progtuneg/kunpengprogramming_05_0019.html
点评:软件上的优化最后还是要靠新的指令,所以要和 CPU 厂商拼某些优化是不现实的,例如矩阵计算,人家是可以靠指令“作弊”的。
1.2 从冯诺依曼架构看性能调优方向
四大方向:CPU/内存(物理关系比较紧密)、硬盘、网卡、应用
1.3 基于鲲鹏处理器的软加速和硬加速(CPU/内存)
编译优化、NUMA感知的亲和性优化(CPU/内存)、硬件加速引擎。
编译器优化可以充分利用新的指令集。
NUMA(Non-Uniform Memory Access) 非均匀内存访问架构是指多处理器系统中,内存的访问时间是依赖于处理器和内存之间的相对位置的。这种设计里存在和处理器相对近的内存,通常被称作本地内存;还有和处理器相对远的内存, 通常被称为非本地内存。
一个CPU Socket里可以由多个CPU Core和一个Uncore部分组成。每个CPU Core内部又可以由两个CPU Thread组成。每个CPU thread都是一个操作系统可见的逻辑CPU。对大多数操作系统来说,一个八核HT打开的CPU会被识别为16个CPU。下面就说一说这里面相关的概念,
•
Socket:一个Socket对应一个物理CPU。这个词大概是从CPU在主板上的物理连接方式上来的,可以理解为Socket就是主板上的CPU插槽。处理器通过主板的Socket来插到主板上。尤其是有了多核(Multi-core)系统以后,Multi-socket系统被用来指明系统到底存在多少个物理CPU。
• Node:
NUMA体系结构中多了Node的概念,这个概念其实是用来解决core的分组的问题。每个node有自己的内部CPU,总线和内存,同时还可以访问其他node内的内存,NUMA的最大的优势就是可以方便地增加CPU的数量。通常一个Socket有一个Node,也有可能一个Socket有多个Node。
• Die:
Dies是处理器在生产过程中引入的概念,总的来说,Die或者CPU Die指的是处理器在生产过程中,从晶圆(Silicon Wafer)上切割下来的一个个小方块(这也是为啥消费者看到的CPU芯片为什么都是方的的原因),在切割下来之前,每个小方块(Die)都需要经过各种加工,将电路逻辑刻到该Die上面。对于主流的CPU厂商Intel和AMD而言,他们会将1个或者N个CPU Die封装起来形成一个CPU Package,有时候也叫作CPU Socket。而对于AMD的EYPC CPU而言,它的每个CPU Socket由4个CPU Die组成,每个CPU Die中包含有4个CPU内核,如下图所示
CPU Die之间通过片外总线(Infinity Fabric)互联,并且不同CPU Die上的CPU内核不能共享CPU缓存,而单个Die的Xeon处理器内和所有CPU内核其实是可以共享CPU的第三级缓存(L3 Cache)的。
• Core:
CPU的运算核心。x86的核包含了CPU运算的基本部件,如逻辑运算单元(ALU), 浮点运算单元(FPU),L1和L2缓存。一个Socket里可以有多个Core。如今的多核时代,即使是Single Socket的系统, 也是逻辑上的SMP系统。但是,一个物理CPU的系统不存在非本地内存,因此相当于UMA系统。• Uncore:
Intel x86物理CPU里没有放在Core里的部件都被叫做Uncore。Uncore里集成了过去x86 UMA架构时代北桥芯片的基本功能。在Nehalem时代,内存控制器被集成到CPU里,叫做iMC(Integrated Memory Controller)。而PCIe Root Complex还作为独立部件在IO Hub芯片里。到了SandyBridge时代,PCIe Root Complex也被集成到了CPU里。现今的Uncore部分,除了iMC,PCIe Root Complex,还有QPI(QuickPath Interconnect)控制器,L3缓存,CBox(负责缓存一致性),及其它外设控制器。• Threads:这里特指
CPU的多线程技术。在Intel x86架构下,CPU的多线程技术被称作超线程(Hyper-Threading)技术。Intel的超线程技术在一个处理器Core内部引入了额外的硬件设计模拟了两个逻辑处理器(Logical Processor), 每个逻辑处理器都有独立的处理器状态,但共享Core内部的计算资源,如ALU,FPU,L1,L2缓存。这样在最小的硬件投入下提高了CPU在多线程软件工作负载下的性能,提高了硬件使用效率。x86的超线程技术出现早于NUMA架构。
上图揭示了内存访问的locality特性:
•
core0访问直接连接的内存最快;•
core0访问同一个 NUMA node 连接的内存其次;• 访问4为啥比访问3慢?笔者需要查阅更多资料了,已经入手了《鲲鹏处理器架构与编程》,等仔细研读之后再做讨论:
可以通过 cgroup cpuset 或者用 taskset 来实现绑核。
相关上下游软件都需要优化。
应用层优化:调用鲲鹏RSA加密加速引擎,提升Web应用HTTPS性能
1.2 文件系统决定了磁盘加载到内存过程的快慢(磁盘)
硬盘优化
文件系统决定了磁盘加载到内存过程的快慢。
磁盘预取可以充分利用磁盘带宽。
网卡优化
网卡中断产生频率会影响应用的吞吐和延迟。
调整网卡中断聚合,在低时延和高吞吐取平衡点。
应用优化
在数据库TPCC测试模型中降低网卡中断可以提升吞吐。
软件调优的本质是充分发挥硬件性能。
减少资源抢占,提升并行度,发挥多核性能优势。
Tcmalloc通过减少内存分配中的锁以提升高并发下的性能。
Mysql 5.7.12内存对齐硬编码,导致伪共享。
鲲鹏性能调优十板斧:
https://www.hikunpeng.com/document/detail/zh/perftuning/tuningtip/kunpengtuning_12_0002.html。
1.3 网卡中断产生频率会影响应用吞吐核延1.4 软件调优的本质是充分发挥