0 摘要
在边缘和雾计算环境中,通常会设计和测试实施调度和负载均衡解决方案的分布式算法。通常适用于该环境的操作范式要求用户调用最近的节点来执行任务,并且由于服务必须在一组节点之间分布,使用FaaS(函数即服务)的无服务器范式是最有前景的策略。基于这些前提条件,我们设计并实现了一个名为P2PFaaS的框架。该框架基于Docker容器构建,允许在一组节点之间实现完全分散的调度或负载均衡算法。通过依赖三个基本服务,即调度服务、发现服务和学习器服务,该框架允许实现任何类型的调度解决方案,即使基于强化学习。最后,该框架提供了一个即插即用的解决方案,可以在x86服务器和基于ARM的边缘节点(例如树莓派)上安装和测试。
软件描述
1.1 软件架构
- 调度器服务在端口18080上监听,并作为框架的入口,客户端可以通过REST API请求执行函数。
- 学习器服务在端口19020上监听,并实现了用于调度器服务进行调度决策的强化学习模型的训练和推断。
- 发现服务在端口19000上监听,并实现了节点的发现。
1.2 操作流程
- 客户端调用URL请求执行一个函数
- 采取操作(这里如果配置了基于RL的调度器,需将当前状态传递给 学习器服务,然后获得操作)
- 开始操作
- 可将请求转发到另一节点,通过http来调用
- 可将请求加入本地队列等待执行
- 拒绝请求
- 最终的函数执行通过向函数的容器发出http来调用,执行完毕后,输出数据转发给客户端
- 如果调度器基于RL,此时可进行模型的训练,调整模型参数
调度服务
调度器模块是用Go语言编写的。选择这种编程语言是因为它专门为Web服务器的开发而设计。
-
API模块:API模块在调度器服务中扮演重要角色,它处理来自客户端的API请求。
- 首先,它负责准备函数执行请求,包括根据请求参数和配置信息构建请求,并将其传递给实际的调度器进行处理。
- 其次,API模块还负责为配置更新准备有效载荷,即根据客户端的请求更新调度器的配置信息。
-
调度服务容器启动时,会启动两个线程
- Web服务器线程:负责处理HTTP API调用
- 工作线程:负责管理内部任务队列
-
调度器模块
- 设计目的:允许调度算法的可互换性,为此设置了调度接口,可以完成调度算法的实例化和配置
type scheduler interface { GetFullName() string GetScheduler() *types.SchedulerDescriptor Schedule(req *types.ServiceRequest) (*JobResult, error) }
- 调度函数实现对函数执行请求的有效调度,可以采取三种可能操作
- 拒绝请求:返回HTTP错误码500并关闭客户端请求
- 在当前节点执行请求:在本地进行排队
- 将请求转发到其它节点:再次使用调度函数来调度请求,但这次请求标记为“External”,请求的转发通过"API/Peer"模块实现
- 设计目的:允许调度算法的可互换性,为此设置了调度接口,可以完成调度算法的实例化和配置
-
队列模块:限制并行运行函数的数量,通常所说的节点中可以执行的并行任务数量的参数称为K。队列由一个实现生产者-消费者模式的线程管理。
- 采用上述方式实现的队列限制了并行性,针对没有相关计算能力的边缘设备
- 这种队列的设计与M/M/1/K和M/M/K/K队列模型相匹配,这些模型可以帮助设计者确定最佳的系统参数,以实现所需的性能和可靠性。
-
FaaS管理器模块:负责将函数执行请求转发到正确的FaaS函数容器。
- 该模块允许进一步解耦,可以使用不同的FaaS容器技术
- Docker自动完成将容器名称转换为FaaS容器的IP地址名称解析
- 该模块保证请求被正确地路由到相应的FaaS容器,从而实现高效的函数执行。
-
配置器模块:管理启动时的配置(称为 “静态”)和运行时的配置(称为 “动态”)
-
日志模块:过多的日志记录可能会减慢服务速度并增加任务的延迟
-
调度器服务模块和学习器服务模块:实现服务间的交互
学习器服务
-
该服务实现强化学习模型,用于进行调度决策
-
强化学习模型分为三个实体
- 状态:以字符串形式编码,包含当前节点的负载
- 动作:被映射为调度动作
- 奖励:奖励驱动学习过程,可以取决于总任务的时间
- 例如,如果任务在特定时间完成,可以给予正面奖励,为此,需要客户端能够训练模型,因为只有当函数输出到达客户端才能知道最终延迟
-
学习实体:封装成一个数据结构,包括
- EID:一个递增的编号
- 状态:一个字符串
- 动作:一个浮点数
- 奖励:一个浮点数
-
学习线程:学习过程由学习线程执行,它负责在所有所需的实体都存在时延迟训练。(这里不是很懂强化学习)
-
训练模型:跳了
发现服务
- 使用Go语言编写,目的是让节点了解他的邻居。
- 该服务基于八卦算法(gossip algorithm)在启动时必须通过另一个节点的IP(称为“初始服务器”)进行配置。
影响
-
这项工作中提出的P2PFaaS框架可能是第一个开源可用的框架,它通过采用完全去中心化(对等)方案,实现了节点之间的分布式调度和负载平衡算法的实现。
-
该框架对于该领域的研发人员(设计和测试实施调度和负载均衡解决方案的分布式算法),可以用于测试设计的算法是否能够在真实设备上进行可能的实现,,以及在哪些条件下它们可以工作
-
由于代码的可移植性,P2PFaaS也很容易在多个SoC计算机(如树莓派)上部署,通过利用OpenBalena来避免使用虚拟机,以便在真实计算机设备上测试算法
-
在真实设备上测试这种类型的算法对研究和特别是算法设计有明显的影响。真实环境的一系列条件和特殊特征往往无法通过模拟和数学模型轻易掌握。
结论
-
本论文中,我们介绍了P2PFaaS框架,这是一个软件套件,可用于在一组真实节点之间测试和评估调度和负载均衡算法。我们展示了该框架的基本特点,包括模块化、可移植性以及通过设计的接口轻松更改核心调度算法的可能性。我们还详细介绍了组成框架的三个服务:调度器、学习器和发现服务。
-
对该框架的进一步改进主要朝着两个方向进行。
- 第一个方向是改进服务迁移的管理,通过支持动态函数分配和可用性来实现。
- 第二个方向涉及绿色边缘计算,目前正在开发额外的模块,以允许评估考虑节点能量方面的调度和负载均衡算法。
专有名词理解
边缘计算和雾计算
-
边缘计算(Edge Computing)侧重于将计算和数据处理推向物理世界的边缘,即接近数据生成源头的位置。边缘计算将计算任务和数据处理分布在边缘设备、边缘节点或边缘服务器上,以实现低延迟、实时性和快速响应的数据处理。它强调将计算资源尽可能靠近数据源,以减少数据传输延迟和网络拥塞,并支持一些特定的边缘应用场景,如智能交通、物联网、智能工厂等。边缘计算更注重在边缘节点上进行本地计算和决策,将关键的数据处理任务尽可能地下沉到边缘,减少对云端的依赖。
-
雾计算(Fog Computing)是一种介于边缘和云之间的计算模型,弥补了边缘设备和云数据中心之间的距离。雾计算引入了中间层的雾节点(Fog Node)或边缘节点(Edge Node),这些节点位于边缘设备和云数据中心之间,用于处理边缘设备生成的数据和提供边缘服务。雾计算的目标是解决传统云计算模型中的一些挑战,如高延迟、带宽限制和网络拥塞。它通过将计算和存储资源推向边缘,减少数据传输到云端的时间,提供更快速的数据处理和更高带宽的支持。
-
虽然边缘计算和雾计算有一些相似之处,例如将计算资源放置在边缘设备附近、提供低延迟的数据处理等,但也存在一些区别:
-
范围和位置:边缘计算更注重在物理世界的边缘部署计算资源,即离数据生成源头较近的位置。而雾计算更关注于边缘设备和云数据中心之间的中间层,即雾节点,这些节点位于边缘和云之间的位置。
-
任务分发和处理:边缘计算侧重于在边缘节点上进行本地计算和决策,将关键的数据处理任务下沉到边缘。而雾计算更倾向于在雾节点上进行边缘设备生成数据的处理和分析,同时提供边缘服务。
-
应用场景:边缘计算更适用于对实时性、低延迟和快速响应有较高要求的应用场景,如智能交通、物联网等。而雾计算更关注于在边缘设备和云之间提供更灵活和高效的计算模型,适用于智能城市、工业物联网等场景。
-
综上所述,边缘计算和雾计算都是为了满足分布式计算需求而提出的模型,它们在计算资源的位置、任务分发和处理方式以及适用的应用场景上有一些不同。根据具体的应用需求和场景特点,可以选择合适的计算模型来满足需求。
WebSocket池
-
WebSocket池(WebSocket Pool)是一种管理和复用WebSocket连接的机制。在使用WebSocket与服务器进行实时通信时,每次创建和关闭WebSocket连接都会产生一定的开销,特别是在高并发场景下,频繁创建和关闭连接可能会对服务器的性能和资源造成负担。
-
为了避免频繁地创建和关闭WebSocket连接,可以使用WebSocket池来管理这些连接。WebSocket池维护一组预先创建的WebSocket连接,并在需要时将连接提供给应用程序使用,而不是每次都重新创建连接。当应用程序完成使用后,连接会被放回池中,以备下次使用。
-
WebSocket池的好处包括:
- 减少连接创建和关闭的开销:通过复用连接,可以减少每次创建和关闭连接所需的时间和资源消耗,提高服务器的性能和资源利用率。
- 提高响应速度:由于连接已经建立,可以立即开始进行通信,而不需要等待连接建立的时间,从而减少了通信的延迟。
- 控制连接数:通过维护连接池,可以限制并发连接的数量,避免服务器过载或资源耗尽的情况发生。
Go语言
- Go语言(也称为Golang)是一种开源编程语言,由Google开发。它具有高效的并发性能和内置的网络库,使其非常适合构建高性能的Web服务器和分布式系统。Go语言的设计目标之一是简单易用,同时也注重代码的可读性和可维护性。
- 调度器模块的编写采用Go语言,这意味着该模块可以利用Go语言的特性和生态系统,快速地处理并发请求、提供网络服务,并具备良好的性能和可靠性。通过使用Go语言编写调度器模块,可以更容易地构建可扩展的、高效的Web服务器,并实现可靠的任务调度和资源分配功能。
M/M/1/K和M/M/K/K队列模型
M/M/1/K和M/M/K/K队列模型是用于描述排队系统的数学模型。
- 其中"M"代表到达率和服务率都是随机的泊松分布,"1"代表只有一个服务台,"K"代表系统容量,即队列的最大长度。当队列长度达到K时,新到达的请求将被拒绝。
- 在M/M/K/K模型中,"K"代表服务台的数量,即系统可以同时服务的最大请求数量。
- 这些模型可以用于评估系统的性能,并帮助设计者确定最佳的系统参数,以实现所需的性能和可靠性。
强化学习
- 强化学习(Reinforcement Learning)是一种机器学习的分支,其目标是通过代理与环境的交互来学习最优行为策略。在强化学习中,代理通过观察环境的状态并执行动作,从环境中接收奖励信号来评估其行为的好坏,然后根据奖励信号调整其策略,以最大化长期累积奖励。
- 强化学习的核心概念包括状态(State)、动作(Action)、奖励(Reward)和策略(Policy):
- 状态(State):代表环境的当前情况或特征。它可以是离散的或连续的,并且通常由观察到的环境信息来表示。
- 动作(Action):代理在给定状态下可以执行的操作或决策。动作可以是离散的或连续的,具体取决于问题的性质。
- 奖励(Reward):代表代理在执行动作后从环境中获得的即时反馈。奖励可以是正面的、负面的或零,用于指导代理的学习过程。
- 策略(Policy):代理的策略定义了在给定状态下选择动作的方式。策略可以是确定性的(确定选择一个动作)或概率性的(以一定概率选择不同的动作)。
- 强化学习的核心挑战是在未知环境中通过与环境的交互来学习最优策略。代理通过尝试不同的动作,并根据获得的奖励信号来调整策略。在学习过程中,代理会通过探索(Exploration)和利用(Exploitation)的权衡来平衡对新动作的探索和对已知高奖励动作的利用。
- 强化学习方法包括基于值函数的方法(如Q-learning和Sarsa)和基于策略的方法(如Policy Gradient和Actor-Critic)。近年来,深度强化学习(Deep Reinforcement Learning)结合了深度神经网络和强化学习的方法,使得代理能够从原始感知输入中学习,并在复杂的任务中取得了重大突破。
- 强化学习在许多领域有着广泛的应用,包括机器人控制、游戏玩法、自动驾驶、金融交易等。它具有通过与环境的交互学习最优策略的能力,使得它成为解决许多复杂问题的有效工具。
八卦算法(gossip algorithm)
- 八卦算法(Gossip Algorithm)是一种分布式算法,用于在一个大规模的系统中进行信息传播和共享。它的设计灵感来源于人们在日常生活中进行谣言传播的行为,因此得名为"八卦算法"。
- 八卦算法的基本思想是通过节点之间的随机通信来传播信息。每个节点都维护一个局部的信息视图,包含了一部分已知节点的信息。在每一轮通信中,节点随机选择一个邻居节点,并向其发送自己所知道的信息。接收节点会将发送节点的信息与自己已知的信息进行合并,并将自己所知的信息继续传播给其他随机选择的邻居节点。通过不断的随机通信和信息传播,整个系统中的节点逐渐将信息进行共享,从而达到全局信息的一致性。
- 八卦算法的特点和优势包括:
- 去中心化:八卦算法不依赖于中心节点或全局控制节点,每个节点都可以进行信息的传播和接收,从而实现了去中心化的通信和共享。
- 随机性:算法中的随机选择邻居节点的步骤使得信息能够快速传播到整个系统中,同时避免了某些节点成为瓶颈或集中点。
- 容错性:八卦算法具有一定的容错性,即使在系统中存在一些故障节点或通信延迟,整个系统仍然能够保持信息的传播和一致性。
- 可扩展性:八卦算法适用于大规模系统,随着节点数量的增加,算法的性能和效果并不会显著下降。
- 八卦算法在分布式系统中有广泛的应用,例如数据复制、一致性维护、状态同步等。它提供了一种简单而有效的方式来实现节点之间的信息共享和传播,并在分布式环境中实现了一致性和可靠性。
Soc计算机
-
SoC(System-on-a-Chip)计算机是一种集成了处理器、内存、存储、通信接口和其他相关组件的单芯片计算机系统。它将多个功能单元集成到一个芯片上,具有较小的尺寸和较低的功耗。SoC计算机通常用于嵌入式系统、移动设备和物联网应用中,因为它们提供了高度集成和高效的计算能力。
-
树莓派(Raspberry Pi)是一种知名的SoC计算机,由树莓派基金会开发。它以其低成本、小巧的尺寸和广泛的可扩展性而受到广泛关注。树莓派计算机具有基于ARM架构的处理器、内存、存储、通信接口和各种输入输出端口,可以运行不同的操作系统和应用程序。由于其易于使用和开放的设计,树莓派成为学习计算机科学和物联网开发的理想平台之一。
OpenBalena
- OpenBalena是一个开源的物联网平台,用于管理和部署容器化应用程序到大规模的嵌入式设备集群,其中包括树莓派等SoC计算机。它是Balena(前身为Resin.io)的开源版本,旨在提供一个灵活的解决方案,使开发者能够轻松地管理和远程部署应用程序到物联网设备。
- 通过OpenBalena,用户可以创建和管理设备群组、监控设备状态、远程部署应用程序、执行设备管理任务等。它提供了一套完整的工具和API,使得将应用程序部署到物联网设备变得简单和可扩展。
- 使用OpenBalena可以极大地简化物联网设备的管理和部署过程,尤其对于大规模的设备集群而言。它提供了可视化的界面和命令行工具,使用户能够轻松地管理和监控设备,同时支持自动化部署和更新应用程序。