原力注入

「鲲鹏软件性能调优基础知识」之「基于硬件特性的性能调优方向」

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 厂商拼某些优化是不现实的,例如矩阵计算,人家是可以靠指令“作弊”的。

Image

1.2 从冯诺依曼架构看性能调优方向

Image

四大方向:CPU/内存(物理关系比较紧密)、硬盘、网卡、应用

1.3 基于鲲鹏处理器的软加速和硬加速(CPU/内存)

Image

编译优化、NUMA感知的亲和性优化(CPU/内存)、硬件加速引擎。

Image

编译器优化可以充分利用新的指令集。

Image

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内核,如下图所示

Image

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架构。

Image

上图揭示了内存访问的locality特性:

  • • core0 访问直接连接的内存最快;

  • • core0 访问同一个 NUMA node 连接的内存其次;

  • • 访问4为啥比访问3慢?笔者需要查阅更多资料了,已经入手了《鲲鹏处理器架构与编程》,等仔细研读之后再做讨论:

Image

可以通过 cgroup cpuset 或者用 taskset 来实现绑核。

Image

Image

相关上下游软件都需要优化。

Image

Image

应用层优化:调用鲲鹏RSA加密加速引擎,提升Web应用HTTPS性能

1.2 文件系统决定了磁盘加载到内存过程的快慢(磁盘)

硬盘优化

Image

文件系统决定了磁盘加载到内存过程的快慢。

Image

磁盘预取可以充分利用磁盘带宽。

网卡优化

Image

网卡中断产生频率会影响应用的吞吐和延迟。

Image

调整网卡中断聚合,在低时延和高吞吐取平衡点。

应用优化

Image

在数据库TPCC测试模型中降低网卡中断可以提升吞吐。

Image

软件调优的本质是充分发挥硬件性能。

Image

减少资源抢占,提升并行度,发挥多核性能优势。

Image

Tcmalloc通过减少内存分配中的锁以提升高并发下的性能。

Image

Mysql 5.7.12内存对齐硬编码,导致伪共享。

Image

鲲鹏性能调优十板斧:

https://www.hikunpeng.com/document/detail/zh/perftuning/tuningtip/kunpengtuning_12_0002.html。

 1.3 网卡中断产生频率会影响应用吞吐核延1.4 软件调优的本质是充分发挥