Linux cyclictest 命令 - 测试 CPU 负载和响应时间
介绍
cyclictest 是一个用于测试 Linux 内核实时性的命令行程序,是 rt-tests 下的一个测试工具,也是 rt-tests 下使用最广泛的测试工具,一般用来测试 Linux 内核的延迟。
cyclictest 命令由 rt-tests 软件包提供,在 Debian/Ubuntu 系统上可以使用如下命令进行安装。
sudo apt install rt-tests
代码仓库:https://git.kernel.org/pub/scm/utils/rt-tests/rt-tests
语法:
cyclictest <options>
选项:
-a,--affinity[=PROC-SET]:指示 CPU 亲和性,即在处理器 N 上运行线程,例如-a 0,1,2、-a 0-2、-a 0-2,4都可以,!表示否定,如-a !2-4表示绑定在 2-4 以外的所有 CPU 核上。-A,--align=USEC:以微秒为单位将测量线程唤醒与特定偏移量对齐。-b,--breaktrace=USEC:调试选项,用于控制实施抢占补丁中的延迟跟踪器。当延时大于 USEC 指定的值时,发送停止跟踪。USEC 单位为 μs。-c,--clock=CLOCK:选择时钟。0 为线性增长时钟,1 为墙上时间时钟。当设置-s选项时,该选项失效。-C,--context:上下文切换。调试相关,和-b选项一起用的。-d,--distance=DIST:当多个线程时,设置间隔(睡眠时间)的增量 distance。interval (线程n) = interval (线程n-1) + DIST。当该选项设置为 0 时,即 DIST=0 时,所有线程都会在同一时间醒来,不过这违背了cyclictest 的初衷,它是想测试每时每刻系统响应速度,而不是一瞬间把系统爆掉。-E,--event:调试相关,和-b选项联合使用。-f,--ftrace:调试相关,和-b选项联合使用。-h,--histogram=US:输出直方图到 stdout。指定要跟踪的最大的延迟数值。--histfile=<path>:输出直方图到文件。-H:同-h选项,同时该选项还会输出多一列数据在最右边,表示求和,当只有一个线程时,-H等价于-h。-i,--interval=INTV:设置第一个线程的间隔(睡眠时间),默认 1000us。-l,--loops=LOOPS:默认为 0,表示无止境测下去。-m,--mlockall:锁定当前和未来的内存分配以阻止被 page out(页调出)。-M,--refresh_on_max:延迟更新屏幕直到达到新的最大延迟(对于在低带宽连接上运行循环测试很有用)。-n,--nanosleep:使用 clock_nanosleep 代替 posix interval timer。-N,--nsecs:用纳秒为单位显示结果,而不是默认的微秒。-o,--oscope=RED:示波器模式。-O,--traceopt=TRACING_OPTION:跟踪选项相关。-p,--prio=PRIO:设置第一个线程的优先级。Priority(n) = max (Priority(n-1)-1, 0)-q,--quiet:静默模式,只输出概述信息。适用于自动化测试的时候,在脚本中使用这个选项。-r,--relative:使用相对时间。默认绝对时间。官方手册不建议使用。-s,--system:使用 sys_nanosleep 和 sys_setitimer 取代 posix timer。但是-s选项只应该在一个线程时使用,因为 itimer 每个进程只有一个,而不是每个线程都有。该选项可以结合-n选项一起使用,这样就不会受限于只对一个线程使用了。-S,--smp:为 SMP 系统上的标准测试设置选项。等效于使用选项-t -a -n以及在所有线程中保持任何指定的优先级相等。-t,--threads[=NUM]:该选项用来指定线程数。没有指定该选项时,默认 1 个线程。指定了该选项但又没有指定数字时,会开启 CPU 核心个数个线程。-T,--tracer=TRACEFUNC:跟踪器相关。-v,--verbose:输出统计信息。结合-l使用。-D,--duration=TIME:运行时间,默认单位 s,可以使用 “m h d” 代表分钟、小时、天。-w,--wakeup:唤醒追踪,配合-b选项。-W,--wakeuprt:实 时线程唤醒追踪,配合-b选项。-y,--policy=NAME:设置调度策略。可选 other、normal、batch、idle、fifo、rr 策略。
示例
运行 5 个线程,线程优先级 80,无限循环
cyclictest -t 5 -p 80 -n
运行 1 个线程(使用 clock_nanosleep), 线程优先级 80,间隔 10000 微秒,10000 次循环,无负载
cyclictest -t1 -p 80 -n -i 10000 -l 10000
运行 1 个线程(使用 posix interval timer)线程优先级 80,间隔 10000 微秒,10000 次循环,无负载
cyclictest -t1 -p 80 -i 10000 -l 10000
输出格式
下面是 cyclictest 测试示例运行时的打印信息:
$ sudo cyclictest -t 5 -p 80
# /dev/cpu_dma_latency set to 0us
policy: fifo: loadavg: 1.85 1.89 3.04 1/2760 1556268
T: 0 (1556027) P:80 I:1000 C: 14957 Min: 1 Act: 2 Avg: 2 Max: 258
T: 1 (1556028) P:80 I:1500 C: 9971 Min: 1 Act: 2 Avg: 2 Max: 365
T: 2 (1556029) P:80 I:2000 C: 7478 Min: 1 Act: 7 Avg: 3 Max: 388
T: 3 (1556030) P:80 I:2500 C: 5982 Min: 1 Act: 4 Avg: 2 Max: 39
T: 4 (1556031) P:80 I:3000 C: 4985 Min: 1 Act: 3 Avg: 3 Max: 224
输出字段说明如下表所示:
| 字段 | 描述 |
|---|---|
T | 线程序号,括号里面是 PID |
P | 线程优先级 |
C | 计数器(线程的时间间隔每达到一次,计数器加 1) |
I | 时间间隔,单位是微秒(us) |
Min | 最小延时,单位是微秒(us) |
Act | 最近一次的延时,单位是微秒(us) |
Avg | 平均延时,单位是微秒(us) |
Max | 最大延时,单位是微秒(us) |
