Ceph加速
1. SPDK/DPDK
2. SIMD
3. Intel-QAT
4. AES-NI
5. SHA-NI
6. CRC32
7. ISA-L
SPDK/DPDK
SPDK (Storage Performance Development Kit ) —— 针对于支持nvme协议的SSD设备,是一种高性能的解决方案。
DPDK (Data Plane Development Kit) -- 专注于网络应用中数据包的高性能处理。
SPDK/DPDK应用程序运行在操作系统的User Space,利用自身提供的数据面库进行数据处理,绕过了Linux内核,以提升报文处理效率。
SPDK/DPDK
基于UIO
,VFIO
或igb_uio
的支持直接将存储设备的的地址空间映射到应用空间的方式,并利用NVMe/Net
规范来初始化NVMe SSD/Net device
设备,实现基本的I/O
操作,从而构筑用户态驱动,所以整个过程不需要陷入到内核中
在SPDK/DPDK
用户态驱动的方案中,使用异步轮询取代中断,通过CPU
不断轮询的方式,一旦查询到操作完成,则立马触发回调函数,给到上层用户程序,这样用户程序可以按需发送多个请求,以此提升性能。
原文链接:https://blog.csdn.net/ApeLife/article/details/100751359
spdk组件
SPDK中大概有三类子组件:网络前端、处理框架、后端。
网络前端子组件:包括DPDK网卡驱动和用户态网络服务UNS(这是一个Linux内核TCP/IP协议栈的替代品,能够突破通用TCP/IP协议栈的种种性能限制瓶颈)。DPDK在网卡侧提供了一个高性能的发包收包处理框架,在数据从网卡到操作系统用户态之间提供了一条快速通道。UNS代码则继续这一部分处理,稍加处理TCP/IP数据包的标准处理方式,并形成iSCSI命令。
处理框架:包括iSCSI Target和Customer Storage App,“处理框架”部分拿到了数据包内容,将iSCSI命令转换为SCSI块级命令。然而,在它将这些命令发到“后端”驱动之前,SPDK提供了一套API框架,让厂商能够插入自己定义的处理逻辑(架构图中绿色的方框)。通过这种机制,存储厂商可在这里实现例如缓存、去重、压缩、加密、RAID计算,或擦除码(Erasure Coding)计算等功能,使这些功能包含在SPDK的处理流程中。
后端:数据到达了“后端”驱动层,在这里SPDK和物理块设备交互(读和写操作)。这一系列后端设备驱动涵盖了不同性能的存储分层,保证SPDK几乎与每种存储应用形成关联。
原文链接:https://blog.csdn.net/bandaoyu/article/details/124740721
SIMD
SIMD(Single Instruction Multiple Data)即单指令流多数据流,是一种可以对一组数据(又称“数据向量”)中的每一个分别执行相同的操作从而实现空间上的并行性的技术。简单来说就是一个指令能够同时处理多个数据。
在 Ceph 中,SIMD 技术可以应用于数据编解码、数据压缩和加密等方面,进行加速。
变量定义
第一部分,统一为”__m“;
第二部分为位数如“64”、“128”、“256”等;
第三部位为变量类型,int型:“i”,double型:“d”,float型什么也不加。
例如“__m128i” 的意思是定义128位的int型数据。
函数定义
第一部分定义输出的数据类型的位数 128位:_mm 256位:_mm256 512位:_mm512
第二部分定义功能的名称例如,载入数据“_load”,加法“_add”,存储“_store”;
第三部分定义该功能的详细数据类型,比如8位整数“_epi8”、无符号8位整数“_epu8”、16位整数“_epi16”,双精度浮点数“_pd”
例如 _mm_add_epi16(a,b),的意思是数据总位数为128,将a和b其中每16位为一个数字进行对应相加。
a可以看作a[0]、a[1]、a[2]...a[7]。b看作b[0]、b[1]、b[2]...b[7]。然后a[0]+b[0]、a[1]+b[1]...a[7]+b[7]为结果。
简单示例
#include <immintrin.h>
#include <stdio.h>
float aa[] = {10, 20, 30, 40, 50, 60, 70, 80};
float bb[] = {0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5};
float cc[] = {0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5};
int main(int argc, char* argv[])
{
__m256 first = _mm256_loadu_ps(aa);
__m256 second = _mm256_loadu_ps(bb);
__m256 result = _mm256_add_ps(first, second);
_mm256_storeu_ps(cc, result);
printf("==%ld \n", sizeof(float));
for (int i = 0;i < 8; i++)
{
printf("%f\n", cc[i]);
}
return 0;
}
//_mm256_loadu_ps等函数可通过https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html
//loadu,load表示内存是否需要对齐
//SSE的浮点运算指令分为两大类:Packed 和Scalar。
//Packed指令是一次对XMM寄存器中的四个浮点数(即DATA0 ~ DATA3)均进行计算,而Scalar则只对XMM暂存器中的DATA0进行计算。
gcc -mavx2 test.c -o test
user@node1:~$ ./a.out
==4
10.500000
20.500000
30.500000
40.500000
50.500000
60.500000
70.500000
80.500000
Intel-QAT
Intel® QuickAssist Adapter 8950 设备简介
支持英特尔®QuickAssist技术的英特尔®QuickAssist适配器提供加密加速和压缩加速服务。
intel® QuickAssist Adapter 8950 特性
Intel QAT加速卡逻辑实例
处理器可以连接到一个或多个英特尔通信芯片组8925至8955系列(PCH)设备。 从软件角度来看,每个PCH设备都包含一个逻辑加速器。 从物理上讲,每个设备都包含多个加速器,这些加速器被负载均衡硬件组件抽象成一个加速器, 发送到一个逻辑加速器的所有请求将在PCH设备内的各个物理加速器之间自动进行负载均衡。 对软件来说,只需要操作一个逻辑加速器即可,可以大大简化应用程序的编程方式,提高工作效率。
一组32个环形存储区(Ring Bank)提供了处理器与PCH设备上的加速引擎之间的通信机制。 每个环形存储区(Ring Bank)包含16个单独的环(Ring)用于通信。 下图显示了处理器,PCH设备,加速器和环形存储区(Ring Bank)之间的关系。
处理器和PCH设备之间的通讯流程
加速服务通过对请求和响应消息分别使用不同的环进行通讯。处理器和PCH设备之间的通信通过以下操作实现(另请参见下图):
-
①处理器使用写(Put)操作将请求放置在请求环上。
-
②PCH设备使用读取(Get)操作从请求环中检索请求。
-
③执行完该操作后,PCH设备将使用写(Put)操作将响应放入响应环。
-
④处理器使用读取(Get)操作从响应环中检索响应。
原文链接:https://www.bbsmax.com/A/gAJGNrq8zZ/
AES-NI
高级加密标准指令集 (或称英特尔 高级加密标准新指令 ,简称 AES-NI )是一个 x86 指令集架构 的扩展,用于 Intel 和 AMD 微处理器 ,由Intel在2008年3月提出。 [1] 该指令集的目的是改进应用程序使用 高级加密标准 (AES)执行加密和解密的速度。(AES-NI是一种CPU特性。)
检查cpu是否支持该功能
$ cat /proc/cpuinfo | grep aes | wc -l
AES-NI: https://www.intel.com/content/dam/develop/external/us/en/documents/10tb24-breakthrough-aes-performance-with-intel-aes-new-instructions-final-secure-165683.pdf
ceph中使用AES
ceph中可以使用AES对传输的数据进行加密,保护数据安全。
SHA-NI
SHA-NI指令集,用于加速哈希算法,SHA-NI指令集由7个SIMD指令构成,一起用来加速SHA-1 SHA-256算法
链接:https://www.intel.com/content/www/us/en/developer/articles/technical/intel-sha-extensions.html
ceph中使用SHA
ceph中可以使用SHA对数据完整性进行验证。一般用于安全性比较高的场景,比如数字签名等。
CRC32
CRC32扩展指令集,循环冗余校验(CRC)算法用于网络和存储领域进行的数据一致性检查。CRC32扩展指令针对CRC-32算法进行加速。
ceph中使用CRC
ceph中可以使用CRC对数据完整性和正确性进行验证。一般用于计算效率要求高的场景,比如通信数据的校验。
ISA-L
ISA-L分为了isa-l_pub版本和isa-l_crypto版本, 如图所示。前者主要包含了在存储领域的一些算法,后者主要包含的是密码学的一些算法,包括在最新版本中增加了高性能SM3算法的支持。