面向农业物联网的网关功率自适应技术研究

2021-04-04 06:49冯国富李张红尤伟伟舒玉娟
制造业自动化 2021年3期
关键词:线程输出功率处理器

冯国富 ,李张红 ,尤伟伟 ,舒玉娟,陈 明

(1.上海海洋大学 信息学院,上海 201306;2.农业部渔业信息重点实验室,上海 201306)

0 引言

农业IoT是指通过应用与农业信息相关的感知设备,按照约定的协议,把农业生产系统中动植物生命体、环境要素、生产工具等物理部件和各种虚拟“物件”与互联网连接起来,进行信息交换和通讯,以实现对农业对象和过程智能化识别、定位、跟踪、监控和管理的一种网络[1]。近年来,现代农业IoT技术得到突飞猛进的发展,高能效、低功耗已成为农业IoT设备的重要发展趋势[2]。随着用户对大面积监控范围内实时数据需求的不断提升,户外节点尤其是网关节点作为农业物联网数据通信与处理枢纽,其长期、高效与稳定运行显得尤为重要。

针对农业信息化领域户外生产环境特殊,多数区域不适宜电源铺设且存在电池容量受限、电力维护费用高等问题[3~5],农业生产现场大量采用能量收集技术将周围物理环境资源(例如阳光、风、振动和潮汐等)转化为电能并用于信息设备。例如,将压电片收集的振动能量用于监测农作物生长情况[3];利用光伏板收集太阳能为水产养殖水质浮标供电[4];高原或偏远山区利用风力资源发电等[5]。在这些应用中,以振动、光能、风力发电为代表的新能源具有间歇性、随机性及不确定性等特点[6],造成能量收集单元输出功率不稳定,易产生因输出功率不足导致节点失效、以及因输出功率过剩间接导致系统资源浪费,造成系统能效较低等问题。

目前,在能耗管理硬件层面出现不少功率调节技术,如动态电压频率调整(dynamic voltage and frequency,DVFS)[7,8]可通过调节电压和时钟频率降低系统功耗;CPU热插拔(CPU Hotplug)技术通过在线增加或减少处理器核数调整系统处理器功耗[9];异构非对称多核技术,如ARM big.LITTLE[10]架构,采用高性能core与低功耗core组合的方式进行配置,最新由4个高性能Cortex-A75和4个低功耗Cortex-A55构成的big.LITTLE处理器,在中等性能的情况下可以节省75%的CPU能耗。

在能耗管理方面中,软件技术的研究滞后于硬件层面的研究。软件方面的功耗管理技术包括代码编译的寄存器、内存分配、指令调度等特种处理器体系结构的编译优化技术[11~14];操作系统中处理器、设备、内存和文件系统等的功耗控制和优化[15];网络通讯协议相关的功耗优化[16];指令级、操作系统级和系统级的功耗测量、估算和验证技术[17,18]等等。

现有基于能量收集系统的技术研究,主要集中利用功率调节技术在能量约束下最大化系统性能,或者是在能量收集单元输出功率约束下最小化系统能耗。

本文基于big.LITTLE架构,通过分析处理器功率与处理器核资源的关系,提出一种面向能量收集的异构多核农业IoT功率自适应技术。该技术能根据能量收集单元输出功率变动情况,利用支持进程迁移的CPU热插拔调节处理器工作功率,并根据当前处理器核资源来管理工作者线程。实验结果表明,所提方案不仅能够适应能量收集单元输出功率波动,还可提升系统能效,为户外农业IoT监测提供更加稳定高效的服务。

1 功率自适应技术

本文以“小龙虾生态化智能化设施养殖”水质监测网关为背景,图1为典型户外农业IoT网关部署示意图。分布在监控区域的传感器节点负责采集数据,并通过无线方式将采集到的数据传送至网关节点[19];传感器节点配置pH传感器、温度传感器、溶解氧等传感器以及电源与无线通信模块[20]。目前多数户外农业IoT通过在网关配置诸如卫星、3G、GPRS、WLAN等实现与互联网的远程连接[21]。现场监控中心则通过广域网与户外网关节点访问IoT节点,完成对系统的管理、优化和调节。网关节点负责响应用户要求、接收和处理现场网络中所有节点信息,并完成特定的数据融合任务[22,23]。如:网关根据用户请求实时计算水体pH、温度均值,计算水体溶解氧最低浓度以及统计异常温度、溶解氧节点等等。通常网关由性能和功耗相对平衡的计算节点构成,在偏远的农业户外现场,多采用能量收集技术实现自主供电。

图1 户外农业IoT示意图

针对受外界物理环境(例如风力、天气、温度)的影响,能量收集单元输出功率不稳定,易产生因输出功率不足导致节点失效,以及因输出功率过剩间接导致系统资源浪费造成系统能效较低等问题,提出一种功率自适应技术。如图2所示,方案主要由任务分解、功率自适应调核和多线程管理三个部分组成。

1.1 基于MapReduce的应用并行任务分解

为提高用户在多核环境下的并行编程效率,保证网关数据处理任务可灵活并行调度,本文利用MapReduce编程模型作为用户编程接口。在MapReduce中,map函数负责数据获取与数据处理,reduce函数负责数据聚合[24],由MapReduce运行时支持库完成任务的分解与调度。

图2 功率自适应技术框架图

下面以水产养殖水质监测网关统计异常溶解氧节点为例,详细描述基于MapReduce模型应用任务分解的过程。

在应用MapReduce模型进行任务分解中,map函数负责收集农业野外生产现场中数据监测节点的溶解氧,自定义函数get_temp()来读取节点溶解氧,并由judge_abnormal_node()函数判断是否为异常溶解氧节点,若是异常溶解氧节点则使index=1;否则,index=0。然后使用emitIntermediate()函数将index与“1”结合成一组中间键值,这里的“1”代表异常溶解氧节点的数目。reduce函数负责获取异常溶解氧节点的数量总和,并与index结合成新的键值对。最后将所有reduce函数处理结果汇总,统计最终异常溶解氧节点个数。

1.2 功率自适应调核

1.2.1 异构非对称多核处理器工作功率分析

为分析处理器工作功率与当前处理器核工作状态组合的关系,利用CPU热插拔调整当前系统在线处理器核工作状态组合,并分别测试不同情况下系统的实时功率。由于主核(编号为0的处理器核,cpu0)是系统初始化时首先启动的处理器核,也是执行CPU热插拔的管理核。除非关机,主核永远处于在线状态,只有辅核(编号非0的核,非cpu0)才能进行CPU热插拔。

以采用四小核双大核结构的RK3399为例,其cpu0、cpu1、cpu2、cpu3为小核Cortex-A53,cpu4、cpu5为大核Cortex-A72。设主核处理器工作功率P0,每增加一个小核功率增加值为Plittle,每增加一个大核功率增加值为Pbig,当前系统启动的小核的数量为Nlittle,启动的大核的数量为Nbig,那么系统处理器工作功率Pneed满足:

表1以处理200MB数据集为例,列出不同处理器核工作状态组合下,系统执行的时间、功率和能耗。表1中,Ncurrent表示目前系统处理器的核数,Tn、Pn和En分别表示在第n组处理器的组合情况下系统的总执行时间、功率与能耗。由于RK3399采用四小核Cortex-A53+双大核Cortex-A72相结合,故系统处理器核共有12种处于工作状态的组合方式。

通过对表1的数据进行分析,可得P0≈3.63w,Plittle≈0.28w,Pbig≈1.26w。从能源效率的角度来看,系统功率应当与执行时间成反比。显然,处理器核工作状态组合“Ncurrent=Nlittle+Nbing”为“2=1+1”及“3=1+2”、“4=2+2”时,不满足这个特点,故这三种组合情况对本文研究并没有意义。为了描述方便,对表1中有效处理器核工作状态组合进行了编号,共得到九种有效组合。

当能量收集单元输出功率发生波动时,功率自适应调核模块根据功率监测单元感知到的输出功率按照表1中的有效处理器核工作状态组合对系统当前处理器核类型以及数量作出调整。

表1 不同处理器组合情况下系统测试结果表

1.2.2 基于CPU插拔的自动调核策略

自动调核策略是按照最优匹配算法选择与能量收集单元输出功率最匹配的处理器核工作状态组合,然后基于OS提供的CPU热插拔技术(CPU Hotplug)实现。

在系统运行过程中,结合信号量机制与多线程技术完成功率自适应自动调核模块与多线程任务调度策略的通信,具体的实现如下:

创建线程receive_power_thread用于获取功率的变化,线程的入口地址为receive_power_func函数,即pthread_create(&receive_power_thread,NULL,eceive_power_func,NULL),主线程通过不断地循环使用start信号量来开启此线程,即sem_post(&start)。其中,receive_power_func函数用来感知能量收集单元输出功率Psupply,并根据当前功率对处理器核类型及数量作出调整,然后根据处理器变动情况管理工作者线程。

为避免由于功率波动造成频繁执行热插拔操作的问题,采用以下方法:当Psupply增加时,只有当Psupply满足式(2)时,才发出处理器调整请求,并且只有当连续的3个采样周期均发出处理器核调整请求时,才能调整系统目前处理器核工作状态的组合,否则保持当前处理器核工作状态组合不变;反之,当Psupply减少时,那么只要当Psupply满足式(3)时,就对系统当前处理器核工作状态组合进行调整。

式(2)、式(3)中,Pcurrent表示当前处理器核工作状态组合下处理器工作功率,Pcurrent+1表示下一处理器核工作状态组合下处理器工作功率需求,Pcurrent-1表示上一处理器核工作状态组合下处理器工作功率需求。

在Linux中执行CPU热移除时,系统通过调用cpu_down()函数使当前系统处理器核来执行idle进程,并设置该idle进程的优先级为最高级;然后把该处理器核上的所有进程与定向至该处理器核上的所有中断、定时器、中断bottom half、tasklet均迁移到其他空闲处理器,而OS的工作是迁移CPU热移除中残留的任务;接下来通过调用cpu_disable()函数来完成与体系结构相关的工作的清理;最后调用cpu_dead()函数,从而保证该处理器核不再运行任何进程[25]。

对编号为i的CPU核进行热移除操作的具体实现方法为fputs(“0”,“/sys/devices/system/cpu/cpui/online”)。

CPU热插入比热移除较为简单,由于系统之前并没有与此处理器核相关的任务与数据,所以添加处理器核数并不会破坏当前系统的运行,系统无需额外配置即可识别到新插入的处理器核,并将一部分进程运行在该处理器核上。

对编号为j的CPU核进行热插入操作的具体实现方法是fputs(“1”,“/sys/devices/system/cpu/cpuj/online”)。

1.3 面向自动调核的多线程管理

为了适应动态核资源的变动情况,并提高系统性能,利用Phoenix[26,27]多线程任务调度机制充分发挥异构多核处理器系统的并行处理能力,并结合操作系统进程迁移与线程亲和性管理处理器工作负荷。

面向能量收集的异构多核农业IoT网关功率自适应技术实现的多线程管理具体如下:

1)创建工作者线程。

主线程创建若干工作者线程,工作者线程的数量由系统物理核心数Nmax决定。为便于设置线程亲和性,工作者线程与处理器核是一一对应关系。通过pthread_create(&tpool->threads[i],&attr,thread_ loop,&tpool->thread_args[i])函数实现工作者线程的创建,其中thread_loop函数作为工作者线程的入口地址,工作者线程在此处执行线程等待,直到主线程启动该工作者线程。Phoenix2.0在src/tpool.c文件中实现该功能。

2)启动工作者线程。

主线程利用信号量启动所有工作者线程,并通过syscall(SYS_gettid)函数获取当前工作者线程的pid。通过sem_post(&(tpool->thread_args[i].sem_run))函数实现线程的启动,Phoenix2.0在src/tpool.c文件中的tpool_begin函数实现工作者线程启动。

3)管理工作者线程

首先,根据处理器核的初始状态,为处于在线状态的处理器核相对应的工作者线程设置线程亲和性,将其绑定在相应处理器核上,并且该类工作者线程保持运行状态,依次获取并执行任务队列中的任务;此外,不为处于离线状态的处理器核相对应的工作者线程设置线程亲和性,并且休眠该类工作者线程。

其次,系统运行过程中,根据当前处理器核的变动情况,基于以下规则进行管理工作者线程:某处理器核被CPU热移除时,OS把执行在处理器核上的工作者线程迁移到其他空闲处理器核上运行,从而保证该工作者线程上没有处于执行状态的任务,然后使该工作者线程处于休眠状态(如图3所示)。

某处理器核被CPU热插入时,唤醒相应的工作者线程,并将该工作者线程通过sched_setaffinity(pid,sizeof(cpu_set),&cpu_set)设置线程亲和性绑定至相应的处理器核上(如图4所示),该工作者线程重新从任务队列中获取任务并执行。Phoenix2.0在src/map_reduce.c文件中的tq_dequeue函数中实现工作者线程任务获取并执行。

图3 CPU热移除

图4 CPU热插入

设置亲和性的原因在于:在多核处理器上,每个处理器核有各自的缓存用来存放进程使用的进程使用的信息,而进程可能会被OS调度到其他处理器核上。工作者线程设置亲和性绑定在某一个指定处理器核上运行,除非相应的处理器核CPU被热移除,否则该工作者线程将一直在指定处理器核上执行,减少工作者线程在不同处理器核之间进行频繁的迁移,从而提高CPU cache的命中率和系统性能。

2 实验验证与分析

在上海海洋大学滨海基地水产养殖现场验证本文的功率自适应技术的有效性及其能效。水产养殖区域水质浮标分别对水温、溶解氧浓度以及PH值等参数进行长期的实时监测,设定每个传感器节点每隔10min采集1次数据;以太阳能电池作为能量收集装置为水质监测网关供电。

本文以低成本嵌入式开发板RK3399作为实验平台,操作系统采用Ubuntu 16.04-arm64bit,内核版本为Linux 4.4.52,并以提取异常溶解氧节点作为测试实例。

2.1 有效性验证

以提取异常溶解氧节点为测试实例,并在不同运行环境下进行测试。表2给出了分别使用本文方法与传统不提供功率自适应调核功能的Phoenix调度策略的实验结果表。其中,Psupply表示能量收集单元输出功率,P0表示支持主核正常运行的处理器工作功率需求,Pcurrent表示当前处理器核工作状态组合下处理器工作功率。

从表2中可知,在单核环境中,当Psupply≥Pcurrent≥P0时,本文方法与Phoenix调度策略都有效。在多核环境中,当Psupply≥Pcurrent>P0时,本文方法与Phoenix调度策略都有效;但是,当Pcurrent≥Psupply>P0时,本文方法可用于此种情况,而传统不提供自动调核功能的Phoenix调度策略由于能量收集单元输出功率不足导致节点失效。

2.2 能效对比

由上文有效性验证结果可知,能量收集单元输出功率必须能够支持系统主核正常运行,才能确保本文所提出功率自适应技术的有效性,并且若能够保证能量收集单元最小输出功率不小于当前处理器工作功率需求,传统Phoenix调度策略能够正常运行。基于这个前提,在多核环境中,模拟3种能量收集单元输出功率波动情况:

A:设功率初始值P1,隔1s增加0.3w,持续13s;之后隔1s减少0.3w,持续13s,功率依此循环变化。

B:设功率初始值P7,隔2s减少0.5w,持续8s;之后隔2s增加0.5w,持续8s,功率依此循环变化。

C:设功率初始值P9,每隔1s减少0.5w,持续4s;之后隔3s增加1w,持续6s,功率依此循环变化。

其中,P1、P7、P9的具体值如表1所示。为了将本文方法与传统不提供不提供功率自适应调核功能的Phoenix调度策略进行对比,在这3种能量收集单元输出功率波动情况下,分别按照两种方式初始化处理器核。

1)根据能量收集单元最小输出功率能够支持Phoenix调度策略正常运行的处理器核工作状态组合初始化处理器核,即在这3种能量收集单元输出功率波动情况下,分别按照处理器核工作状态组合序号1、2、4初始化处理器核工作状态组合;

2)由于能量收集单元输出功率的波动性,通常情况下,无法预测最小输出功率,方式1)并不适用,为支持Phoenix调度策略正常运行,直接按照处理器核工作状态组合序号1初始化处理器核工作状态组合,即只有主核处于在线状态。

表3中列出数据集大小分别为10MB、50MB、100MB及200MB时系统的执行时间与系统能耗。其中,Phoenix1、Phoenix2分别表示按照方式1)、方式2)初始化处理器下Phoenix调度策略的实验结果。

表2 本文方法与Phoenix调度策略在不同运行环境下的实验结果

表3 不同调核方式在不同运行环境下执行时间与能耗对比

实验结果表明,在能量收集单元输出功率波动情况下,本文方法明显优于Phoenix调度策略,并且随着数据量的增大,其能效优势逐步体现。原因在于若手动根据能量收集单元最小输出功率初始化处理器核工作状态组合,或是只有主核处于在线状态,当能量收集单元输出功率波较大时,传统Phoenix调度策略由于不提供功率自适应调核功能不能够自适应控制处理器工作功率,导致资源没有充分得到应用,极大地降低了系统能效。而本文方法利用并优化了Phoenix调度策略,根据能量收集单元输出功率变化情况自适应地调整处理器核工作状态组合,从而充分利用系统资源,提高了系统能效,执行时间与能耗分别平均优化了将近45.54%以及37.93%。

3 结语

为解决户外农业IoT网关数据处理过程中,由于没有考虑处理器工作功率需求和能量收集单元输出功率的不确定性造成的网关节点失效以及能效较低等问题,本文提出一种基于嵌入式big.LITTLE异构多核架构的自动调核功率自适应技术,将cpu热插拔、信号机制以及多线程调度等软硬件技术相结合,实现功率自适应。实验结果表明本文方法的有效性,并与传统不支持功率自适应调核的Phoenix调度策略进行比较,本文方法不仅能够适应能量收集单元输出功率波动的场合,而且在执行时间以及能耗方面明显优于Phoenix调度策略。

该功率自适应技术并不局限于农业物联网网关自主供电的应用,对于其他供电功率波动的情况,可对本文方法稍作修改并使用,能够广泛应用于农田、温室、苗圃、养殖池等区域。

猜你喜欢
线程输出功率处理器
基于C#线程实验探究
基于国产化环境的线程池模型研究与实现
浅谈linux多线程协作
适用于智能电网的任意波形输出功率源
基于双层BP神经网络的光伏电站输出功率预测
Imagination的ClearCallTM VoIP应用现可支持Cavium的OCTEON® Ⅲ多核处理器
ADI推出新一代SigmaDSP处理器
分布式发电系统并网逆变器输出功率的自适应控制
大全集团对其光伏组件产品提供25年输出功率线性质保服务
Java的多线程技术探讨