burst buffer技术初探

news2024/11/20 8:27:15

        burst buffer是超算中一种作业加速技术,主要解决全球气候模拟预测建模、流体力学分析、磁性融合、天体物理学、生物分子模拟中浪涌型I/O的情况,burst buffer作为前端计算和后端存储之间的缓冲区,它弥合了计算节点的处理速度与存储系统的I/O带宽之间的性能差距。 burst buffer通常由高性能存储设备阵列构建,例如 NVRAM 和 SSD。 它可以提供比后端存储系统高一到两个数量级的 I/O 带宽。

1.burst buffer简介

1.1 burst buffer应对的技术场景

        许多科学领域越来越多地使用高性能计算(HPC)来处理和分析大量的实验数据,存储也面临着更复杂的模式,这些模式包括许多元数据操作、小型I/O请求或随机的文件I/O;今天的HPC环境中的存储系统必须应对新的访问模式,而通用的并行文件系统虽然优化了对大文件的顺序共享访问,但是面对浪涌型I/O仍然捉襟见肘,burst buffer技术应运而生。burst buffer一般是一个单独的文件系统,应用程序可以用他来存储临时数据,它聚集了计算节点的高速本地存储,或使用专用的SSD集群,提供高于后端带宽的峰值从而实现对作业应用的加速。

1.2 burst buffer为何使用nvme作为缓冲区

        在计算机中存储器一般使用CPU寄存器-cache缓存-内存-硬盘四级结构,容量越大其速度也就相对越低,但同时价格也会越便宜,机械硬盘具有数据存储的安全性,容量可以做到很大,而固态硬盘由于其有限的读写寿命作为后端存储必然不能保证用户数据的安全性,这也是当前机械硬盘作为大多数集群后端存储的原因。然而固态硬盘的随机读写性能有着天然的优势,能够大大加速文件的写入和读取过程;而内存虽然速度更快,但是由于容量限制和价格因素不是作为burst buffer的首选,因此现在大部分集群都是使用固态硬盘作为burst buffer缓冲区。

2. 超算中一些常用的burst buffer技术

        burst buffer的重要性不言而喻,在世界顶级超算中多数都有部署burst buffer,如Frontier、summit、NERSC、BSC、CCS都是使用NVME作为突发缓冲区进行加速,burst buffer技术分类可以有多种,这里根据SSD使用类型归类。

①专用的SSD(NVME)集群,提供独立的文件系统。如克雷公司的DATAWARP,计算节点和burst buffer之间的数据移动需要通过网络,这种方式方便了burst buffer服务的独立开发、部署和维护。

②聚合计算节点的SSD(NVME)硬盘,提供burst buffer缓冲区。如spectral、GekkoFS、burstFS等等。这种架构随着计算节点数量增加,带宽线性增加,具有很强的可伸缩性。

Butst buffer类型

磁盘类型

文件系统

POSIX支持性

典型超算或机构

cray DATAWARP

专用SSD集群

分布式

支持

NERSC

Spectral

计算节点本地NVME盘

非分布式

不支持

summit

GekkoFS

计算节点本地NVME盘

分布式

支持

BSC

BurstFS

计算节点本地NVME盘+DRAM

分布式

支持

Florida State University、LLNL

Gfarm/BB

计算节点本地NVME盘

分布式

支持

Center for Computational Sciences

下面我们对这些常见的burst buffer技术进行一一介绍。

2.1 cray DATAWARP

DATAWARP方案是使用一批专用的计算节点构成burst buffer缓冲区,当作业被提交时,作业所在计算节点会创建DWFS(并行文件系统),之后将后端存储中作业所用到的数据移动到DWFS中。示意图如下:

 当作业运行时,作业将把DWFS进行挂载,应用程序通过标准的POSIX协议与DWFS进行交互。

 完成作业过程:将作业数据移动到后端存储,销毁和作业相关数据池。

随着DATAWARP的SSD节点逐渐增加,burst buffer的写入能力逐渐增加。具体数据见下图。

2.2 spectral

Spectral是一个可移植的、透明的中间件库,可以在集群上使用节点本地的burst buffers(由nvme硬盘组成)来加速应用输出。它用于将文件从节点本地的NVMe盘传输回并行文件系统,Spectral在每个预留节点的隔离核心上运行,所以它不占用资源,并且基于一些参数,用户可以复制到后端存储的指定文件夹。spectrald使用了LD_PRELOAD机制,LD_PRELOAD是个环境变量,用于动态库的加载,其加载顺序为:

LD_PRELOAD>LD_LIBRARY_PATH>/etc/ld.so.cache>/lib>/usr/lib

在启用spectral后,首先会对open函数进行拦截,将open函数打开的文件指针由后端存储重定向到burst buffer所在文件夹所在位置,之后write操作都是向burst buffer中写数据,此举能够大大加速文件的写操作。当触发close操作后,本次作业的加速过程宣告完成,clsoe经过重定向后会告知spectrald守护进程接手后续burst buffer数据向后端存储移动的操作,整个操作的流程图如下:

spectral随着节点数量的递增,在标准的IOR测试中,读写能力呈现明显的线性关系。

但是当前spectral是不完善的,如仅对写功能进行支持,且各节点的NVME存储空间相互独立,没有形成一个统一的文件系统,写入文件时不能多对一。而GekkoFS对这些问题有了进一步改善。

​​​​​​​2.3 GekkoFS

GekkoFS为用户提供一个临时的文件系统,这个文件系统聚合多个计算节点本地的nvme存储形成一个统一的命名空间,GekkoFS不提供复杂的锁机制,对于重叠的文件区域应该由应用程序本身确保没有冲突。GekkoFS的架构由两个主要部分组成:一个客户端库和一个服务器进程。如果想要使用GekkoFS必须在客户端安装GekkoFS的插件库,客户端插件库会拦截所有的文件系统操作,并在有必要的时候转发给GekkoFS守护进程。

GekkoFS客户端由三个部分组成:

1) 一个拦截接口,用于捕捉应用对GekkoFS的相关调用

2)一个文件映射,管理开放文件和目录的文件描述符,独立于内核。

3)一个基于RPC的通信层,将文件系统请求转发给本地/远程的文件系统。

对于文件系统操作被GekkoFS拦截后,会通过RPC消息转发到一些节点的GekkoFS守护进程,换句话说,GekkoFS使用伪随机分布将数据和元数据分散到所有节点上,每个客户端都能独立处理涉及文件系统操作的节点。为了实现大文件的均衡数据分配,数据请求会在分配前被分割成同等大小的块到组成文件系统计算节点。如果底层网络结构协议支持,客户端可以通过RDMA直接进行访问。

GekkoFS守护进程也是由三部分组成:

1) 一个用于存储元数据的键值存储。

2) 一个I/O持久层,用于从/向底层本地存储系统读/写数据。

3) 一个基于RPC的通信层,接受本地和远程连接来处理文件系统操作。

对于通信层,我们利用了Mercury RPC框架, Mercury是通过Margo库间接连接的,目的是提供一个简单的多线程执行模型。

和spectral类似,在读写情况下,GekkoFS 显示出接近线性的可扩展性,其可用带宽和存储能力随着节点数量的增加而增加。

​​​​​​​2.4 Gfarm/BB

Gfarm/BB是一个利用节点本地存储系统的burst buffer文件系统,该临时文件系统仅在作业运行期间有效,在作业执行之前按需构建。为了提高读写性能,它利用了文件描述符传递和远程直接内存访问 (RDMA)。下图是Gfarm的架构图。

它由元数据服务器(gfmds)、文件系统服务器(gfsds)和客户端(应用程序)组成。 元数据服务器由一个主 gfmd、多个同步从属 gfmd 和多个异步从属 gfmds 组成,用于实时故障转移和灾难恢复。 每个 gfmd 在内存中管理最新的文件系统元数据,并将更新保存到一个日志文件中,该日志文件将异步反映到后端 PostgreSQL 数据库。更新也被传输到从属 gfmds。 主 gfmd 等待来自同步从属 gfmds 的响应,但不等待来自异步 gfmds 的响应。 gfsd 是运行在每个计算节点上的文件服务器,用于从远程节点访问节点本地存储。 在每个计算节点上,Gfarm 文件系统由 gfarm2fs 挂载用于 POSIX及 Gfarm API 访问。应用的读写操作通过POSIX及 Gfarm API 接入Gfarm/BB,通过libgfarm调用I/O库函数使用gfsds。

读写带宽和节点数量之间的关系如下图所示。

​​​​​​​2.5 burstFS

burstFS是一个分布式的文件存储系统。下图是burstFS的设计架构;

BurstFS建立在CRUISE之上,CRUISE是一个在支持检查点重新启动工作负载的文件系统。CRUISE会拦截应用程序的POSIX函数调用,并同时利用DRAM和SSD存储,将每个进程的数据写入本地存储,这种方式表明CRUISE有强大的可扩展性。CRUISE的模式为N-N写,其中N个进程各自写一个单独的文件,而对于N-1模式写,即N个进程写到一个共享文件,效率较低。当前所面临的主要的挑战是索引以及巨大数量的聚合文件都会导致产生大量的元数据; BurstFS将这种元数据记录到分布式键值存储中;此外,允许进程通过RDMA从远程节点检索数据。由于在HPC系统中BurstFS的寿命与单个作业相关。在每个作业结束时,所有的数据都会被清理掉。

从下图可以看到,对于N-1模式而言,BurstFS对于CRUISE有较大的提升,且随着节点的增加BurstFS的带宽随着节点逐渐增强。

​​​​​​​3. slurm与burst buffer的集成

在slurm21版本中集成了对burst buffer插件的支持,包含两种分别是cray的datawarp和通用插件lua,cray需要特定硬件支持,上面已经介绍过其基本原理,这里主要介绍lua插件。lua插件提供一下多个可供二次开发的函数,分别处于作业的不同阶段运行,大部分的lua函数是由slurm中的slurmscriptd守护进程在管理节点进行调用。slurmscriptd调用流程随slurmctld主进程启动,具体流程图如下所示:

在该流程中主要对资源池进行初始化

对于lua其他函数的调用流程如下表所示:

burst_buffer.lua调用时刻表(基于slurm21.08)

函数名称

调用时段

可以获取变量

slurm_bb_pools

slurmctld启动时,burst buffer插件初始化时调用

slurm_bb_job_process

作业提交时,在进入select_nodes之前

job_script脚本内容(spool目录下)

slurm_bb_setup

当作业pending时,此时在select_nodes函数中,尚未分配nodelist

job_id、job_script

slurm_bb_data_in

在调用slurm_bb_setup之后

job_id、job_script

slurm_bb_real_size

在调用slurm_bb_data_in之后

job_id

slurm_bb_paths

作业处于“running+configuring”状态,此时在select_nodes函数中,可重新请求burst buffer资源。此时尚未分配计算节点列表(即将分配)。

job id、job script、job script的路径相同,path file为可设置的环境变量

slurm_bb_pre_run

作业处于scheduled后,作业running前,此时在select_nodes函数中,计算节点分配完成后立即调用本函数。

job_id、job_script

slurm_bb_post_run

在作业完成后调用,作业处于stage out,当slurmctld收到REQUEST_COMPLETE_JOB_ALLOCATION执行。

job_id、job_script

slurm_bb_data_out

调用slurm_bb_post_run后

job_id、job_script

slurm_bb_job_teardown

作业处于completes or cancelled

job_id、job_script

slurm_bb_get_status

运行“scontrol show bbstat”

这些lua函数对应于slurm中burst_buffer.c通用函数

static const char *req_fxns[] = {

       "slurm_bb_job_process",

       "slurm_bb_pools",

       "slurm_bb_job_teardown",

       "slurm_bb_setup",

       "slurm_bb_data_in",

       "slurm_bb_real_size",

       "slurm_bb_paths",

       "slurm_bb_pre_run",

       "slurm_bb_post_run",

       "slurm_bb_data_out",

       "slurm_bb_get_status",

       NULL

};

这些函数可以分成slurmctld和slurmscriptd两种进程调用,一般来说slurmctld调用的函数需要快速返回值,不能在函数中消耗太多时间,而slurmscriptd进程调用的函数则没有此要求。下面我们对这些函数流程进行一一梳理。

​​​​​​​3.1 slurm_bb_pools

bb_p_load_state调用burst_buffer.lua脚本中的slurm_bb_pools(),获取资源池的容量,该函数在slurmctld初始化时调用。调用函数流程关系如下所示(由slurmctld进程调用)。slurmctld守护进程启动的过程中会创建一个关于burst buffer的新线程_bb_agent,该线程主要用来定期更新资源池的容量。

​​​​​​​3.2 slurm_bb_job_process

bb_p_job_validate2调用burst_buffer.lua脚本中的slurm_bb_job_process该函数在作业提交时调用(在建立作业ID和创建脚本文件后执行),对申请burst buffer作业资源进行验证,(由slurmctld进程调用)

​​​​​​​3.3 slurm_bb_setup

slurm_bb_setup由bb_p_job_test_stage_in调用的函数触发,在select_nodes函数中检查完qos、分区的可用性后。slurmctld向slurmscritd发送SLURMSCRIPTD_REQUEST_RUN_BB_LUA类型信息,并包含slurm_bb_setup函数名;slurmscritd中调用_run_bb_script执行burst_buffer.lua中slurm_bb_setup。函数在PD过程中调用(由slurmscriptd进程调用)。流程图如下:

​​​​​​​3.4 slurm_bb_data_in

slurm_bb_data_in紧接着slurm_bb_setup函数运行,此时作业仍处于PD状态,都在static void *_start_stage_in(void *x)函数中,此时可以将作业所需的数据移动到指定位置(由slurmscriptd进程调用)。

​​​​​​​3.5 slurm_bb_real_size

slurm_bb_real_size紧跟着static void *_start_stage_in(void *x)函数中的slurm_bb_data_in调用,携带发送信息op = "slurm_bb_real_size";(由slurmscriptd进程调用)。

​​​​​​​3.6 slurm_bb_paths

slurm_bb_paths对应bb_p_job_begin,请求burst buffer资源。此时尚未分配计算节点列表(即将分配),其中该函数可以传入path_file,path_file指定的文件是一个空文件。如果将环境变量写入path_file,则将这些环境变量添加到作业的环境中。仍在select_nodes函数中(由slurmctld进程调用)。

​​​​​​​​​​​​​​

​​​​​​​3.7 slurm_bb_pre_run

slurm_bb_pre_run由slurm_bb_paths所在函数调用新线程_start_pre_run。在_start_pre_run中等待计算节点分配完成。然后向slrumscriptd中发送消息,调用slurm_bb_pre_run函数(由slurmscriptd进程调用)。

3.8 slurm_bb_post_run

slurm_bb_post_run由bb_p_job_start_stage_out函数调用。在作业完成后调用,当slurmctld收到REQUEST_COMPLETE_JOB_ALLOCATION执行_slurm_rpc_complete_job_allocation函数(由slurmscriptd进程调用)。

3.9 slurm_bb_data_out

slurm_bb_data_out紧跟slurm_bb_post_run后调用,一般作业数据输出文件移动到后端存储可以调用此函数(由slurmscriptd进程调用),流程图如下。

3.10 slurm_bb_job_teardown

slurm_bb_job_teardown在完成slurm_bb_data_out后,_queue_teardown

(stage_out_args->job_id,stage_out_args->uid, false);启用新线程_start_teardow调用slurm_bb_job_teardown函数(由slurmscriptd进程调用),可用于清理环境变量或校准等操作。

3.11 slurm_bb_get_status 

由scontrol show bbstat触发。slurmctld接收到REQUEST_BURST_BUFFER_STATUS类型的RPC后(由slurmscriptd进程调用)。

​​​​​​​4.小结

        通过介绍常见的burst buffer技术以及slurm中burst buffer插件可知,目前slurm已经预留好相当多的函数(lua)供我们自定义开发,burst buffer本身就是数据在作业不同生命周期数据的移动,我们只要在slurm中lua函数中契合所采用的burst buffer的技术特点,就能实现作业在运算过程中加速或者从检查点数据恢复。

        Slurm调度系统是当前调度系统中少有的开源且成熟的调度系统,但是仍然有少量bug的存在,且不能完全覆盖所有的用户场景,如果您有问题请加入社区讨论。社区以Slurm为切入口讨论HPC相关问题,致力于守卫中国HPC集群稳定运行,推广国产调度器助力中国HPC进步。欢迎私信。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/81907.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Nature:重磅,找到终结新冠的药了,关闭ACE2受体,防止所有变体

新冠病毒,通常通过呼吸道感染人类,并造成呼吸系统和人体各个器官的损伤。自2019年底首次爆发至今,新型冠状病毒仍在全球肆虐,对世界经济、社会造成极大的负面影响。随着新冠病毒的大规模流行,新的病毒突变株不断出现&a…

智能座舱开启「万物交互」新革命,隐形冠军们如何突围?

伴随智能座舱在市场端逐步深入消费者心智,从显示、语音到视觉交互,各细分赛道都在蓬勃发展。 高工智能汽车研究院监测数据显示,2022年1-10月,智能座舱前装搭载量同比增长58.06%%,高阶智能座舱同比增长137.61%&#xf…

老大难的 Java ClassLoader 再不理解就老了

ClassLoader 是 Java 届最为神秘的技术之一,无数人被它伤透了脑筋,摸不清门道究竟在哪里。网上的文章也是一篇又一篇,经过本人的亲自鉴定,绝大部分内容都是在误导别人。本文我带读者彻底吃透 ClassLoader,以后其它的相…

【网络编程】servlet和session

一、servlet 问题一:两个不同客户端请求同一个 servlet,是创建了两个一模一样的 servlet,然后用完之后全部销毁呢,还是只要一个 servlet,tomcat 开启时创建,关闭时销毁? 结论:当 Tomcat 接收…

后端存储实战课——海量数据篇

海量数据导致存储系统慢 拆,将一大坨数据拆分成 N 个小坨,学名「分片」。 归档历史数据 将大量的不常用的历史数据移到另外一张历史表中,大概流程: 批量删除大量数据 不能一次性直接删除,需要分批删除(…

SpringBoot【创建与使用】

SpringBoot【创建与使用】🍎一.SpringBoot是什么🍒1.1 SpringBoot的优点🍎二.SpringBoot的创建🍒2.1 使⽤ Idea 中央源创建🍉2.1.1 下载插件🍉2.1.2 创建项目🍉2.1.3 项目的加载🍉2.…

倪健中:全球元宇宙与中国文化精神 | 钱学森诞辰111周年系列活动开幕仪式

编者按: 倪健中会长出席纪念“中国元宇宙之父”钱学森诞辰111周年线上开幕式并发表了云致辞。 在致辞中,倪会长高度崇敬和赞扬钱学森对中国元宇宙事业做出的伟大贡献。我们因钱老的伟大思想,在探索元宇宙与中国传统文化哲学的融合进程中&…

【Kafka从成神到升仙系列 五】面试官问我 Kafka 生产者的网络架构,我直接开始从源码背起.......

👏作者简介:大家好,我是爱敲代码的小黄,独角兽企业的Java开发工程师,CSDN博客专家,Java领域新星创作者📕系列专栏:Java设计模式、数据结构和算法、Kafka从入门到成神、Kafka从成神到…

Spring 6 源码编译和高效阅读源码技巧分享

一. 前言 Spring Boot 3 RELEASE版本于 2022年11月24日 正式发布,相信已经有不少同学开始准备新版本的学习了,不过目前还不建议在实际项目中做升级,毕竟还有很多框架和中间件没出适配版本。此次Spring Boot里程碑的升级也要求了最低JDK 17 和…

风靡互联网关键词 Web3.0 | 区块链 | 元宇宙……

💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! Web web是互联网的总称,全称为World Wide Web,缩写WWW ,即全球广域网,也称为万维网,它是一种基于超文本和H…

nacos--基础--1.4--理论--原理

nacos–基础–1.4–理论–原理 1、基本架构 2、Nacos 原理 2.1、信息的同步主要的几种方式 push (服务端主动push)pull (客户端的轮询), 超时时间比较短long pull (超时时间比较长) 2.2、配置中心原理 nacos 配置中心就是采用:客户端 long pull 的方式…

新体制SAR——BiDi SAR

1. 概述 TerraSAR的相控阵天线具备方位向和距离向二维电扫能力,在这一能力的基础上,TerraSAR可以工作在条带模式、ScanSAR模式、滑聚模式和TOPS模式(TOPS是实验模式,不是主模式)。载荷的PRF可以设计在3-6.5kHz&#xf…

【笔试强训】Day 7

🌈欢迎来到笔试强训专栏 (꒪ꇴ꒪(꒪ꇴ꒪ )🐣,我是Scort目前状态:大三非科班啃C中🌍博客主页:张小姐的猫~江湖背景快上车🚘,握好方向盘跟我有一起打天下嘞!送给自己的一句鸡汤&#x…

安科瑞AcrelEMS-SW智慧水务能效管理平台解决方案

系统概述 安科瑞电气具备从终端感知、边缘计算到能效管理平台的产品生态体系,AcrelEMS-SW智慧水务能效管理平台通过在污水厂源、网、荷、储、充的各个关键节点安装保护、监测、分析、治理装置,用于监测污水厂能耗总量和能耗强度,重点监测主要…

2022年史上最全Java面试题:数据结构+算法+JVM+线程+finalize+GC

基本概念 操作系统中 heap 和 stack 的区别 什么是基于注解的切面实现 什么是 对象/关系 映射集成模块 什么是 Java 的反射机制 什么是 ACID BS与CS的联系与区别 Cookie 和 Session的区别 fail-fast 与 fail-safe 机制有什么区别 get 和 post请求的区别 Interface 与 …

服务端高并发分布式架构演进之路

1. 概述 本文以淘宝作为例子,介绍从一百个到千万级并发情况下服务端的架构的演进过程。同时列举出每个演进阶段会遇到的相关技术,让大家对架构的演进有一个整体的认知。文章最后汇总了一些架构设计的原则。 特别说明:本文以淘宝为例仅仅是为…

如何入门学python,这是很值得借鉴的学习方法

前言 众所周知,python的应用领域十分广泛,无论是对于专业的程序员还是从事其他工作的人,python这门编程语言都非常值得学习。 但对于零基础的人来说,该如何入门python编程呢? 虽然现在网上有关python编程的教程很多…

PyFlink系列之一:PyFlink安装和PyFlink使用的详细技术

PyFlink系列之一:PyFlink安装和PyFlink使用的详细技术一、下载PyFlink二、创建TableEnvironment三、TableEnvironment API1.Table/SQL 操作2.执行/解释作业3.创建/删除用户自定义函数4.依赖管理5.配置四、Catalog APIs五、Statebackend,Checkpoint 以及重…

小程序图片加载失败binderror方法处理

场景:我们在小程序项目中的一个图片列表,当某些图片加载失败后,直接显示空白,这样用户体验不好,为了解决当图片加载失败,我们给一个默认图片代替,参考官方给的图片加载失败的处理方法&#xff1…

C51单片机开发程序报错 main.c (11) : error C267 : ‘Func‘ : requires ANSI-style prototype

问题 C51单片机开发程序报错 main.c (11) : error C267 : Func : requires ANSI-style prototype详细问题 问题一 问题二 问题三 可能原因一 函数定义声明处(.h文件中)与主函数中函数(函数名/参数类型/返回值类型)不一致 解决…