一种提高数据密集型应用实时性的CPU调度方法

文档序号:26360663发布日期:2021-08-20 20:36阅读:117来源:国知局
一种提高数据密集型应用实时性的CPU调度方法

本发明涉及计算机操作系统的cpu调度技术领域,尤其涉及一种可以提高数据密集型应用实时性的cpu调度方法。



背景技术:

大数据时代下,数据密集型应用的实时性对于挖掘数据价值显得尤其重要;由于实时数据在数据总量中占据越来越高的比例,如果不能对这些数据进行及时的处理,这部分数据的价值就会变得非常低。从操作系统层面出发,cpu调度方法会决定应用的实时性表现。

目前主流的服务器系统上使用的调度方法是完全公平调度器(cfs),作为通用场景下的一种典型cpu调度方法,cfs的主要目标是在运行的任务之间公平地共享cpu资源。对于不同优先级的进程,cfs会根据各个进程的权重来分配运行时间,并且记录下每个进程的虚拟运行时间,在调度时总是选择虚拟运行时间最少的进程来运行。作为一种通用场景下的调度算法,cfs将关注点放在了如何在不同的进程之间公平地分配cpu资源,无法有效感知数据密集型应用,导致无法满足数据密集型应用高实时性的需求。



技术实现要素:

由于当前的操作系统cpu调度算法没有针对数据密集型应用做出特殊处理,导致系统不能为数据密集型应用提供良好的实时性,进而充分利用数据的价值,因此本发明提出一种用于提高数据密集型应用实时性的cpu调度方法。

本发明实现的用于提高数据密集型应用实时性的cpu调度方法主要分为四个模块:

(1)采集模块

该模块的功能是通过周期性地访问当前系统下进程的进程描述符,收集进程的资源使用快照。

(2)计算模块

该模块的功能是根据收集到的一系列资源使用快照,计算得到进程的cpu利用率和io资源利用率;并根据当前系统负载情况,计算得到进程cpu利用率阈值和i/o资源利用率阈值。

(3)分类模块

该模块的功能是根据计算得到的进程cpu利用率和进程io资源利用率,分别与进程cpu利用率阈值和i/o资源利用率阈值进行比较,判断进程是否属于数据密集型应用,并将分类结果保存到进程的进程描述符中。

(4)调度模块

该模块的功能是针对数据密集型应用做出特殊处理,通过提高数据密集型应用的优先级,并在每次进程时间片消耗完后,结合进程io资源和内存资源使用对进程优先级进行动态更新。从而使数据密集型应用能够相对更早的获得cpu资源运行结束,提高数据密集型应用的实时性。

该方法包括如下步骤:

步骤1:采集模块通过周期性地访问进程的进程描述符,收集进程的资源使用快照,其中包括进程的cpu使用时间、读取的字节数和写入的字节数等。

步骤2:计算模块通过分析进程资源使用快照,根据进程的cpu使用时间和读取、写入的字节数分别计算得到进程cpu利用率、io资源利用率;同时根据当时系统负载情况,计算得到进程cpu利用率阈值和进程io资源利用率阈值。

步骤3:分类模块通过判断当前进程的cpu利用率是否大于进程cpu利用率阈值和当前进程的io资源利用率是否大于进程io资源利用率阈值,得出该进程是否属于数据密集型应用,并将进程类型信息保存到进程描述符的新增标志位字段data_intensive中。

步骤4:调度模块每次从进程就绪队列中选出优先级最高的进程执行,并跟踪该进程,统计进程对io资源和内存资源的使用情况。

步骤5:进程分配的时间片到期后,调度模块通过标志位判断当前进程是否属于数据密集型应用。对于非数据密集型应用,保持进程优先级不变;对于数据密集型应用,cpu调度算法根据进程的io资源使用和内存资源使用来更新进程的优先级,并根据新的优先级将进程重新放入到就绪队列中。

步骤6:重复执行步骤4、5,直到所有进程执行完毕。

本发明的有益效果:

本发明针对现有cpu调度方法存在无法对数据密集型应用提供良好实时性的问题,提出了一种可以提高数据密集型应用实时性的cpu调度方法。该方法通过周期性的收集进程的资源使用快照,并通过计算模块和分类模块自动对应用进行分类,通过提高数据密集型应用优先级并基于内存、io资源使用动态更新优先级的策略,从而影响调度器的调度行为,最终让调度器优先调度数据密集型应用,提高该类应用的实时性。

附图说明

图1为本发明提供的一种提高数据密集型应用实时性的cpu调度方法的模型组件结构图;

图2为本发明提供的一种提高数据密集型应用实时性的cpu调度方法的计算模块工作示意图;

图3为本发明提供的一种提高数据密集型应用实时性的cpu调度方法的组织就绪进程的数据结构;

图4为本发明提供的一种提高数据密集型应用实时性的cpu调度方法的调度策略;

图5为本发明提供的一种提高数据密集型应用实时性的cpu调度方法的流程示意图。

具体实施方式

以下结合附图对本发明作进一步说明。

本发明提供了一种提高数据密集型应用实时性的cpu调度方法,如附图1所示,该方法主要包括四个组件:

(1)采集模块

采集模块的主要工作是周期性地访问进程的进程描述符,收集进程的资源使用快照。收集到的资源使用快照将会交由计算模块进行进一步的计算处理。进程的进程描述符是linux内核用于管理进程的一种数据结构,包含了一个进程所需的所有信息,在内核中通过task_struct结构体来描述。采集模块收集的进程资源使用快照内容包括进程的cpu使用时间和io资源使用两部分。其中进程cpu使用时间对应进程描述符的utime和stime字段,utime字段记录了进程在用户态下运行的时间,stime记录了进程在内核态下运行的时间,两个字段的单位都为jiffies。进程io资源使用对应进程描述符的ioac字段,该字段的rchar值和wchar值分别记录了读取的字节数和写入的字节数。采集信息的预设时间间隔被设置为1秒,在内核中的表示为time_interval=config_hzjiffies

(2)计算模块

计算模块的主要工作是通过分析进程资源使用快照,计算得到进程的cpu利用率和io资源利用率;同时根据当前系统负载情况,计算得到进程cpu利用率阈值和进程io资源利用率阈值。

第一部分的计算内容包括进程的cpu利用率和进程的io资源利用率。关于进程的cpu利用率计算,通过读取资源使用快照,解析其中的utime和stime,将(utime+stime)减去上一个资源快照中这两项的和(lastutime+laststime),作为该进程在time_interval秒内占用cpu的时间,同时总的cpu时间为time_interval*config_hz,所以该进程的cpu利用率计算公式为:processcpuused=((utime+stime)-(lastutime+laststime))/(time_interval*config_hz)

关于进程的io资源利用率计算,通过读取资源使用快照,解析其中的rchar和wchar,将(rchar+wchar)减去上一个资源快照中这两项的和(lastrchar+lastwchar),作为该进程在time_interval秒内io数据量,所以该进程的io资源利用率计算公式为:

processioused=((rchar+wchar)-(lastrchar+lastwchar))/time_interval

第二部分的计算内容是根据当前系统负载情况,计算得到进程的cpu利用率阈值和进程的io资源利用率阈值。这两个阈值的计算都需要获得当前系统下运行进程的数量(task_count)。进程的cpu利用率阈值计算公式为:

processcpuusedthreshold=1/task_count

关于进程的io资源利用率阈值计算,首先需要对当前设备进行读写速率的压力测试。采用linuxdd命令,每次写入(读取)4kb,一共写入300000次,得到系统读写带宽的量化指标(disk_bandwidth);进程的io资源利用率阈值计算公式为:

processiousedthreshold=disk_bandwidth/task_count

附图2为信息计算模块的工作示意图。

(3)分类模块

分类模块的主要工作是通过比较进程的资源使用率和当前系统负载下的进程资源使用率阈值,对进程进行自动分类。分类的结果可以由进程的cpu利用率和进程的io资源利用率综合分析得到,包括两个方面:一是判断进程的cpu利用率是否高于进程cpu利用率阈值;二是判断进程的io资源利用率是否高于进程io资源利用率阈值;如果同时满足,则说明该进程属于数据密集型应用。分类模块在判断完成后,会将判断结果,即进程类型信息保存到进程描述符的新增标志位字段data_intensive中。0表示该进程不属于数据密集型应用,1表示该进程属于数据密集型应用。进程是否属于数据密集型应用的判断公式为:

data_intensive=(processcpuused>processcpuusedthreshold)&&(processioused>processiousedthreshold)

(4)调度模块

调度模块的主要工作是能够根据应用程序的类型信息,针对数据密集型应用做出优先级的动态调整,以便数据密集型应用能够更早的获得cpu资源,达到提高实时性的目的。在本模块中将会介绍提高数据密集型应用实时性的cpu调度方法的具体细节。

如附图3所示,本发明中提出的cpu调度方法通过使用优先队列来组织所有处于就绪状态的进程。该优先队列为每种优先级维护了一个进程链表,所有就绪进程会被放入对应优先级的链表中,同时维护一个bitmap,用来标记每个优先级对应的进程链表是否存在进程。当调度器需要获得下一个任务时,首先会在常数时间内查找到bitmap中第一个被设置为1的位,然后在该优先级对应的进程链表中选择第一个进程来执行。

下面给出的是进程入队,进程出队和选择下一个进程的算法描述。

如附图4所示,本发明中提出的cpu调度方法是基于round-robin算法优化而来的。该调度方法的调度策略包括以下步骤:

步骤1:cpu调度程序从就绪队列中选择一个优先级最高的进程。结合附图3给出的就绪队列数据结构,该cpu调度程序总是会从优先级最高的进程链表中挑选第一个节点。

步骤2:执行进程。投入运行的进程将获得cpu资源,按照指令顺序执行。本方法中的时间片设置为5ms。

步骤3:每当一个时间片到期时,将会判断当前运行的进程是否执行结束。如果该进程执行结束,将会把该进程从就绪队列中移除;如果进程还没有执行结束,将会进行下一步的操作。

步骤4:判断当前运行的进程是否属于数据密集型应用。通过对进程的进程描述符中的data_intensive字段进行判断,得到该进程的应用类型信息。如果该进程不属于数据密集型应用,那么保持该进程的优先级不变,并将进程重新加入就绪队列;如果该进程属于数据密集型应用,那么将会进行下一步的操作。

步骤5:对于该数据密集型应用对应的进程,当这个进程第一次获得cpu时间片投入运行结束后,会将该进程的优先级提高一个固定的增量。在本方法中,这个增量被设置为2。第一层的优先级调整结束后,数据密集型应用对应的进程相比较于非数据密集型应用对应的进程会有更高的优先级,高优先级可以帮助该类进程更早的获得cpu以提高实时性。

第二层的优先级调整基于高内存占用进程优先的策略,会根据每个时间片内该进程使用的内存大小来进一步调整进程的优先级。rss的含义是常驻内存集,它表示该进程分配的内存大小,可以通过mm_struct结构体的rss字段获得,通过比较当前时间片的rss值和上个时间片的rss值,得出该进程使用内存的大小是增加还是减少。如果该进程使用的内存大小增加,那么将进程的优先级提高一个单位;如果进程使用的内存大小减少,那么将进程的优先级降低一个单位。在第二层优先级策略调整下,高内存占用的进程会更早的执行结束,有助于缓解系统内存压力。

步骤6:完成优先级更新后,进程将会重新入队。每当进程执行一个时间片后,进程的优先级会根据这个时间片的内存使用情况进行更新。入队时会按照新的优先级加入到对应的链表尾部,等待下一次被调度。

步骤7:重复步骤1-6。通过时间片轮转的方式将每个可执行进程轮流分配给cpu。

本发明的具体步骤是,见图5:

步骤1:采集模块通过周期性地访问进程的进程描述符,收集进程的资源使用快照,其中包括进程的cpu使用时间、读取的字节数和写入的字节数等

步骤2:计算模块通过分析进程资源使用快照,根据进程的cpu使用时间和读取、写入的字节数分别计算得到进程cpu利用率、io资源利用率;同时根据当时系统负载情况,计算得到进程cpu利用率阈值和进程io资源利用率阈值

步骤3:分类模块通过判断当前进程的cpu利用率是否大于进程cpu利用率阈值和当前进程的io资源利用率是否大于进程io资源利用率阈值,得出该进程是否属于数据密集型应用,并将进程类型信息保存到进程描述符的新增标志位字段data_intensive中

步骤4:调度模块每次从进程就绪队列中选出优先级最高的进程执行,并跟踪该进程,统计进程对io资源和内存资源的使用情况

步骤5:进程分配的时间片到期后,调度模块通过标志位判断当前进程是否属于数据密集型应用。对于非数据密集型应用,保持进程优先级不变;对于数据密集型应用,cpu调度算法根据进程的io资源使用和内存资源使用来更新进程的优先级,并根据新的优先级将进程重新放入到就绪队列中。

步骤6:重复执行步骤4、5,直到所有进程执行完毕。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1