雷竞技 结算快吗扳手102.

工作流管理系统(WMS)是制作所有决策的软件,并采用使用Cyber​​Infrasture Services执行工作流程的所有操作。因此,每个扳手模拟器都是一个重要的部件。雷竞技 结算快吗雷竞技 结算快吗扳手没有提供任何WMS实现,但提供了开发自定义WMSS的手段。此页面旨在提供有关在扳手中实现WMS的高级和详细信息。雷竞技 结算快吗raybet电子竞技竞猜提供完整的API详细信息开发人员API参考


WMS实现的基本蓝图

一个WMS实现需要使用许多扳手类,这些类可以通过包含一个头文件来访问:雷竞技 结算快吗

#include <雷竞技 结算快吗wrench-dev.h>

WMS实现必须导出雷竞技 结算快吗扳手:: WMS.类,这意味着它可以覆盖几个虚成员函数,而且WMS是一个服务。因此,它有main ()执行如下简单循环的函数:

// a)获取有关运行服务的信息raybet电子竞技竞猜
While(工作流执行未完成/失败){
// B)与服务交互
// c)等待事件并对其作出反应
}

在接下来的三个部分中,我们将详细介绍如何在上面的代码中实现A、B和C。为提供上下文,我们在示例模拟器中经常引用WMS实现例子/目录中。然后是几个部分,重点介绍与WMS开发相关的特性和功能。

A)获取服务信息raybet电子竞技竞猜

发现运行服务

雷竞技 结算快吗扳手:: WMS.基类实现一组名为雷竞技 结算快吗扳手:: wms :: getavailablecomputeservices(),雷竞技 结算快吗扳手::WMS:: getAvailableStorageServices (),雷竞技 结算快吗扳手::WMS:: getAvailableNetworkProximityServices ()等。这些成员函数返回服务集,WMS可以使用这些服务集来执行其工作流。其中一些成员函数被模板化,以仅检索特定类型的服务。例如,雷竞技 结算快吗扳手:WMS:: getAvailableComputeServices< T > ()采用模板参数来检索特定类型的计算服务。在示例模拟器中/基本的例子/ bare-metal-chain例子,WMS实现OneTaskAtATimeWMS.cpp包括以下呼叫:

汽车compute_service = *(this-> getavailablecomputeservices ()。begin());

此调用存储WMS可用来执行工作流任务的第一个裸金属计算服务compute_service多变的。在此示例中,模拟器始终将一个裸机服务恰好传递给WMS,因此此代码有效。然而,雷竞技 结算快吗扳手:WMS:: getAvailableComputeServices< T > ()可以返回一个空集。

上面的成员函数(以及,例如,雷竞技 结算快吗扳手::仿真:: Add())返回共享指针(即,std::要查看< >)到服务实例。这是为了将开发人员从释放内存的责任中解放出来。

查找有关运行服务的信息raybet电子竞技竞猜

大多数服务类提供成员函数,以获取有关服务的功能和属性的信息。raybet电子竞技竞猜例如,一个雷竞技 结算快吗扳手:ComputeService有一个雷竞技 结算快吗扳手::ComputeService:: getNumHosts ()成员函数,返回服务总共可访问的计算主机数量。一个雷竞技 结算快吗扳手:StorageService有一个雷竞技 结算快吗扳手::StorageService:: getFreeSpace ()成员函数查找其上可用的空闲空间的字节数。等等……

要参加一个具体的例子,请考虑WMS实现例子/基本的例子/ batch-bag-of-tasks / TwoTasksAtATimeBatchWMS.cpp。这个WMS计算出a雷竞技 结算快吗扳手:BatchComputeService作为:

core_flop_rate = (* (batch_service - > getCoreFlopRate () .begin())),接着;

成员函数雷竞技 结算快吗扳手::ComputeService:: getCoreFlopRate ()返回按主机名索引的核心计算速度的映射(因此,映射中每个计算节点都有一个元素可供服务使用)。由于批处理计算服务的计算节点是同构的,所以上面的代码只是获取映射中第一个元素的核心速度值。

需要注意的是,这些成员函数实际上涉及到与服务的通信,因此会产生模拟的一部分开销(就像在现实世界中,您将通过网络请求信息来联系运行中的服务一样)。这就是为什么上面的代码行(在那个示例WMS中)只执行一次,核心计算速度存储在core_flop_rate在整个执行过程中,WMS重复使用变量。

b)与服务互动

WMS可以具有许多和复杂的服务交互,尤其是计算和存储服务。在本节中,我们描述了扳手如何使这些交互相对容易,为每种服务的各种交雷竞技 结算快吗互提供示例。

职位管理器和数据移动管理器

正如所预期的那样,每个服务类型都提供自己的API。例如,网络邻近服务提供了查询服务的主距离数据库的成员函数。的开发人员API参考提供所有必要的文档,其中还解释了哪些成员函数是raybet雷竞app同步的,哪些是异步的(在这种情况下有些是同步的事件将发生在未来)。然而,扳手开发人员会发现,雷竞技 结算快吗许多期望的成员函数都找不到。例如,计算服务没有提交工作流任务以供执行的成员函数!

上面的基本原理是许多成员函数需要异步,以便WMS可以同时使用服务。例如,WMS可以异步向两个不同的计算服务提交计算作业,然后等待完成其作业的服务,并在其他服务上取消作业。将这种异步到WMS暴露将要求扳手开发人员使用数据结构来执行正在进行的服务交互的必要簿记,以及从(模拟)网络上的服务或者交替地登雷竞技 结算快吗记许多回调的传入控制消息。相反,扳手提供雷竞技 结算快吗管理者。可以将管理器视为处理与服务的所有异步交互的独立线程,实现这些线程是为了方便您简化与服务的交互。

有两个经理:a作业管理器(类雷竞技 结算快吗扳手:: jobmanager.)和一个数据移动经理(类雷竞技 结算快吗扳手:DataMovementManager)。基地雷竞技 结算快吗扳手:: WMS.类提供了两个成员函数,用于实例化和启动这些管理者:雷竞技 结算快吗扳手:: wms :: createjobmanager()雷竞技 结算快吗扳手::WMS:: createDataMovementManager ()

创建这些管理器通常是WMS要做的第一件事。例如,WMS例子/基本的例子/ bare-metal-data-movement / DataMovementWMS.cpp首先做的事情:

汽车job_manager =这- > createJobManager ();
汽车data_movement_manager =这- > createDataMovementManager ();

每个管理器都有自己的文档化API,将在下面的章节中进一步讨论。

与存储服务交互

WMS和存储服务之间可能的交互包括:

  • 同步检查文件是否存在
  • 同步读取文件(很少被WMS使用,但是为了完整性包含在内)
  • 同步写入文件(很少被WMS使用,但为了完整性包含在内)
  • 同步删除文件
  • 将文件从一个存储服务同步复制到另一个存储服务
  • 异步将文件从一个存储服务复制到另一个存储服务

类的成员函数来完成上面的前4个交互雷竞技 结算快吗扳手:StorageService类。控件的成员函数来完成后两项操作雷竞技 结算快吗扳手:DataMovementManager类。其中一些成员函数接受可选参数雷竞技 结算快吗扳手:: filerEgistryService.参数,在这种情况下,它们还将更新文件注册表服务中的条目(例如,删除文件时删除条目)。

看到这一页有关与A相互作用的具体示例雷竞技 结算快吗扳手:: simporestorageService.

与计算服务交互

抽象的工作

WMS的主要活动是在计算服务上执行工作流任务。WMS必须创建“作业”,而不是直接将任务提交给计算服务,这些“作业”可以包含多个任务,并涉及数据复制/删除操作。作业抽象功能强大,在提供灵活性的同时极大地简化了WMS的任务。

扳手有两种工作:雷竞技 结算快吗雷竞技 结算快吗扳手:PilotJob雷竞技 结算快吗扳手:StandardJob。试点作业(在文献中有时称为“占位作业”)是一个主要与批调度相关的概念。简而言之,它是一种允许在后期将任务绑定到资源的工作。它被提交给一个计算服务(假设该服务支持试点作业),当它启动时,它看起来就像一个可以提交标准作业的临时(裸金属)计算服务。

最常见的工作是标准工作。标准作业是一个执行单位,由此,WMS告诉Compute服务进行一组操作。更具体地,在最完整的形式中,标准作业指定:

以上任何一种都可能是空洞的,极端的情况下,一份标准的工作什么也做不了。

通过作业管理器创建标准作业和导借作业,该作业管理器提供了一个雷竞技 结算快吗扳手::JobManager:: createPilotJob ()成员函数和几个版本的雷竞技 结算快吗扳手:: kobmanager :: createstandardjob()成员函数。简单地说,求职经理就是求职工厂。

作业管理器提供以下期望的成员函数:

下一节给出了与每种计算服务交互的许多示例。

点击以下链接,查看如何向每种计算服务类型提交作业的详细描述和示例:

与文件注册服务交互

与文件注册表服务的交互是简单的,通过直接调用的成员函数来完成雷竞技 结算快吗扳手:: filerEgistryService.类。请注意,通常文件注册表服务条目是自动管理的,例如通过调用雷竞技 结算快吗扳手:DataMovementManager雷竞技 结算快吗扳手:StorageService会员职能。因此,WMS通常不需要与文件注册表服务交互。

添加/删除文件注册表服务的条目如下所示:

fr_service = this-> getavailableFileRegistryService();
雷竞技 结算快吗扳手::WorkflowFile *some_file =…;
std::shared_ptr<雷竞技 结算快吗扳手::StorageService> some_storage_service =…;
[…]
fr_service - > addEntry (some_fi雷竞技 结算快吗le扳手::FileLocation::位置(some_storage_service));
fr_service - > removeEntry (some_fi雷竞技 结算快吗le扳手::FileLocatio::位置(some_storage_service));

雷竞技 结算快吗扳手:FileLocation类是某个存储服务中可用的文件副本的方便抽象。

检索给定文件的所有条目都如下所示:

[…]
std :: set >条目;
条目= fr_service-> lookupentry(some_file);

如果网络接近服务正在运行,则可以从某个引用主机检索按非减少接近度排序的文件条目。返回的条目存储在(排序)std ::地图其中密钥是到引用主机的网络距离。例如:

std::要查看<扳手:Netw雷竞技 结算快吗orkProximityService > np_service =
*(这个 - > getavailableenetworkproximityservices()。begin());
[…]
汽车条目= fr_service-> lookupentry(some_file,“ReferenceHost”, np_service);

查看文件raybet雷竞app雷竞技 结算快吗扳手:: filerEgistryService.获取更多API成员函数。

与网络邻近服务交互

查询网络邻近服务很简单。例如,为了获得主机“host1”和“host2”之间的网络距离,简单地执行:

std::要查看<扳手:Netw雷竞技 结算快吗orkProximityService > np_service =
*(这个 - > getavailableenetworkproximityservices()。begin());
距离= np_service - >查询(std:: make_pair (“Host1”,“Host2”));

此距离对应于两个主机之间的往返时间的一半,以秒为单位。如果服务被配置为使用基于VivalDi坐标的系统,如上所述,该距离实际上从网络坐标导出,如VivalDI算法所计算的。在这种情况下,实际上可以为任何给定的主机询问这些坐标:

STD :: Fiap Coords = NP_Service-> GetCoordInates(“Host1”);

查看文件raybet雷竞app雷竞技 结算快吗扳手:NetworkProximityService获取更多API成员函数。

c)工作流执行事件

因为WMS执行异步操作,所以它需要等待并重新采用事件。这是通过致电的雷竞技 结算快吗扳手:: wms :: witeforandprocessnextevent()由基函数实现的成员函数雷竞技 结算快吗扳手:: WMS.类。对该成员函数的调用将阻塞,直到发生某个事件,然后调用回调成员函数。类派生可能的事件类雷竞技 结算快吗扳手:: workflowexecutionevent.类,并且WMS可以覆盖每个可能事件的回调成员函数(默认成员函数除了打印一些日志消息外什么也不做)。这些可重写的回调成员函数是:

上面的每个成员函数都接受一个事件对象作为参数。在失败的情况下,事件包括雷竞技 结算快吗扳手:FailureCause对象,可以访问它以分析(或只是显示)失败的根本原因。

考虑WMS示例/基本实施例/裸金属袋 - 任务/ TwotasksataTimewms.cpp。每次迭代它的主循环都这样做:

//提交一些标准作业到一些计算服务
Job_Manager-> SubmitJob(...);
//等待并处理下一个事件
这个 - > waitforandprocessnextevent();

在这个简单的示例中,此时只会发生两个事件中的一个:标准作业完成或标准作业失败。因此,这个WMS覆盖了两个相应的成员函数,如下所示:

空白TwoTasksAtATimeWMS:: processEventStandardJobCompletion (
std::要查看< StandardJobCompletedEvent >事件){
//检索该事件对应的作业
汽车工作=事件- > standard_job;
//打印作业中每个任务的消息
(汽车 常量&task: job->getTasks()) {
STD :: CERR <<“通知一个标准作业已经完成任务”<< task->getID() << std::endl;
}
}
空白twotasksataTimewms :: processeventstandardjobfailure(
std :: shared_ptr 事件){
//检索该事件对应的作业
汽车工作=事件- > standard_job;
STD :: CERR <<“通知标准作业失败(失败原因:”;
STD :: CERR <<事件- > fally_cause-> toString()<<“)”< < std:: endl;
//如果作业失败,打印作业中每个任务的消息
STD :: CERR <<“结果,以下任务失败:”;
(汽车 常量&task: job->getTasks()) {
如果(task->getState != WorkflowTask::COMPLETE) {
STD :: CERR <<“ - ”<< task->getID() << std::endl;
}
}
}

您可以在上面的代码之间注意到一些差异示例/基本实施例/裸金属袋 - 任务/ TwotasksataTimewms.cpp。这是为了清晰起见,特别是因为我们还没有解释扳手如何进行消息日志记录。雷竞技 结算快吗看到关于日志记录的下一节raybet电子竞技竞猜

虽然上述回调是方便的,但有时需要更具手动做事。也就是说,等待事件,然后在WMS的主循环的代码中处理它,而不是在回调成员函数中处理。这是通过致电的雷竞技 结算快吗扳手:waitForNextEvent ()成员函数。例如,WMS例子/基本的例子/ bare-metal-data-movement / DataMovementWMS.cpp它是:

//启动异步文件副本
data_movement_manager - > initiateAsynchronousFileCopy(…);
//等待活动
汽车 事件=这- > waitForNextEvent ();
/ /处理事件
如果(汽车file_copy_completion_event = std :: dynamic_pointer_cas雷竞技 结算快吗t (事件)){
STD :: CERR <<“文件复制完成通知”;
std :: cerr << file_copy_completion_event->文件 - > getId()<<“按预期”< < std:: endl;
}别的{
std :: runtime_error(“意外事件(“+ +事件- > toString ()“)”);}
}

例外

扳手开发人员API中的大多数成员函数抛出异常。雷竞技 结算快吗实际上,上面的大多数代码片段应该是在尝试子句中,捕获这些例外。

一些例外对应于模拟工作流程执行期间的故障(即,在实际执行中发生的错误,因此是模拟的一部分)。每个这样的例外都包含一个雷竞技 结算快吗扳手:FailureCause对象,可以访问该对象以了解执行失败的根本原因。其他异常(例如,std:: invalid_arguments,std:: runtime_error)也被抛出,用于检测扳手API或内扳手误差的滥用。雷竞技 结算快吗

查找信息并与硬件资源进行交互

雷竞技 结算快吗扳手:模拟类提供了许多成员函数来发现关于(模拟的)硬件平台的信息并与之交互。raybet电子竞技竞猜它还提供了有关仿真本身的其他有用信息,如当前仿真日期。raybet电子竞技竞猜这些成员函数中有些是静态的,有些不是。的雷竞技 结算快吗扳手:WMS类包含一个模拟对象。因此,WMS可以调用- >模拟对象。例如,该代码片段显示了WMS如何弄清楚当前模拟日期,然后检查主机是否存在(给定主机名),如果是,则设置其pstate(电源状态)到最高可能设置。

的文档raybet雷竞app雷竞技 结算快吗扳手:模拟类获取所有细节。特别是关于主机pstate,请参见中的示例WMS例子/基本的例子/ cloud-bag-of-tasks-energy / TwoTasksAtATimeCloudWMS.cpp,它与宿主pstate(和示例/基本示例/云袋 - 任务 - Energy / four_hosts_energy.xml定义pstates的平台描述文件)。

调度器的决策

WMS所做的一部分是做出决定的很大一部分。它通常是关于决策算法(通常只称为“调度算法”)以跨多个WMS实现或用于单个WMS实现的即插即用的决策算法(通常被称为“调度算法”)。出于这个原因,雷竞技 结算快吗扳手:: WMS.构造函数用作参数两个对象(或不需要的空指针):

虽然不是必需的,但是可以在这两个成员函数中实现大多数(甚至全部)决策,以便在WMS的决策部分和其余功能之间具有干净的分离。这种设计用于示例模拟器中示例/实际工作流 - 示例/目录中。

日志记录

通常希望WMS将日志输出打印到终端。这很容易使用雷竞技 结算快吗扳手:: wrench_info(),雷竞技 结算快吗扳手:WRENCH_DEBUG (), 和雷竞技 结算快吗扳手:: wrench_warn()宏,就像C一样使用printf ()。这些宏中的每一个都对应于SimGrid中不同的日志级别。看到simgrid记录文档raybet雷竞app对所有细节。

此外,人们可以使用log消息的颜色雷竞技 结算快吗扳手:: terminalOutput :: setthisProcessLoggingColor()成员函数,它以颜色说明作为参数:

在示例模拟器中检查WMSs的代码时,您将发现许多调用的示例雷竞技 结算快吗扳手:: wrench_info()。日志记录是. cpp文件,每个文件对应于声明的日志类别。例如,在例子/基本的例子/ batch-bag-of-tasks / TwoTasksAtATimeBatchWMS.cpp,您会发现典型的模式:

//定义此文件的日志类别名称
雷竞技 结算快吗WRENCH_LOG_CATEGORY (custom_wms" TwoTasksAtATimeBatchWMS的日志类别");
[…]
inttwotasksatatimebatchwms :: main(){
//设置日志颜色为绿色
TerminalOutput: setThisProcessLoggingColor (TerminalOutput:: COLOR_GREEN);
[…]
//使用printf格式打印信息级消息
雷竞技 结算快吗WRENCH_INFO ("提交作业,请求%s %s-core节点持续%s分钟",
service_specific_arguments [“n”] .c_str(),
service_specific_arguments [“-C”] .c_str(),
service_specific_arguments [“t”] .c_str ());
[…]
//打印最后一个信息级别的消息
雷竞技 结算快吗WRENCH_INFO (“工作流执行完成”);
返回0;
}

在这种情况下,日志记录类别的名称custom_wms,然后可以传递给——日志命令行参数。例如,用其他参数调用模拟器——日志= custom_wms.threshold = info将使它只有那些雷竞技 结算快吗扳手_info.陈述TwoTasksAtATimeBatchWMS.cpp将会印上(绿色的!)

void setPstate(const std::string &hostname)
设置主机的电源状态。
定义:Simulation.cpp: 1141
static bool doesHostExist(std::string hostname)
S4U_Simulation hostexists()的包装器
定义:模拟.CPP:917
static int getNumberofPstates(const std::string &hostname)
获取主机的电源状态总数。
定义:模拟.CPP:1151
由工作流程中的工作流键使用/生成的数据文件。
定义:WorkflowFile.h: 26
静态Double GetCurrent MimulatedDate()
获取当前模拟数据。
定义:模拟.CPP:935