编译rt-linux与使用rt-tests
1 rt-linux
1.1 下载内核与补丁
1 | 内核下载地址:https://mirrors.edge.kernel.org/pub/linux/kernel/ |
1.2 配置内核
1 | # 使用make XXXconfig可以生成编译需要的配置文件,这个配置文件是.config。make oldconfig基于已有的.config文件生成新的配置文件,这样就可以避免配置大量的内核参数了。内核版本相差太大,可能出现内核符号不一致的情况,所以上一步需要让内核的版本尽量一致。 |
1.3 编译内核
1 | # make deb-pkg用于构建deb内核包,即包括源码包也包括二进制包。 |
1.4 安装deb包
1 | sudo dpkg -i ../*.deb |
2 rt-tests
rt-tests是一个用于测试各种Linux的实时特性的测试套件。
2.1 编译与安装
1 | sudo apt-get install build-essential libnuma-dev # 安装编译环境和必需的库 |
2.2 用法
cyclictest
通过精确测量线程的预期唤醒时间和实际唤醒时间,以提供系统时延的统计信息。这些时延是由硬件、固件和操作系统引起的。
cyclictest通过运行一个非实时的主线程(调度类型SCHED_OTHER)来测试时延,它会启动固定数量的度量线程,这此度量线程有固定的实时优先级(调度类型SCHED_FIFO)。度量线程被在固定间隔内被计时器周期性地唤醒。随后,预期唤醒时间和实际唤醒时间通过共享内存传给主线程。主线程追踪时延的值并打印出它们。
1 | cyclictest [options] |
结果的含意:
缩写 | 含义 | 描述 |
---|---|---|
T | Thread | 线程索引和线程ID |
P | Priority | RT线程的优先级 |
I | Interval | 度量线程的预期唤醒周期,单位us |
C | Count | 时延被测量的次数,例如:迭代次数 |
Min | Minimum | 测量到的最小时延,单位us |
Act | Actual | 最近完成的迭代测量到的时延,单位us |
Max | Maximum | 测量到的最大时延,单位us |
hackbench
hackbench用来定位系统中的瓶颈,这些瓶颈应该被消除或优化。
hackbench测试的是内核里的调度器。它还可以通过重复设置和删除线程来对内存子系统进行压力测试。此外,它还可以在一定程度上对进程间通信(如本地的网络插座,管道等)进行压力测试。
它可以测试系统的负载,但不能精确测试应用的负载,因为它不测试与设备的通信。
它创建若干对可调度实体(进程或线程),每对调度实体之间通过网络插座或管道通信,它会记录每对之间来回发送数据的时间。
1 | hackbench [options] |
hwlatdetect
本程序用来控制内核模块hwlat_detector.ko,这个内核模块是用来探测硬件时延的,注意这个时延和Linux内核自身无关。
本程序刚开始是用来探测x86上的SMIs(系统管理中断)。SMIs不由内核管理,内核一般也感知不到它。SMIs由BIOS设置和管理,一般用于关键事件,如热传感器和风扇的管理。有时,SMIs也用来管理那些占用时间过长的任务。
hwlat_detector.ko模块的工作原理:通过调用stop_machine()
占用CPU的所有可配置时间,轮询TSC(时间戳计数器),然后查找TSC之间的空隙。由于机器已经停止了,中断也关闭了,所有的间隙都表示轮询被中断的时间,只有SMI能做到了。
本程序管理着debugsf的挂载、卸载,hwlat_detector.ko模块的加载、卸载。
pip_stress
本程序测试进程间的优先级继承。本程序不接受任何参数,会在运行完毕后直接退出。
本程序会创建三个进程,这三个进程通过共享内存使用一个优先级继承的互斥锁,且都绑定在一个CPU上。最低优先级的进程持有互斥锁,然后中等优先级的进程抢占它,然后最高优先级的进程抢到这个互斥锁。由于优先级继承互斥锁使用的低优先级进程借给高优先级进程的优先级来解锁互斥锁,这就会阻止中优先级进程阻塞高优先级进程。
pi_stress
对互斥锁的优先级继承的压力测试。它作为时间优先级任务运行,并启动inversion machine thread groups。每个inversion group都会导致优先级反转条件,这样如果优先级继承不起作用则会死锁。
注:pi_stress线程是作为SCHED_FIFO或SCHED_RR线程运行的,这意味着它们可以使系统关键线程饥饿。建议在pi_stress之前把系统关键线程的调度策略改为SCHED_FIFO,并使用10以上的优先级,以避免pi_stress使这些线程饥饿。
1 | pi_stress [options] |
pmqtest
开启线程对,使用POSIX消息队列测量进程间通信的时延。线程对之间通过mq_send()/mw_receive()
同步,测量的是发送和接收消息的时延。
ptsematest
开启两个线程,使用POSIX互斥锁测量进程间通信的时延。两个线程之间通过pthread_mutex_unlock()/pthread_mutex_lock()
同步,测量的是释放和获取锁的时延。
rt-migrate-test
实时任务迁移程序。测试任务在多处理器上的实时调度,以确保最高优先级的任务可以运行在所有CPU上。
signaltest
信号往返测试
sigwaittest
启动两个线程,或fork两个进程,测量它们之间收发信号的时延
svsematest
启动两个线程,或fork两个进程,测量信号量SYSV的时延。