基于CPU 亲和性的工业软件实时性研究

2021-04-17 02:33何英武陈剑飞刘胜旺黄绍生
机电产品开发与创新 2021年2期
关键词:亲和性实时性延时

何英武, 陈剑飞, 汤 星, 刘胜旺, 黄绍生

( 广州数控设备有限公司, 广东 广州 510535 )

0 引言

在中国实施2025 制造强国的战略发展浪潮下,传统制造业技术逐渐蜕变成为智能制造和自动化工业加工体系。在工业机器人和数控系统领域中,最终的人机交互程序的非实时性可能会使工业生产中造成系统性能影响,亦会造成机械性人员伤亡事故, 因此提高工业平台上加工软件的实时性能在工业领域变得越发重要。 在GSK 实验平台需要实时性能较高的OS 系统,选择了在LinuxRT平台基础上开发工业CPU 亲和性绑定方法,LinuxRT 系统现由Ingo Molnar 维护,其作为单内核补丁主要目的是降低Linux 内核的任务处理延时, 以达到在工业领域上获取更高的软件调度实时性。

本文在首节探究了LinuxRT 进程调度原理, 分析出其任务调度时的实时保障方法并提出其在工业领域中高实时性环境下的不足,在第二节中解析了CPU 布局绑定时对CPU 内部Cache 命中的影响,最后在实现CPU 亲和性绑定工业软件后,对进程进行了实时性能负载模拟和测试,并获得了CPU 亲和性对改善进程实时性能的影响比例。

1 LinuxRT 中SMP 系统进程调度

在通用Linux 操作系统中,同一时刻能够并行多项任务处理,但在CPU 内部每个任务仍然是不断地切换进行,不同任务可在不同的CPU 核心上被内核调度。 实际运行的Linux 系统上默认不添加进程和CPU 之间的绑定关系。Linux 采纳UNIX 基于时间片的可变优先级调度方法,并且内核调度任务为不可抢占方式,因此在Linux 操作系统中由于调度算法(基于最大吞吐量准则)、设备驱动、临界区不可中断的系统调用、 中断屏蔽以及虚拟内存的使用等因素[1],使得Linux 系统在响应任务所耗费时间上的未知性,因此也决定了Linux 为非实时系统。

LinuxRT 为解决Linux 的非实时性, 在Linux 基础上改造了内核中断运行机制,LinuxRT 将影响实时进行的中断体系改造为中断线程化技术, 并为中断任务添加优先级设置, 得以人为将中断处理线程的优先级比实时进程优先级低, 从而避免实时任务被中断任务干扰而降低其响应性能。 在LinuxRT 中还添加了任务抢占机制,使得优先级更高的任务可以直接抢占运行资源优先运行而不用等待时间片的调度,从而提升了进程的实时响应速率。

LinuxRT 系统上的任务抢占机制,使得当进程在开始运行到运行完成时间里, 由时间片的分割导致其可能运行在任何一个CPU 核心上。 假设p1,p2,p3为系统运行的进程编号,cpu1,cpu2为当前平台的两个核心。当前操作系统的进程调度模型基本见图1。

而在当前的设计模型中,进程调度需要指定CPU 核心运行,在工作任务复杂度不高的工业体系中,开发者可能比Linux 内核更了解当前实时进程性能需求,为避免OS 无意的调度主进程,因此可人为设计出进程与CPU 的调度绑定关系,见图2。

目 前 的LinuxRT 系统的进程优先级调度基本为图1中所示。假设当前p1是工业系统中最主要的实时进程, 在LinuxRT 中需要增强主进程p1的运行效率,需把系统调度架构转化为如图2 所示[2],使进程p1与cpu1核心建立对应的依赖关系,从而使主进程p1只运行于cpu1上。 本文将以此探究图2 中的绑定调度模型架构对进程的实时性能影响。

图1 CPU 与进程随机调度

图2 CPU 与进程绑定调度

2 进程调度对Cache 命中影响

Cache 作为内存与CPU 间的缓冲介质,在SMP 系统中每个CPU 核心都拥有一块独立的Cache 缓存。 Cache内部存储着该CPU 最近访问过的内存单元块,下次CPU需要再次访问该段内存单元时, 首先从Cache 中寻找是否含有需访问的内存单元, 如存在则直接通过Cache 即可访问所需数据,以此提高进程的响应速率。

根据程序的局部性原理, 在Cache 大小确定的情况下,进程在执行过程中,在某一时段所访问的指令和数据集中在同一区域时, 如果程序的局部性越强,Cache 的命中率越高[4]。 其对应关系如图3 所示。

通用Linux 系统作为支持SMP 的多任务操作系统,在实际工业环境运行中运行的进程一般都将多于系统的CPU 核心数。 在LinuxRT 中CPU 根据任务优先级分配抢占每个进程的运行时间片。 当运行低优先级任务时系统中产生一个高优先级任务后,LinuxRT 将暂停低优先级的进程时间片转而运行高优先级任务。 抢占进程虽然能够较快的响应高优先级任务, 但是任务间的调度和还原也同样将降低响应性能, 同时调度也将导致在进程调度间所要访问的指令和数据局部性减弱, 进而降低了Cache 命中,间接降低任务的实时性能[3]。

图3 Cache 与进程布局

在工业领域中, 对于一些要求实时性能特殊的进程(机械手应用程序或数控加工程序), 其工作过程中长期运行,运行期间反复调度,如能将主进程始终运行在一个CPU 上,将会提高核内Cache 命中率,进而提升系统的响应效率。

3 CPU 亲和性绑定实现与测试方法

在探究OS 层进程调度的基本原理后,当前AM572X实验平台需运行实时性能要求较高的工业程序, 而开发者可能比OS 更加了解程序的运行机制, 因此人为干预OS 调度使得实时性程序尽量减少OS 调度, 从而降低进程在核间调度的搬运开销从而提高软件实时性能。 在当前的实验平台中,需首先在uboot 启动参数添加“isolcpus=1”参数,此参数使得AM572X 双核平台上使CPU2 处于闲置状态,而其他任务运行在CPU1 上运行。 隔离CPU2 的目的是使CPU2 核心上不与其他任务产生依赖关系,从而避免其他任务调度而干预主工业进程的实时性能。

3.1 CPU 亲和性与进程的绑定方法

当前AM572X 实验平台在完成核间隔离后即可开始实现CPU 亲和性与进程的绑定。 CPU 亲和性绑定的实现在应用软件中完成,Linux 系统内部提供了Affinity 属性API 函数接口给应用层调用,可通过sched_setaffinity 函数来获取亲和性的属性设置,sched_setaffinity 函数实现调用流程见图4。

应用程序中通过上述流程将其封装成函数接口以便调用,调用封装接口即可将当前的进程绑定在特定的CPU 核心上运行测试, 当前实验平台设置为主进程运行在CPU2核心上。

图4 CPU_Affinity 运行流程

3.2 进程实时性测试方法

CPU 亲和性绑定实验分成两组对比, 其一为系统空载下在无亲和性绑定与有亲和性绑定来对比测试CPU核心的延时抖动。 其二为高负载下测试CPU 亲和性绑定后进程调度时系统延时抖动的影响。 两种方式分别测试出AM572X 内CPU0&CPU1 两个核心的系统延时。 通过Cyclitest 软件可获取空载和模拟负载下的系统实时抖动延时数据,以此来判断内核响应任务的实时性能。

在空载状态下执行应用层CPUAffinity 绑定与非绑定亲和性数据的测试程序, 后使用命令行输入执行cyclitest 软件获取两者的的系统延时数据:

上述命令参数表示运行Cyclitest 软件获取100ms 内的系统测试结果的次数,(-p 表示最高优先级线程的优先级设置,-q 为不显示打印信息,-h 为正态分布测量数据)。 并将结果存入文件中。 后续可将测量数据导入GNUPLOT 作图软件中产生图形显示。

在第二组实验中需模拟工业运行下的负载环境,通过使用stress_ng 软件提供软件模拟负载波形来达到测试效果。 stress_ng 软件内部提供了全面的负载模型,并支持指定CPU 核心添加负载,适合当前CPU 亲和性测试实验环境。 执行stress_ng 命令行:

stress-ng-c2--cpu-method fft--timerfd

freq 1000000 -t 24h --taskset 0 &

上述命令参数表示运行stress_ng 软件并提供一个频率为10GHz 的fft(傅里叶)算法负载模型给CPU1 核上。通过在sysfs 中安装htop 命令可查看CPU1 核心上多出两个stress_ng 进程并且负载改变为100%满载运行,htop界面见图5。

图5 htop 命令界面

实验中添加负载模型后, 将应用测试软件区分成为无绑定CPU 亲和性进程和绑定CPU 亲和性进程来进行分别测试, 可再次通过Cyclitest 软件获取当前的负载核间延时抖动数据:

./cyclictest-p99-m-i 1000 -t1-1 10000 -n -q- h

100>logcpu_noAffinity_stress

./cyclictest-p99-m-i 1000 -t1-1 10000 -n -q- h 100>logcpu_Affinity_stress

执行完上述命令后可获取两份负载模式下的数据文件。

4 实验结论及系统实时性能影响

通过前文获取的测量数据文档, 可使用GNUPLOT作图软件获取图形数据,实验数据从图6 和图7 可知,在nostress 无负载状态下,应用层测试软件在绑定CPU 亲和性或不绑定延时抖动基本一致, 而在添加负载后绑定CPUAffinity 属性的系统延时抖动要小于未绑定CPUAffinity 的延时抖动,此数据基本可证明绑定CPU 亲和性后系统响应延时将会下降, 运行在此系统下的工业程序实时性将会有所提高,从当前测试数据显示,系统最大延时的降低比例约为33%。

本实验从Linux 进程调度原理角度出发,结合实际实验平台AM5729 的使用环境特性,解析CPU 亲和性的原理和绑定方法, 并提出在工业机械手和数控系统领域中工业软件与CPU 亲和性绑定方法,提出针对AM5729 平台的软件实时性能的测试手法,将CPUAffinity 数据化并证明出其对软件实时性能的提升。

图6 无负载下系统延时抖动

图7 模拟负载下系统延时抖动

5 结束语

在工业领域的特定环境下设置合适的的CPU 亲和性, 可以在系统硬件结构和操作系统调度原理保持不变的情况下,更好地发挥进程的实时响应性能。但当前仅对CPU 亲和性对工业软件实时性进行了实验分析, 而在Linux 系统中还涉及中断亲和性等其他属性对进程调度响应的影响, 在今后可综合考虑其他亲和性属性设置对系统响应的反馈影响,以寻求ARM 多核处理器在工业领域的最佳实时性能方案。

猜你喜欢
亲和性实时性延时
基于级联步进延时的顺序等效采样方法及实现
日光灯断电关闭及自动延时开关设计
荔枝高接品种的选择
4个苹果观赏品系开花、授粉习性及花粉管萌发的荧光显微观察
航空电子AFDX与AVB传输实时性抗干扰对比
不结球白菜与西洋菜远缘杂交亲和性研究
基于MECA算法的BP网络研究
计算机控制系统实时性的提高策略
Two-dimensional Eulerian-Lagrangian Modeling of Shocks on an Electronic Package Embedded in a Projectile with Ultra-high Acceleration
一种车载Profibus总线系统的实时性分析