linux打实时补丁以及实时性能测试

在工业产品中使用操作吸引,一般都需要使用实时性较强的操作系统,而众所周知,linux系统是基于时间片划分的非实时系统,其实时性难以满足工业化对时效性的要求,因此很多应用场景中无法使用linux操作系统。当然这一局限性已经有所改善,目前linux社区已经增加了众多版本的实时补丁,只要给linux内核打上实时补丁,其实时性会得到大幅度提升。

在此,我们就讲讲如何给linux内核打补丁以及如何测试linux系统的实时性。

一、给linux打实时补丁

我们以linux-xlnx-xilinx-v2017.4.zip为例子,来讲解如何打实时补丁。首先要下载一个与linux版本完全对应的补丁文件。下载地址为:https://mirrors.edge.kernel.org/pub/linux/kernel/projects/rt/4.9/older/

这里我们下载的补丁文件内为:patch-4.9-rt1.patch.gz,下载完实时补丁后,将实时补丁存放在linux-xlnx-xilinx-v2017.4.zip相同的文件路径下。后续步骤如下:

  1. 解压linux内核:7za x linux-xlnx-xilinx-v2017.4.zip -r -o./
  2. 解压补丁文件:gunzip patch-4.9-rt1.patch.gz
  3. 进入linux内核目录: cd linux-xlnx-xilinx-v2017.4
  4. 打补丁:patch -p1 < ../patch-4.9-rt1.patch
  5. 进入内核menuconfig菜单,勾选上Kernel Features->Preemption Model->Fully Preemptible Kernel (RT)
  6. 编译内核:make uImage -j2 LOADADDR=0x8000

二、测试linux的实时性

前面我们已经生成了实时的linux内核镜像,接下来我们把实时内核烧写到板卡上,进行实时性性能测试。这里需要引入一个测试linux性能的工具cyclictest

  1. 拷贝cyclictest的Git 仓库:在ubuntu下可执行如下命令:git clone git://git.kernel.org/pub/scm/utils/rt-tests/rt-tests.git
  2. 进入git仓库,切换到我们要用的分支:cd rt-tests                 git checkout stable/v1.0
  3. 修改编译工具链
  4. 编译cyclictest: make all NUMA=0

三、利用cyclictest进行性能测试:

将编译完成的cyclictest加载到板卡上,并增加其可执行权限,就可以利用cyclictest命令来进行linux内核实时性能测试,测试命令为:

 ./cyclictest -t8 -p 80 -n -i 10000 -l 10000


常用参数

-p --prio=PRIO 最高优先级线程的优先级  使用时方法为: -p 90 /  --prio=90
-m --mlockall  锁定当前和将来的内存分配
-c --clock=CLOCK  选择时钟  cyclictest -c 1      0 = CLOCK_MONOTONIC (默认)    1 = CLOCK_REALTIME
-i --interval=INTV 基本线程间隔,默认为1000(单位为us)
-l --loops=LOOPS 循环的个数,默认为0(无穷个),与 -i 间隔数结合可大致算出整个测试的时间,比如 -i 1000  -l 1000000 ,总的循环时间为1000*1000000=1000000000 us =1000s ,所以大致为16分钟多
-n --nanosleep 使用 clock_nanosleep
-h  --histogram=US  在执行完后在标准输出设备上画出延迟的直方图(很多线程有相同的权限)US为最大的跟踪时间限制
-q  --quiet  使用-q 参数运行时不打印信息,只在退出时打印概要内容,结合-h HISTNUM参数会在退出时打印HISTNUM 行统计信息以及一个总的概要信息
-f  --ftrace ftrace函数跟踪(通常与-b 配套使用,其实通常使用 -b 即可,不使用 -f )
-b  --breaktrace=USEC 当延时大于USEC指定的值时,发送停止跟踪。USEC,单位为谬秒(us)

运行结果含义

T: 0 序号为0的线程
P: 0 线程优先级为0
C: 9397 计数器。线程的时间间隔每达到一次,计数器加1
I: 1000 时间间隔为1000微秒(us)
Min: 最小延时(us)
Act: 最近一次的延时(us)
Avg: 平均延时(us)
Max: 最大延时(us)

四、实验结果:

在我们的板卡上进行实时性测试,先对非实时系统进行测试,得到测试结果如下:

linux打实时补丁以及实时性能测试_第1张图片

对实时性系统进行测试,得到的测试结果如下:

linux打实时补丁以及实时性能测试_第2张图片

linux打实时补丁以及实时性能测试_第3张图片

五、实验结论:

在线程数较少,且线程运行时间较短的情况下,性能差异并不明显,但如果线程数较多,且运行时间较长时,对于非实时系统,个别线程的时延能达到ms级,而对于实时系统来说,平均时延还是保持在20us左右,所以对于实时性要求较高的系统,我们还是应该给linux内核打上实时的补丁!

你可能感兴趣的:(linux系统移植,linux,实时补丁,cyclictest,实时性测试,linux打补丁步骤)