,,,
(许继电气技术中心,许昌 461000)
嵌入式设备对其本身的可靠性要求极高,由于一些不可预测的因素或者是没有发现的潜在危险导致Flash的垃圾资源回收不及时,会出现文件操作耗时较长等异常情况,会导致嵌入式设备产生不可预知的危险,在这种情况下很难保证设备的可靠性、安全性,甚至会对整个嵌入式系统造成严重的后果。
鉴于此,本文提出了一种Flash资源回收的策略:设备能够在运行过程中根据CPU负载情况和Flash的有效资源空间剩余情况,自动调整后台回收的频率,能够有效利用CPU的空闲时刻进行垃圾回收,尽量避免异常情况的发生,但是如果一旦有异常情况发生,设备会将异常情况记录并报警,帮助现场工作人员尽快定位并解决问题,避免问题扩大而造成不可挽回的损失[1-3]。
本文提出一种嵌入式设备的Flash资源回收的策略,能够通过实时检测到的CPU负载率和Flash空间利用率(Flash已被占用空间与Flash总空间的百分比)来确定后台资源回收的周期(即设备每次清理内存的时间间隔),定时清理内存。在具体介绍该方法之前,首先对本回收策略的时间粒度滑动窗口和时间粒度进行说明。
如图1所示,嵌入式设备后台资源回收的清理周期按照大小顺序依次排列,形成时间粒度(资源回收周期)进度条,图1中数字的单位都是ms,进度条上面每个具体的时间粒度的大小是由设备特性如CPU主频、CPU负载、Flash空间大小、Flash空间利用率、系统的资源回收能力来决定的。
图1 时间粒度滑动窗口及时间粒度进度条示意图
基于大量具体工程应用而得出的经验公式表示为:
T=coefficient×
其中T表示清理周期,coefficient为与具体工程应用有关的经验系数,free_block表示有效的Flash资源剩余量,complexity表示业务的系统复杂度,erase_speed表示块擦除速度,gc_ability表示嵌入式系统本身的垃圾回收能力,fcpu表示使用CPU的主频,need_space表示业务对Flash空间大小的要求。
如图1所示,时间粒度滑动窗口表示在当前CPU负载率情况下,能够选择的资源回收周期的范围,然后根据Flash空间利用率等因素,在时间粒度窗口的范围内确定具体的时间粒度值。资源回收时间粒度滑动窗口是根据CPU的负载情况,实时地在时间粒度进度条(如图1所示)上滑动[4]。
在CPU负载比较低的状态下,资源回收时间粒度滑动窗口向时间粒度进度条的左侧(时间粒度值小的一端)滑行。在CPU负载比较高的状态下,资源回收时间粒度滑动窗口向时间粒度进度条的右侧(时间粒度值小的一端)滑行。
Flash空间利用率的大小决定了时间粒度在资源回收时间粒度滑动窗口上取值的位置。
在Flash空间利用率比较低的情况下,也就是Flash可用空间剩余比较充分的情况下,垃圾资源回收的需求不迫切,时间粒度就在资源回收时间粒度滑动窗口偏右的位置取值,即时间粒度取得相对较大的值,垃圾资源回收频率就变小。
在Flash空间利用率比较高的情况下,也就是Flash可用空间剩余比较少的情况下,垃圾资源回收的需求就变得很迫切,时间粒度就在资源回收时间粒度滑动窗口偏左的位置取值,即时间粒度取得相对较小的值,垃圾资源回收频率就变大[5]。
设备运行期间,根据CPU负载率和Flash有效资源空间剩余程度自动判断垃圾资源回收的频率,在不影响设备性能的情况下保证设备运行的安全性和可靠性。
本方案的实现需要两个任务配合实现:CPU负载监视任务、资源回收检测任务,如图2所示。
图2 方案实现基本示意图
CPU负载检测任务负责实时检测CPU使用情况(占有率)、完成对资源回收时间粒度滑动窗口滑动趋势的判定和控制。资源回收检测任务主要负责Flash资源回收的具体事务,并且根据时间粒度判定模块确定的具体时间粒度确认回收资源的快慢[6]。
资源回收时间粒度是由CPU负载率和Flash空间利用率共同决定的,CPU负载率负责判定资源回收时间粒度窗口的滑动趋势,Flash空间利用率负责确定在滑动窗口上定位具体的时间粒度值[4]。
CPU负载检测任务负责实时检测CPU的负载情况,并决定时间粒度滑动窗口的滑动方向和初度。当CPU负载小的时候,时间粒度向时间力度条的左端滑动,减小后台资源回收检测任务的时间、增大回收粒度,这样做是为了提高垃圾回收速度。当CPU负载大的时候,时间粒度向时间力度条的右端滑动,增大后台资源回收检测任务的间隔时间、减小回收粒度,这样做是为了降低垃圾回收速度,减轻CPU负载。
首先,资源回收是每个嵌入式文件系统自身应该具备的功能。资源回收检测任务实现了一个优化使用资源回收的策略。任务初始化时需要定义垃圾回收时间粒度的默认值,比如回收间隔时间(时间粒度)默认值定义为400 ms,那么每隔400 ms就会进行一次后台的垃圾回收。其次,任务的每次循环都需要检测有效资源剩余,根据Flash有效资源的剩余情况来确定资源回收时间粒度。在CPU负载检测任务控制的时间粒度滑动窗口上面确定具体的时间粒度,根据时间粒度调整下次后台垃圾回收的时间。
首先,设备需要实现时间粒度条和时间粒度滑动窗口的初始化:时间进度条上的时间粒度保证从小到大的趋势,具体的时间粒度值和相邻值之间的跨度由用户根据设备特性(CPU速率和基本负载、存储空间大小等)来决定。时间粒度滑动窗口根据CPU负载的变化在时间粒度条上滑动,该窗口的大小可以由用户自定义,如图1所示的示意图,窗口的大小定义为7,即窗口每次包含7个时间粒度值。
图3 CPU负载检测任务执行流程图
如图3所示,在嵌入式设备上电之后,系统初始化阶段,启动一个最低优先级的任务:CPU负载检测任务,该任务在初始化期间记录一段变量递增算法的时间间隔T1,由于初始化期间其他任务都没有开始运行,所以可以获取一个比较精确的标准参照时间间隔[7]。
CPU负载检测任务运行期间,记录同样一段变量递增算法(与CPU负载检测任务初始化时的算法一样)的时间间隔T2,由于CPU负载检测任务的优先级最低,所以嵌入式设备运行期间,只要有其他任务运行,该任务就会被打断去执行其他任务,直到其他任务都执行完毕并处于挂起状态,该任务才会被继续执行。所以CPU任务越多,执行越频繁,实际统计的时间间隔就越长。将标准参照时间间隔T1和运行时间间隔T2比较就能够得到CPU的占有率,就能计算CPU的负载大小:
当CPU负载减小的时候,说明空闲时间较多,有能力处理更多的任务,这时时间粒度滑动窗口向左端滑动,减小后台资源回收检测任务的时间粒度(间隔)、增大回收粒度,这样做可以提高垃圾回收速度,同时也提高了CPU的利用率[8]。
当CPU负载增大的时候,说明空闲时间减少,这时时间粒度滑动窗口向右端滑动,增大后台资源回收检测任务的间隔时间、减小回收粒度,这样做可以降低垃圾回收速度,减轻CPU负荷。
资源回收检测任务最重要的功能就是根据策略判定资源回收的时间粒度,然后调用系统本身的资源回收功能进行Flash垃圾资源的回收。该任务初始化时需要定义垃圾回收时间粒度的默认值,比如回收间隔时间默认值定义为400 ms,那么每隔400 ms就会进行一次后台的垃圾回收。
任务的每个循环都需要检测有效资源的剩余情况、业务对资源的需求情况,由此在时间粒度滑动窗口上面确定具体的时间粒度,任务根据时间粒度调整下次后台垃圾回收的时间间隔。
按照图4的示例,举个简单的例子(实际应用中各门槛值都可以根据自身具体的业务更加细化)。
图4 时间粒度滑动窗在不同CPU负载下的位置示意图
当CPU占有率小于30%时候,此时负载比较低,时间粒度滑动窗口向数值小的一端滑行,可以看到窗口的范围是200~700 ms,共包括7个时间粒度值,具体选择哪个粒度值就需要由剩余的有效Flash资源、业务需求决定。当有效资源剩余量充足的时候,说明资源足够,垃圾回收的需求不迫切,可以选择700 ms的粒度。当有效资源剩余量比较少的时候,垃圾回收的需求就比较迫切,可以选择200 ms的粒度,加快垃圾回收。
当CPU占有率在60%左右时CPU负载适中,时间粒度滑动窗口向右端滑行,可以看到窗口的范围是500~1 200 ms,共包括7个时间粒度值,具体选择哪个粒度值由剩余的有效资源决定。当有效资源剩余量比较多的时候,说明资源足够,垃圾回收的需求不迫切,可以选择1 200 ms的粒度。当有效资源剩余量比较少的时候,垃圾回收的需求就比较迫切,可以选择500 ms的粒度,加快垃圾回收。
当CPU占有率大于90%时CPU负载很大,时间粒度滑动窗口向数值大的一端滑行,可以看到窗口的范围是1 000~2 200 ms,共包括7个时间粒度值,具体选择哪个粒度值由剩余的有效资源决定。当有效资源剩余量比较多的时候,说明资源足够,垃圾回收的需求不迫切,可以选择2 200 ms的粒度。当有效资源剩余量比较少的时候,垃圾回收的需求就比较迫切,可以选择1000 ms的粒度,加快垃圾回收。
一旦检测到Flash剩余有效资源减少到需求门槛以下、CPU负载比较重、资源回收不及时的情况,任务触发嵌入式装置报警。
为了方便测试和说明问题,将资源回收时间粒度、Flash剩余空间、CPU负载组成三维坐标,模拟出示意图说明CPU负载、Flash剩余空间和回收时间粒度的变化趋势之间的关系。条件如下:
① 将时间粒度进度条长度限定为3 000 ms,即时间粒度只能在0~3 000 ms范围内选择。
② 将时间粒度滑动窗口长度限定为500 ms,滑动窗口的滑动粒度是25 ms,即CPU负载每变化1%,滑动窗口就会滑动25 ms的范围。
③ 时间粒度最小选择单位为5 ms,即Flash剩余空间每变化1%,时间粒度选择就会有5 ms的改变。
基于上述条件,可以得出公式:
根据该公式可以得到三维仿真图如图5所示。
图5 三维仿真图
在时间粒度的三维分布入中,存在安全区域和报警区域:在安全区域以内说明Flash剩余有效空间充足,或者是CPU对垃圾资源的回收速度大于Flash剩余空间的使用速度;当Flash剩余空间不充足并且CPU回收粒度跟不上Flash空间使用速度的时候,就会触发报警,警告设备可能会存在异常情况。