linux打实时补丁以及实时性能测试
linux打实时补丁以及实时性能测试
在工业产品中使用操作吸引,一般都需要使用实时性较强的操作系统,而众所周知,linux系统是基于时间片划分的非实时系统,其实时性难以满足工业化对时效性的要求,因此很多应用场景中无法使用linux操作系统。当然这一局限性已经有所改善,目前linux社区已经增加了众多版本的实时补丁,只要给linux内核打上实时补丁,其实时性会得到大幅度提升。
在此,我们就讲讲如何给linux内核打补丁以及如何测试linux系统的实时性。
一、给linux打实时补丁
我们以linux-xlnx-xilinx-v2017.4.zip为例子,来讲解如何打实时补丁。首先要下载一个与linux版本完全对应的补丁文件。下载地址为:
这里我们下载的补丁文件内为:patch-4.9-rt1.patch.gz,下载完实时补丁后,将实时补丁存放在linux-xlnx-xilinx-v2017.4.zip相同的文件路径下。后续步骤如下:
- 解压linux内核:7za x linux-xlnx-xilinx-v2017.4.zip -r -o./
- 解压补丁文件:gunzip patch-4.9-rt1.patch.gz
- 进入linux内核目录: cd linux-xlnx-xilinx-v2017.4
- 打补丁:patch -p1 < ../patch-4.9-rt1.patch
- 进入内核menuconfig菜单,勾选上Kernel Features->Preemption Model->Fully Preemptible Kernel (RT)
- 编译内核:make uImage -j2 LOADADDR=0x8000
二、测试linux的实时性
前面我们已经生成了实时的linux内核镜像,接下来我们把实时内核烧写到板卡上,进行实时性性能测试。这里需要引入一个测试linux性能的工具 cyclictest
- 拷贝cyclictest的Git 仓库:在ubuntu下可执行如下命令:git clone git://git.kernel.org/pub/scm/utils/rt-tests/rt-tests.git
- 进入git仓库,切换到我们要用的分支:cd rt-tests git checkout stable/v1.0
- 修改编译工具链
:
- 编译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) |
四、实验结果:
在我们的板卡上进行实时性测试,先对非实时系统进行测试,得到测试结果如下:
对实时性系统进行测试,得到的测试结果如下:
五、实验结论:
在线程数较少,且线程运行时间较短的情况下,性能差异并不明显,但如果线程数较多,且运行时间较长时,对于非实时系统,个别线程的时延能达到ms级,而对于实时系统来说,平均时延还是保持在20us左右,所以对于实时性要求较高的系统,我们还是应该给linux内核打上实时的补丁!