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.03. 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`
docolumn=`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`
doif test $i != 1thenecho -n ", " >>plotcmdficpuno=`expr $i - 1`if test $cpuno -lt 10thentitle=" CPU$cpuno"elsetitle="CPU$cpuno"fiecho -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/0x0Line 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)

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity 代码优化记录

文档 unity 代码优化分析&#xff1a;https://docs.unity3d.com/Manual/analysis.html Unity 修复性能问题&#xff1a;https://learn.unity.com/tutorial/fixing-performance-problems-2019-3?courseId5c87de35edbc2a091bdae346#604586d7edbc2a5b4345d249 实例 具体枚举转En…

Arcgis/GeoScene API for JavaScript 三维场景底图网格设为透明

项目场景&#xff1a; 有时候加载的地图服务白色区域会露底&#xff0c;导致在三维场景时&#xff0c;露出了三维网格&#xff0c;影响效果&#xff0c;自此&#xff0c;我们需要将三维场景的底图设为白色或透明。 问题描述 如图所示&#xff1a; 解决方案&#xff1a; 提示…

snort3.0-ubuntu18.04 64入侵检测安装与使用ailx10ailx10​​知乎知识会员

在日常生活中&#xff0c;很多人怀疑自己的手机、电脑被监控了&#xff0c;担心自己的隐私泄漏&#xff0c;实际上最佳的检测方式就是终端检测&#xff0c;也就是EDR&#xff0c;但是就是有那么多的人在网上大放厥词&#xff0c;说任何EDR杀毒软件都检测不到监控&#xff0c;毕…

AI语言模型的技术之争:DeepSeek与ChatGPT的架构与训练揭秘

云边有个稻草人-CSDN博客 目录 第一章&#xff1a;DeepSeek与ChatGPT的基础概述 1.1 DeepSeek简介 1.2 ChatGPT简介 第二章&#xff1a;模型架构对比 2.1 Transformer架构&#xff1a;核心相似性 2.2 模型规模与参数 第三章&#xff1a;训练方法与技术 3.1 预训练与微调…

AI赋能前端协作:效率提升与团队新动力

当前前端开发领域竞争激烈&#xff0c;项目交付周期紧迫&#xff0c;前端开发团队面临着诸多挑战。沟通成本高、代码规范不统一、开发效率低等问题&#xff0c;常常导致项目延期、质量下降&#xff0c;甚至团队士气低落。而AI代码生成器的出现&#xff0c;为解决这些问题带来了…

Django快速入门

1. 安装 在安装了python环境下&#xff0c;在命令行winr&#xff0c;录入 pip install django或者使用国内源下载 pip install -i https://pypi.douban.com/simple/ django安装完成后&#xff0c;在%python%/Scripts目录下会出现如下图的django-admin.exe的文件 以及django…

Windows可以永久暂停更新了

最终效果图&#xff1a; 第一步&#xff1a; winR组合键打开运行对话框&#xff0c;输入“regedit”&#xff0c;点击“确定”或回车&#xff1a; 第二步&#xff1a; 注册表定位到“\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings”&#xff0c;新建DWO…

在anaconda环境中构建flask项目的exe文件

一、创建并激活虚拟环境 conda create -n flask_env python3.9 # python版本根据项目需求安装 conda activate flask_env # 激活环境二、安装必要依赖 推荐使用conda&#xff0c;pip没尝试过&#xff0c;但是deepseek给出了命令 conda install flask …

C++ Primer 条件语句

欢迎阅读我的 【CPrimer】专栏 专栏简介&#xff1a;本专栏主要面向C初学者&#xff0c;解释C的一些基本概念和基础语言特性&#xff0c;涉及C标准库的用法&#xff0c;面向对象特性&#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施&#xff0c;使你更加适应高级…

微服务SpringCloud Alibaba组件nacos教程【详解naocs基础使用、服务中心配置、集群配置,附有案例+示例代码】

一.Nacos教程 文章目录 一.Nacos教程1.1 Nacos简介1.2 nacos基本使用直接下载打包服务源码方式启动 1.3 创建nacos客服端1.4 nacos集群配置1.5 nacos配置中心 1.1 Nacos简介 nacos是spring cloud alibaba生态中非常重要的一个组件&#xff0c;它有两个作用&#xff1a; 1:注册…

在 Navicat 17 中扩展 PostgreSQL 数据类型 - 范围类型

范围类型 PostgreSQL 是市场上最灵活的数据库之一&#xff0c;这已不是什么秘密。事实上&#xff0c;PostgreSQL 的可扩展性和丰富的功能集使 PostgreSQL 近期已超越 MySQL&#xff0c;成为最受开发人员推崇和最受欢迎的数据库系统。在这个使用 Navicat Premium 17 在 Postgre…

内容测试2

备注&#xff1a; 在7月10日记录之前遇到的问题及解决方法: 一&#xff1a;常见的访问问题&#xff1a; 403 Forbidden&#xff1a;&#xff08;未有请求权限&#xff09; 表示服务器理解请求但是拒绝执行它。这通常是由于服务器上的文件或资源没有正确的读、写或执行权限&…

安川伺服控制器MP系列优势特点及行业应用

在工业自动化领域&#xff0c;运动控制器的性能直接决定了设备的精度、效率和可靠性。作为全球领先的运动控制品牌&#xff0c;安川电机伺服控制器凭借其卓越的技术优势和广泛的应用场景&#xff0c;正在为智能制造注入强劲动力&#xff01; MP3100&#xff1a;主板型运动控制…

kafka生产端之架构及工作原理

文章目录 整体架构元数据更新 整体架构 消息在真正发往Kafka之前&#xff0c;有可能需要经历拦截器&#xff08;Interceptor&#xff09;、序列化器&#xff08;Serializer&#xff09;和分区器&#xff08;Partitioner&#xff09;等一系列的作用&#xff0c;那么在此之后又会…

二、交换机的vlan子设备接入

一、交换机的vlan设置-CSDN博客 二、交换机的vlan子设备接入-CSDN博客 接上篇的文章&#xff0c;本文接入了子设备 网络结构如下&#xff1a; 用路由器A和POE交换机B代替第一篇中的笔记本电脑&#xff0c;路由器A和交换机B都关闭DHCP服务&#xff0c;并分别接入一个IPC&#…

DedeBIZ系统审计小结

之前简单审计过DedeBIZ系统&#xff0c;网上还没有对这个系统的漏洞有过详尽的分析&#xff0c;于是重新审计并总结文章&#xff0c;记录下自己审计的过程。 https://github.com/DedeBIZ/DedeV6/archive/refs/tags/6.2.10.zip &#x1f4cc;DedeBIZ 系统并非基于 MVC 框架&…

C语言基本概念————讨论sqrt()和pow()函数与整数的关系

本文来源&#xff1a;C语言基本概念——讨论sqrt()和pow()函数与整数的关系. C语言基本概念——sqrt和pow函数与整数的关系 1. 使用sqrt()是否可以得到完全平方数的精确的整数平方根1.1 完全平方数的计算结果是否精确&#xff1f;1.2 为什么不会出现误差&#xff08;如 1.99999…

浏览器自动化与AI Agent结合项目browser-use初探

browser-use介绍 browser-use是将您的 AI 代理连接到浏览器的最简单方式。它通过提供一个强大且简单的接口来实现 AI 代理访问网站的自动化。 GitHub地址&#xff1a;https://github.com/browser-use/browser-use。目前已经获得了27.3k颗stars&#xff0c;2.7kforks&#xff…

阿里云 DeepSeek 模型部署与使用技术评测

引言 随着人工智能技术的不断发展&#xff0c;越来越多的企业和个人开始探索如何利用深度学习模型来提升业务效率和用户体验。阿里云推出的【零门槛、轻松部署您的专属 DeepSeek 模型】解决方案为用户提供了多种便捷的部署方式&#xff0c;包括基于百炼 API 调用满血版、基于人…

第二天:工具的使用

每天上午9点左右更新一到两篇文章到专栏《Python爬虫训练营》中&#xff0c;对于爬虫有兴趣的伙伴可以订阅专栏一起学习&#xff0c;完全免费。 键盘为桨&#xff0c;代码作帆。这趟为期30天左右的Python爬虫特训即将启航&#xff0c;每日解锁新海域&#xff1a;从Requests库的…