《深入浅出DPDK》—第2章2.9节NUMA系统

简介: 之前的章节已经简要介绍过NUMA系统,它是一种多处理器环境下设计的计算机内存结构。NUMA系统是从SMP(Symmetric Multiple Processing,对称多处理器)系统演化而来。

本节书摘来自华章出版社《深入浅出DPDK》一书中的第2章,第2.9节NUMA系统,作者朱河清,梁存铭,胡雪焜,曹水 等,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

2.9 NUMA系统
之前的章节已经简要介绍过NUMA系统,它是一种多处理器环境下设计的计算机内存结构。NUMA系统是从SMP(Symmetric Multiple Processing,对称多处理器)系统演化而来。
SMP系统最初是在20世纪90年代由Unisys、Convex Computer(后来的HP)、Honeywell、IBM等公司开发的一款商用系统,该系统被广泛应用于Unix类的操作系统,后来又扩展到Windows NT中,该系统有如下特点:
1)所有的硬件资源都是共享的。即每个处理器都能访问到任何内存、外设等。
2)所有的处理器都是平等的,没有主从关系。
3)内存是统一结构、统一寻址的(UMA,Uniform Memory Architecture)。
4)处理器和内存,处理器和处理器都通过一条总线连接起来。
其结构如图2-14所示:
SMP的问题也很明显,因为所有的处理器都通过一条总线连接起来,因此随着处理器的增加,系统总线成为了系统瓶颈,另外,处理器和内存之间的通信延迟也较大。为了克服以上的缺点,才应运而生了NUMA架构,如图2-15所示。


e7ae38def3794a13f21611009b25597b9cfbdb7c


a7c383bd49c637bfec5d16933dcf7f58138dfefc

NUMA是起源于AMD Opteron的微架构,同时被英特尔Nehalem架构采用。在这个架构中,处理器和本地内存之间拥有更小的延迟和更大的带宽,而整个内存仍然可作为一个整体,任何处理器都能够访问,只不过跨处理器的内存访问的速度相对较慢一点。同时,每个处理器都可以拥有本地的总线,如PCIE、SATA、USB等。和内存一样,处理器访问本地的总线延迟低,吞吐率高;访问远程资源,则延迟高,并且要和其他处理器共享一条总线。图2-16是英特尔公司的至强E5服务器的架构示意图。

ffaefd6a471ad738bf3b40827dc124ffa211331f

可以看到,该架构有两个处理器,处理器通过QPI总线相连。每个处理器都有本地的四个通道的内存系统,并且也有属于自己的PCIE总线系统。两个处理器有点不同的是,第一个处理器集成了南桥芯片,而第二个处理器只有本地的PCIE总线。
和SMP系统相比,NUMA系统访问本地内存的带宽更大,延迟更小,但是访问远程的内存成本相对就高多了。因此,我们要充分利用NUMA系统的这个特点,避免远程访问资源。
以下是DPDK在NUMA系统中的一些实例。
1)Per-core memory。一个处理器上有多个核(core),per-core memory是指每个核都有属于自己的内存,即对于经常访问的数据结构,每个核都有自己的备份。这样做一方面是为了本地内存的需要,另外一方面也是因为上文提到的Cache一致性的需要,避免多个核访问同一个Cache行。
2)本地设备本地处理。即用本地的处理器、本地的内存来处理本地的设备上产生的数据。如果有一个PCI设备在node0上,就用node0上的核来处理该设备,处理该设备用到的数据结构和数据缓冲区都从node0上分配。以下是一个分配本地内存的例子:
/* allocate memory for the queue structure */
q = rte_zmalloc_socket("fm10k", sizeof(*q),  RTE_CACHE_LINE_SIZE, socket_id);

该例试图分配一个结构体,通过传递socket_id,即node id获得本地内存,并且以Cache行对齐。

相关文章
|
5月前
|
存储 缓存 安全
从原理到实践:掌握DPDK内存池技术(下)
从原理到实践:掌握DPDK内存池技术
|
5月前
|
存储 缓存 Unix
从原理到实践:掌握DPDK内存池技术(上)
从原理到实践:掌握DPDK内存池技术
|
3月前
|
Ubuntu
[DPDK] dpdk测试收包
[DPDK] dpdk测试收包
|
3月前
|
存储 API 开发者
学习spdk
学习spdk
|
8月前
|
存储 缓存 Linux
Linux用户态协议栈与DPDK构建高性能应用
本文深入探讨了如何利用Linux用户态协议栈与DPDK构建高性能应用的方法和技巧。在现代网络编程中,性能是至关重要的,特别是在需要处理大量并发连接的场景下。传统的内核态网络栈在面对高负载时可能会遇到性能瓶颈,而本文介绍了如何借助用户态协议栈和DPDK来突破这些限制。从零开始搭建一个基于用户态协议栈和DPDK的网络应用并不是一件容易的事情,但本文将通过实际示例和步骤指导读者完成这一过程。最后,本文总结了使用用户态协议栈和DPDK构建高性能应用的益处,并展望了这些技术在未来网络设计中的潜在作用。
340 0
Linux用户态协议栈与DPDK构建高性能应用
|
存储 缓存 负载均衡
《深入浅出DPDK》&《DPDK应用基础》读书笔记
《深入浅出DPDK》&《DPDK应用基础》读书笔记
《深入浅出DPDK》&《DPDK应用基础》读书笔记
|
人工智能 程序员 开发者
《深入浅出DPDK》—第2章2.5节Cache预取
以上章节讲到了多种和Cache相关的技术,但是事实上,Cache对于绝大多数程序员来说都是透明不可见的。程序员在编写程序时不需要关心是否有Cache的存在,有几级Cache,每级Cache的大小是多少;不需要关心Cache采取何种策略将指令和数据从内存中加载到Cache中;也不需要关心Cache何时将处理完毕的数据写回到内存中。
4454 0
|
JavaScript 前端开发 Linux
《Linux内核设计的艺术:图解Linux操作系统架构设计与实现原理》——3.2 内核第一次做进程调度
本节书摘来自华章计算机《Linux内核设计的艺术:图解Linux操作系统架构设计与实现原理》一书中的第3章,第3.2节,作者:新设计团队著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1429 0
|
网络协议 Linux 调度
《深入浅出DPDK》—第1章1.2节初识DPDK
本书介绍DPDK,主要以IA(Intel Architecture)多核处理器为目标平台。在IA上,网络数据包处理远早于DPDK而存在。从商业版的Windows到开源的Linux操作系统,所有跨主机通信几乎都会涉及网络协议栈以及底层网卡驱动对于数据包的处理。
7149 0