Linux内核实时机制x - 中断响应测试 Cyclictest分析1

Linux内核实时机制x - 中断响应测试Cyclitest

1 实时性测试工具 rt-test

1.1 源码下载

 1.下载源码: 
~/0-code/5.15$ git clone git://git.kernel.org/pub/scm/utils/rt-tests/rt-tests.git
正克隆到 'rt-tests'...
remote: Enumerating objects: 5534, done.
remote: Counting objects: 100% (7/7), done.
remote: Compressing objects: 100% (7/7), done.
remote: Total 5534 (delta 1), reused 0 (delta 0), pack-reused 5527
接收对象中: 100% (5534/5534), 1.08 MiB | 654.00 KiB/s, 完成.
处理 delta 中: 100% (3569/3569), 完成.

1.2 源码编译

 2. cd rt-tests  && git checkout stable/v1.0
 3. make all && make install 
 4. ./cyclictest -p 90 -m -n -c 0 -t 4 -D5m -b 60 --tracemark

1.3 实测图

在这里插入图片描述

2 Cyclitest详解

2.1 中断响应、延时概念:

  • 无论系统运行在任何代码路径,当事件发生时,系统响应 该事件的时间即为延时
  • 延时在不同的上下文有不同的含义,而Cyclitest所测得的延时是中断响应延时 和 调度延时,如下图:
    • 中断延时(interrupt latency),即中断发生到进入中断处理程序ISR的延时。
    • 调度延时(scheduing latency),即当前任务被唤醒到任务真正获得CPU使用权中间的延时。
      中断延时测量

2.2 Cyclitest 原理

  • 1、首先通过启动一个master的普通进程

  • 2、然后matser进程在启动指定数量,指定优先级的实时进程,
    -实时进程会设置一个timer周期性的唤醒自己
    -从timer溢出触发中断并进入ISR调用 wake_up_process唤醒实时进程,到进程真正能被运行,这中间的时间即我们需要测量的延时。

  • 3、并通过共享内存将该值传递给master进程进行统计,如此周而复始,最终由master进程将结果输出。

  • 当造成延时的事件发生在timer溢出之前,那么这样的延时将不会被捕捉到,所以我们需要足够久的运行cyclitest才能更大概率的抓取全面的延时数据。

master线程逻辑

  • 先创建num_threads个指定优先级的实时线程,然后在while循环中读取实时线程放在共享内存中的数据。
	for (i = 0; i < num_threads; i++) {
		pthread_attr_t attr;
		int node;
		struct thread_param *par;
		struct thread_stat *stat;
		par->prio = priority;				//设置线程优先级,由-p参数指定
 
 
		par->clock = clocksources[clocksel];	//由-c 设置
		par->mode = mode;
		par->timermode = timermode;			//默认为static int timermode = TIMER_ABSTIME;,可由-r指定
		//当使用 TIMER_ABSTIME 模式时,定时器的时间值是一个绝对时间点。
		//也就是说,定时器将在指定的确切时间点触发,适用于需要定时器在特定的日期和时间点触发的场景
		
		//当使用 TIMER_RELTIME 模式时,定时器的时间值是一个相对当前时间的偏移量。
		//定时器将在从当前时间开始经过指定的时间间隔后触发。适用于需要定时器在当前时间之后的一段时间内触发的场景
	 
		par->interval = interval;			//默认睡眠时间为DEFAULT_INTERVAL或者 -i 10000 参数指定
		
 
		par->max_cycles = max_cycles;
		par->stats = stat;
		par->node = node;
		par->tnum = i;
		switch (setaffinity) {
		case AFFINITY_UNSPECIFIED: par->cpu = -1; break;
		case AFFINITY_SPECIFIED:
			par->cpu = cpu_for_thread(i, max_cpus);	//设置CPU亲和性
			if (verbose)
				printf("Thread %d using cpu %d.\n", i,
					par->cpu);
			break;
		case AFFINITY_USEALL: par->cpu = i % max_cpus; break;
		}
		stat->min = 1000000;
		stat->max = 0;
		stat->avg = 0.0;
		stat->threadstarted = 1;
		stat->smi_count = 0;
		status = pthread_create(&stat->thread, &attr, timerthread, par);	//创建线程

3 Cyclitest 参数详解

3.1、常用的基本选项

参数完整参数用法作用
-a–affinity-a 0,1 表将线程绑定到 CPU 0 和 CPU 1 上运行通过绑定线程到特定CPU,减少上下文切换开销,提高测试准确性。
-d :–distance-d 500 表示线程之间的唤醒间隔为 500 微秒。设置线程间的唤醒间隔时间(微秒),控制线程的唤醒频率,影响测试的负载
-D–duration=TIME、–latency=PM_QOS-D 10m 表示测试持续 10 分钟。控制测试的运行时间, 单位 ‘m’ ‘h’ ‘d’ 分钟 小时 天
-F–fifo–fifo=path在指定路径下创建一个管道,用来向它写stats
-i–interval=INTV-i 1000 表示线程每隔 1000 微秒唤醒一次设置线程的唤醒间隔时间(微秒),控制线程的唤醒频率,影响测试的负载。
-l–loops=LOOPS、–laptop-l 10000 表示测试运行 10000 次循环。设置测试的循环次数,控制测试的运行次数,避免无限运行。
-m–mlockall-m 表示锁定所有内存锁定所有内存,防止内存被交换到磁盘,避免内存交换对测试结果的影响,确保测试的准确性
-n–nanosleep、–notrace-n 表示使用 clock_nanosleep使用 clock_nanosleep 进行高精度睡眠,减少系统调用的开销
-p–priority=PRIO-p 99 表示设置线程的优先级为 99。设置线程的调度优先级,影响线程的调度顺序。

3.2、关于timer和时间的选项

在这里插入图片描述

3.3、关于输出打印的选项

在这里插入图片描述

3.4、tracing相关的选项

  • –tracemark:结合-b和ftrace可以抓取和优化实时问题

在这里插入图片描述

3.5、参考测试参数

  • cyclictest -p 90 -m -n -c 0 -t 4 -D5m -b 60 --tracemark
-p 90: 指定线程优先级为90-m: 内存锁定
-n: 使用 clock_nanosleep 进行高精度睡眠
-c: 选择默认时钟类型
-t: 创建4个线程
-D5m: 测试5分钟
-b 60: 最大延时超过60us时,退出
--tracemark:将程序测试获取的超时比较日志打印到ftrace中。
  • ./cyclictest -S -p 95 -d 0 -i 1000 -D 48h -m -n
 -S:每个core分配了一个thread
-d 0: 当每个CPU上只有一个线程时,将他设置为0,否则需使用-d 将其唤醒时间隔离开来,累加到interval上,默认为500
-i 1000:设置睡眠唤醒时间interval
-D 48h: 测试48小时 
  • ./cyclictest -p 95 -t 16 -d 500 -i 1000 -D 48h -m -a -n
 使用时也可以去掉-S,自己指定threads数量和设置亲和性
 -t 16:创建16个线程
 -d 500: 每个线程间隔500唤醒

3.6、输出参数的使用

  • 比较常用的参数有-h和-q
-h  用来输出直方图
-q  用来在测试完成后再打印结果
  • Cyclitest 绘制直方图

https://zhuanlan.zhihu.com/p/336381111
https://www.osadl.org/Create-a-latency-plot-from-cyclictest-hi.bash-script-for-latency-plot.0.html

#!/bin/bash

# 1. Run cyclictest   将cyclictest的输出重定向到一个文件
cyclictest -l100000000 -m -Sp90 -i200 -h400 -q >output 

# 2. Get maximum latency	获取最大延迟时间
max=`grep "Max Latencies" output | tr " " "\n" | sort -n | tail -1 | sed s/^0*//`

# 3. Grep data lines, remove empty lines and create a common field separator
grep -v -e "^#" -e "^$" output | tr " " "\t" >histogram 

# 4. Set the number of cores, for example
cores=4

# 5. Create two-column data sets with latency classes and frequency values for each core, for example
for i in `seq 1 $cores`
do
  column=`expr $i + 1`
  cut -f1,$column histogram >histogram$i
done

# 6. Create plot command header
echo -n -e "set title \"Latency plot\"\n\
set terminal png\n\
set xlabel \"Latency (us), max $max us\"\n\
set logscale y\n\
set xrange [0:400]\n\
set yrange [0.8:*]\n\
set ylabel \"Number of latency samples\"\n\
set output \"plot.png\"\n\
plot " >plotcmd

# 7. Append plot command data references
for i in `seq 1 $cores`
do
  if test $i != 1
  then
    echo -n ", " >>plotcmd
  fi
  cpuno=`expr $i - 1`
  if test $cpuno -lt 10
  then
    title=" CPU$cpuno"
   else
    title="CPU$cpuno"
  fi
  echo -n "\"histogram$i\" using 1:2 title \"$title\" with histeps" >>plotcmd
done

# 8. Execute plot command
gnuplot -persist <plotcmd

3.7、追踪参数的使用+ftrace

  • traceing的过程中我们通常使用–ftrace,
  • 而ftrace的原理是通过在函数入口和出口产生异常,这样得到latency结果包含ftrace的overhead,
  • 通常会是几十微秒的数量级,所以在设置-b参数时,我们需要预估一下ftrace带来的overhead。
方式1、接口参数
//当latency大于100时,cyclictest会自动退出,
1、cyclictest -S -p 95 -t -i 1000 -D 1h -m -d 1000 -b 100 --context --event --ftrace -T function_graph
//通过ftrace接口,可以抓取到的context_switch事件。
2、cat /sys/kernel/debug/tracing/trace |grep cyclictest

方式2、trace-cmd
1、trace-cmd reset
2、trace-cmd start -e all;./cyclictest -p 90 -m -n -c 0 -t 4 -D5m -b 60 --tracemark
3、 trace-cmd extract
4、 trace-cmd report -l > log-t9.txt
5、日志:
rcuc/2-30      2d.h34 69432.307127: irq_handler_entry:    irq=2 name=arch_timer
rcuc/2-30      2d.h44 69432.307127: hrtimer_cancel:       hrtimer=0xffffff9ffe293de0
rcuc/2-30      2d.h34 69432.307127: hrtimer_expire_entry: hrtimer=0xffffff9ffe293de0 now=69432656559745 function=hrtimer_wakeup/0x0
  
Line 376096: cyclicte-1768059   2d..20 69432.305162: sched_switch:         cyclictest:1768059 [9] S ==> ksoftirqd/2:31 [120]
Line 376096: cyclicte-1768059   2d..20 69432.305162: sched_switch:         cyclictest:1768059 [9] S ==> ksoftirqd/2:31 [120]
Line 385395:   rcuc/2-30      2d.h54 69432.307127: sched_waking:         comm=cyclictest pid=1768059 prio=9 target_cpu=002
Line 385396:   rcuc/2-30      2d.h54 69432.307127: sched_migrate_task:   comm=cyclictest pid=1768059 prio=9 orig_cpu=2 dest_cpu=0
Line 385398:   rcuc/2-30      2d.h64 69432.307127: sched_wakeup:         cyclictest:1768059 [9] success=1 CPU:000
Line 385591: kylin-as-5018    0d..20 69432.307176: sched_switch:         kylin-assistant:5018 [120] R ==> cyclictest:1768059 [9]

//添加--tracemark则会打印超时日志
cyclicte-1768059   0....0 69432.307210: print:   tracing_mark_write: hit latency threshold (66 > 50)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/968530.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

实现限制同一个账号最多只能在3个客户端(有电脑、手机等)登录(附关键源码)

如上图&#xff0c;我的百度网盘已登录设备列表&#xff0c;有一个手机&#xff0c;2个windows客户端。手机设备有型号、最后登录时间、IP等。windows客户端信息有最后登录时间、操作系统类型、IP地址等。这些具体是如何实现的&#xff1f;下面分别给出android APP中采集手机信…

如何获取,CPU,GPU,硬盘,网卡,内存等硬件性能监控与各项温度传感器

首先需要下载 OpenHardwareMonitorServer 这是一个基于OpenHardwareMonitor 的 Web 服务器。可以让任何语言都可以获取硬件信息和值&#xff0c;OpenHardwareMonitorServer 是没有UI界面的因此它可以当成控制台程序使用。 该程序可用参数如下 参数&#xff1a;需要管理员权限…

解锁大语言模型潜能:KITE 提示词框架全解析

大语言模型的应用日益广泛。然而&#xff0c;如何确保这些模型生成的内容在AI原生应用中符合预期&#xff0c;仍是一个需要不断探索的问题。以下内容来自于《AI 原生应用开发&#xff1a;提示工程原理与实战》一书&#xff08;京东图书&#xff1a;https://item.jd.com/1013604…

C++STL容器之map的使用及复现

map 1. 关联式容器 vector、list、deque、forward_list(C11) 等STL容器&#xff0c;其底层为线性序列的数据结构&#xff0c;里面存储的是元素本身&#xff0c;这样的容器被统称为序列式容器。而 map、set 是一种关联式容器&#xff0c;关联式容器也是用来存储数据的&#xf…

网络工程师 (30)以太网技术

一、起源与发展 以太网技术起源于20世纪70年代&#xff0c;最初由Xerox公司的帕洛阿尔托研究中心&#xff08;PARC&#xff09;开发。最初的以太网采用同轴电缆作为传输介质&#xff0c;数据传输速率为2.94Mbps&#xff08;后发展为10Mbps&#xff09;&#xff0c;主要用于解决…

30天开发操作系统 第 20 天 -- API

前言 大家早上好&#xff0c;今天我们继续努力哦。 昨天我们已经实现了应用程序的运行, 今天我们来实现由应用程序对操作系统功能的调用(即API, 也叫系统调用)。 为什么这样的功能称为“系统调用”(system call)呢&#xff1f;因为它是由应用程序来调用(操作)系统中的功能来完…

Java面试题及答案整理( 2023年 6 月最新版,持续更新)

秋招金九银十快到了&#xff0c;发现网上很多Java面试题都没有答案&#xff0c;所以花了很长时间搜集整理出来了这套Java面试题大全~ 这套互联网 Java 工程师面试题包括了&#xff1a;MyBatis、ZK、Dubbo、EL、Redis、MySQL、并发编程、Java面试、Spring、微服务、Linux、Spri…

查询语句来提取 detail 字段中包含 xxx 的 URL 里的 commodity/ 后面的数字串

您可以使用以下 SQL 查询语句来提取 detail 字段中包含 oss.kxlist.com 的 URL 里的 commodity/ 后面的数字串&#xff1a; <p><img style"max-width:100%;" src"https://oss.kxlist.com//8a989a0c55e4a7900155e7fd7971000b/commodity/20170925/20170…

管式超滤膜分离技术都可以应用到哪些行业?

管式超滤膜分离技术由于其高效、稳定和适应性强的特点&#xff0c;在多个行业都有广泛的应用&#xff1a; 1. 生物制药与医药行业 纯化与浓缩&#xff1a;在生物药品的下游处理阶段&#xff0c;管式超滤膜被用来纯化抗体、疫苗、蛋白质等生物大分子&#xff0c;通过精确筛选分子…

基于opencv的 24色卡IQA评测算法源码-可完全替代Imatest

1.概要 利用24色卡可以很快的分析到曝光误差&#xff0c;白平衡误差&#xff0c;噪声&#xff0c;色差&#xff0c;饱和度&#xff0c;gamma值。IQA或tuning工程一般用Imatest来手动计算&#xff0c;不便于产测部署&#xff0c;现利用opencv实现了imatest的全部功能&#xff0c…

【matlab优化算法-17期】基于DBO算法的微电网多目标优化调度

基于蜣螂DBO算法的微电网多目标优化调度 一、前言 微电网作为智能电网的重要组成部分&#xff0c;其优化调度对于降低能耗、减少环境污染具有重要意义。本文介绍了一个基于Dung Beetle Optimizer&#xff08;DBO&#xff09;算法的微电网多目标优化调度项目&#xff0c;旨在通…

【多模态大模型】系列2:Transformer Encoder-Decoder——BLIP、CoCa、BEITv3

目录 1 BLIP2 CoCa3 BEITv3 1 BLIP BLIP: Bootstrapping Language-Image Pre-training for Unified Vision-Language Understanding and Generation BLIP是 ALBEF 原班人马做的&#xff0c;基本可以看做吸收了 VLMo 思想的 ALBEF。训练的 loss 和技巧都与 ALBEF一致&#xff…

算法——搜索算法:原理、类型与实战应用

搜索算法&#xff1a;开启高效信息检索的钥匙 在信息爆炸的时代&#xff0c;搜索算法无疑是计算机科学领域中熠熠生辉的存在&#xff0c;它就像一把神奇的钥匙&#xff0c;为我们打开了高效信息检索的大门。无论是在日常生活中&#xff0c;还是在专业的工作场景里&#xff0c;…

在vmd中如何渲染透明水分子

1.设置背景为白色 依次点击Graphics>>Colors... 2. 改变渲染模式 依次点击Display>>rendermode>>GLSL 3. 渲染水分子 选中水分子&#xff0c;显色方式改为ColorID, 编号10的颜色&#xff1b; 选择材质为GlassBubble; 绘图方式为QuickSurf. 若水盒子显示效…

【Cocos TypeScript 零基础 15.1】

目录 见缝插针UI脚本针脚本球脚本心得_旋转心得_更改父节点心得_缓动动画成品展示图 见缝插针 本人只是看了老师的大纲,中途不明白不会的时候再去看的视频 所以代码可能与老师代码有出入 SIKI_学院_点击跳转 UI脚本 import { _decorator, Camera, color, Component, directo…

Go+Wails+Vue 开发:添加停止按钮功能的实现

在本教程中&#xff0c;我将展示如何在一个使用 Wails 框架&#xff08;后端 Go&#xff09;和 Vue.js&#xff08;前端&#xff09;的彩票模拟器项目中添加一个“停止”按钮。由于现有的教程内容较为单一&#xff0c;我将通过具体的实现步骤进行详细说明。 项目初始化 首先&a…

微服务保护---Sentinel

1. 初始Sentinel 1.1. 雪崩问题及解决方案 1.1.1. 雪崩问题 微服务中&#xff0c;服务间调用关系错综复杂&#xff0c;一个微服务往往依赖于多个其它微服务。 如图&#xff0c;如果服务提供者I发生了故障&#xff0c;当前的应用的部分业务因为依赖于服务I&#xff0c;因此也会…

win32汇编环境,窗口程序使用跟踪条(滑块)控件示例一

;运行效果 ;win32汇编环境,窗口程序使用跟踪条(滑块)控件示例一 ;生成2条横的跟踪条,分别设置不同的数值范围,设置不同的进度副度的例子 ;直接抄进RadAsm可编译运行。重要部分加备注。 ;下面为asm文件 ;>>>>>>>>>>>>>>>>>…

pnpm的使用

pnpm的使用 1.安装和使用2.统一包管理工具下载依赖 1.安装和使用 pnpm:performant npm &#xff0c;意味“高性能的npm”。 pnpm由npm/yarn衍生而来,解决了npm/yarn内部潜在的bug,极大的优化了性能,扩展了使用场景。被誉为“最先进的包管理工具”。 pnpm安装指令: npm i -g p…

音视频协议

1. 多媒体信息 1.1 多媒体信息的两个主要特点&#xff1a; 信息量很大 标准语音&#xff1a;64Kbits(8KHz采样&#xff0c;8位编码)高质量音频&#xff1a;3Mbps(100KHz采样&#xff0c;12位编码) 在传输多媒体数据时&#xff0c;对时延和时延抖动均有较高要求 1.2 处理时延…