自动驾驶性能分析时,非常有用的两个信息
自动驾驶的关键路径如下,传感器的数据发送给感知模块;感知模块根据传感器数据来确定车辆所处的环境,比如前方有没有障碍物,是不是和车道线保持着适当的距离等;感知处理之后的数据传递给规控模块,规控根据车辆当前所处的环境来规划车辆的路线和加减速等;最后规控的结果要发送到底盘/动力来做真正的执行。

在自动驾驶的关键路径中,对确定性要求是非常高的,因为车辆是一个安全产品,一旦某个环节消耗的时间不符合确定性的要求,那么会造成比较大的影响。比如车辆前方有行人,那么车辆就需要及时刹停,不可延误。
确定性,考虑的是最恶劣的情况,假如规控模块要求,每次处理规控任务的处理时间不能超过2ms,那么就是要求无论系统运行在什么环境下,当前系统的负载是怎么样的,规控任务的处理时间都不能超过2ms。也就是说如果车辆连续运行了一周,假如规控运行的次数是1000万次,那么也不允许有一次超过2ms的。
1获取线程实际消耗的cpu时间
如下代码,如果要获取planning函数执行消耗的时间。在相当长的一段时间,都是直接获取CLOCK_BOOTTIME这种clock id的时间,这种时间都是墙上时间。在很多时候用这种时间来表示任务消耗的也是没有问题的,但是如果进程中发生了睡眠,发生了阻塞,使用这种时间就不准确了,这种时间不能表示任务实际消耗的cpu时间。
通过函数pthread_getcpuclockid获取的clock,表示cpu时间,也就是线程实际占用的cpu的时间。
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <time.h>
#include <pthread.h>void planning() {int counter = 0;for(int i = 0; i < 10000; i++) {counter++;}for (int i = 0; i < 5; i++) {sleep(1);}
}int main() {clockid_t clock_id;struct timespec start_time1;struct timespec end_time1;struct timespec start_time2;struct timespec end_time2;pthread_getcpuclockid(pthread_self(), &clock_id);clock_gettime(clock_id, &start_time1);clock_gettime(CLOCK_BOOTTIME, &start_time2);planning();clock_gettime(clock_id, &end_time1);clock_gettime(CLOCK_BOOTTIME, &end_time2);printf("real time:%ldns\n", (end_time1.tv_sec * 1000 * 1000 * 1000 + end_time1.tv_nsec) - (start_time1.tv_sec * 1000 * 1000 * 1000 + start_time1.tv_nsec));printf("wall time:%ldns\n", (end_time2.tv_sec * 1000 * 1000 * 1000 + end_time2.tv_nsec) - (start_time2.tv_sec * 1000 * 1000 * 1000 + start_time2.tv_nsec));return 0;
}
运行结果如下,cpu clock id显示的时间是线程实际消耗的时间,是514微秒左右;wall time是5秒。

2获取线程调度次数
在linux中进程的status文件中显示了线程调度的次数。最后两行表示线程调度次数,voluntary_ctxt_switches表示线程主动调度的次数,比如当线程睡眠,IO阻塞时,会触发线程调度,这时的调度就是自愿调度;nonvoluntary_ctxt_switches表示线程非自愿调度的次数,比如当线程的时间片用完,被调度器强制调度,这种情况就是非自愿调度。
可以通过该文件获取调度次数,可以在调用planning之前获取线程的调度次数,返回之后再次获取调度次数,两者的调度次数差就基本上能表示在planning执行过程中发生的调度次数。这里之所以说是基本上,而不是绝对,因为在获取调度次数到planning真正被执行,以及planning返回到获取调度次数之间,也有可能发生调度。
root@wangyanlong-virtual-machine:/home/wangyanlong/test# cat /proc/12744/status
Name: a.out
Umask: 0022
State: S (sleeping)
Tgid: 12744
Ngid: 0
Pid: 12744
PPid: 2374
TracerPid: 0
Uid: 0 0 0 0
Gid: 0 0 0 0
FDSize: 256
Groups: 0 999
NStgid: 12744
NSpid: 12744
NSpgid: 12744
NSsid: 2294
VmPeak: 2712 kB
VmSize: 2644 kB
VmLck: 0 kB
VmPin: 0 kB
VmHWM: 1024 kB
VmRSS: 1024 kB
RssAnon: 0 kB
RssFile: 1024 kB
RssShmem: 0 kB
VmData: 92 kB
VmStk: 132 kB
VmExe: 4 kB
VmLib: 1796 kB
VmPTE: 36 kB
VmSwap: 0 kB
HugetlbPages: 0 kB
CoreDumping: 0
THP_enabled: 1
Threads: 1
SigQ: 0/15188
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000000000000
SigCgt: 0000000000000000
CapInh: 0000000000000000
CapPrm: 000001ffffffffff
CapEff: 000001ffffffffff
CapBnd: 000001ffffffffff
CapAmb: 0000000000000000
NoNewPrivs: 0
Seccomp: 0
Seccomp_filters: 0
Speculation_Store_Bypass: thread vulnerable
SpeculationIndirectBranch: conditional enabled
Cpus_allowed: ffffffff,ffffffff,ffffffff,ffffffff
Cpus_allowed_list: 0-127
Mems_allowed: 00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000001
Mems_allowed_list: 0
voluntary_ctxt_switches: 42
nonvoluntary_ctxt_switches: 0
root@wangyanlong-virtual-machine:/home/wangyanlong/test#
有时候,当我们统计出来wall time比较大的时候,就说这个任务消耗的时间多,这样的说服力是比较弱的。这个时候我们就需要获取线程实际消耗的时间结合调度次数,来进行分析。
(1)如果real time和wall time都比较大,那么说明就是任务执行实际消耗的时间长,需要对任务本身的逻辑进行优化。
(2)如果real time比较小,wall time比较大,那么可能有两种情况
①在任务执行期间发生了调度,这个时候就需要通过绑核或者提高线程的优先级等方式来保证在任务执行期间不会发生调度。
②任务中存在阻塞的操作,等待一个条件满足,比如等待一个IO条件,等待一个mutex等,要结合代码进一步分析。
相关文章:
自动驾驶性能分析时,非常有用的两个信息
自动驾驶的关键路径如下,传感器的数据发送给感知模块;感知模块根据传感器数据来确定车辆所处的环境,比如前方有没有障碍物,是不是和车道线保持着适当的距离等;感知处理之后的数据传递给规控模块,规控根据车…...
数据结构 - 并查集
文章目录 一、并查集原理二、并查集实现三、并查集的应用 一、并查集原理 在一些应用问题中,需要将n个不同的元素划分成一些不相交的集合。开始时,每个元素自成一个单元素集合,然后按一定的规律将归于同一组元素的集合合并。在此过程中要反复…...
canvas基础+应用+实例
文章目录 Canvas基础知识要点一、基本概念二、常用参数三、实例四、场景应用说明完结 Canvas基础知识要点 一、基本概念 Canvas是HTML5中的一个标签,用于在网页上通过JavaScript绘制图形、动画等。它提供了一个空白的、基于像素的绘图区域,就像一块画布…...
Linux命令 用户操作简介
目录 1. 添加新的用户账号 2. 删除用户账号 3. 修改用户账号 4. 用户口令的管理 示例汇总 添加新用户 删除用户 修改用户信息 更改用户口令 在 Linux 系统中,用户管理是一项重要的任务,包括添加新用户、删除用户、修改用户信息以及管理用户口令…...
大语言模型的Scaling Law【Power Low】
NLP-大语言模型学习系列目录 一、注意力机制基础——RNN,Seq2Seq等基础知识 二、注意力机制【Self-Attention,自注意力模型】 三、Transformer图文详解【Attention is all you need】 四、大语言模型的Scaling Law【Power Low】 文章目录 NLP-大语言模型学习系列目录一、什么是…...
windows环境下,使用docker搭建redis集群
参考: https://blog.csdn.net/weixin_46594796/article/details/137864842 https://www.cnblogs.com/niceyoo/p/14118146.html 史上最详细Docker搭建Redis Cluster集群环境 值得收藏 每步都有图,不用担心学不会-腾讯云开发者社区-腾讯云 一、基础环境描述 宿主机:192.168…...
Python(pandas库3)
函数 随机抽样 语法: n:要抽取的行数 frac:抽取的比例,比如 frac0.5,代表抽取总体数据的50% axis:示在哪个方向上抽取数据(axis1 表示列/axis0 表示行) 案例: 输出结果都为随机抽取。 空…...
WPF+MVVM案例实战(十)- 水波纹按钮实现与控件封装
文章目录 1、运行效果1、封装用户控件1、创建文件2、依赖属性实现2、使用封装的按钮控件1.主界面引用2.按钮属性设置3 总结1、运行效果 1、封装用户控件 1、创建文件 打开 Wpf_Examples 项目,在 UserControlLib 用户控件库中创建按钮文件 WaterRipplesButton.xaml ,修改 Us…...
数据结构————map,set详解
今天带来map和set的详解,保证大家分清楚 一,概念 map和set是一种专门用来搜索的容器或数据结构 map能存储两个数据类型,我们称之为<key-value>模型 set只能存储一个数据类型,我们称之为纯<key>模型 它们的效率都非…...
fdisk - Linux下的磁盘分区利器
文章目录 前言一、安装和启动二、基本命令2.1 查看分区表2.2 删除分区2.3 创建新分区2.4 更改分区类型2.5 其他指令 三、注意事项四、其他相关工具 前言 在Linux系统中,磁盘管理是维护系统性能和数据安全的重要环节。fdisk 是一个强大的命令行工具,专门…...
or-tools优化库记录
介绍 Or-tools是谷歌人工智能系列的运筹优化包,是一个用于优化的开源软件套件,针对性地解决车辆路线问题、流程优化、整数和线性规划以及约束规划等问题。 官网地使用说明比我详细,我就不多逼逼了 使用说明网址: https://develo…...
M1 Pro MacBook Pro 上的奇遇:Rust 构建失败,SIGKILL 惊魂记
你是否也曾在 M1 Pro MacBook Pro 上遇到过离奇的编译问题?这次我遇到的奇葩问题绝对值得一聊——一个仅在苹果M1 Pro上的神秘构建失败。其他设备都安然无恙,唯独它!折腾了一番,终于让我揭开了这“阴谋”的真相。 问题描述 在运…...
重构商业生态:DApp创新玩法与盈利模式的深度剖析
随着区块链技术的发展,DApp(去中心化应用)正在从实验走向成熟。DApp以去中心化、透明性和不可篡改性为基础,结合智能合约,逐步改变传统商业运作模式,创造新的市场生态。本文将从DApp的独特优势、创新玩法和…...
2024首届亚洲国际电影节圆满落下帷幕
10月26日下午,2024首届亚洲国际电影节颁奖典礼在中国•澳门隆重举行。在这座充满时尚感的“东亚文化之都”,一座座金鹮奖杯,汇聚起全球电影艺术的荣耀之光,见证着无数电影梦想的傲然绽放。明星云集欢聚一堂,同庆澳门回…...
【Mybatis】动态SQL+配置文件+数据库连接池+企业规范(10)
本系列共涉及4个框架:Sping,SpringBoot,Spring MVC,Mybatis。 博客涉及框架的重要知识点,根据序号学习即可。 目录 本系列共涉及4个框架:Sping,SpringBoot,Spring MVC,Mybatis。 博客涉及框架的重要知识点,根据序号学习即可。 …...
layui扩展组件之----右键菜单
源码:rightmenu.js layui.define([element], function (exports) {let element layui.element;const $ layui.jquery;let MOD_NAME rightmenu;let RIGHTMENUMOD function () {this.v 1.0.0;this.author raowenjing;};String.prototype.format function () {…...
ue5实现数字滚动增长
方法1 https://www.bilibili.com/video/BV1h14y197D1/?spm_id_from333.999.0.0 b站教程 重写loop节点 方法二 写在eventtick里...
Flink(一)
目录 架构处理有界与无界数据部署应用到任意地方运行任意规模应用利用内存性能 流应用流处理应用的基本组件流状态时间 应用场景事件驱动应用事件驱动应用的优势Flink如何支持事件驱动应用? 典型的事件驱动示例 数据分析应用流式分析应用的优势?Flink 如…...
kaggle 数据集下载
文章目录 kaggle 数据集下载(1) 数据集下载(2) 手机号验证 kaggle 数据集下载 这两天想学习 kaggle 赛事 把深度学习相关的内容自己给过一遍,快忘得差不多了,惭愧。 参考了好多帖子,使用命令行…...
Linux shell编程学习笔记87:blkid命令——获取块设备信息
0 引言 在进行系统安全检测时,我们需要收集块设备的信息,这些可以通过blkid命令来获取。 1 blkid命令的安装 blkid命令是基于libblkid库的命令行工具,可以在大多数Linux发行版中使用。 如果你的Linux系统中没有安装blkid命令,…...
FRP内网穿透实战:从零配置到远程访问
1. 为什么需要内网穿透? 想象一下这个场景:你在家里搭建了一个NAS私有云,存了几百部高清电影;或者你在办公室电脑上跑了个数据库服务,出差时想随时查看数据。这时候你会发现——这些服务都在内网环境里,离…...
零代码基础也能用:万物识别-中文-通用领域镜像一键部署教程
零代码基础也能用:万物识别-中文-通用领域镜像一键部署教程 1. 开箱即用的图片识别神器 想象一下这样的场景:你刚拍了一张照片,还没来得及细看,AI就已经告诉你画面里有什么——这不是科幻电影,而是"万物识别-中…...
别再只会发文本了!SpringBoot整合钉钉机器人,这5种高级消息模板让你的通知更专业
SpringBoot与钉钉机器人:五种高级消息模板实战指南 如果你还在用单调的文本消息推送系统通知,那么你的团队协作工具可能只发挥了50%的潜力。钉钉机器人提供的富文本消息类型,能够将枯燥的系统通知转化为直观、交互式的信息卡片,显…...
终极指南:如何用Hammer.js为AR应用打造自然手势交互体验
终极指南:如何用Hammer.js为AR应用打造自然手势交互体验 【免费下载链接】hammer.js A javascript library for multi-touch gestures :// You can touch this 项目地址: https://gitcode.com/gh_mirrors/ha/hammer.js Hammer.js是一个强大的JavaScript库&am…...
SOONet实战教程:结合Whisper提取音频文本,构建音视频联合语义定位Pipeline
SOONet实战教程:结合Whisper提取音频文本,构建音视频联合语义定位Pipeline 1. 项目概述 今天给大家介绍一个特别实用的技术方案:如何用SOONet视频时序定位系统,结合Whisper语音识别,构建一个完整的音视频语义定位pip…...
vue3-count-to避坑指南:数字增长动画的7个常见问题与解决方案
Vue3-Count-To深度避坑实战:数字动画7大疑难解析 数字动态增长效果在数据可视化、金融仪表盘和运营数据展示中扮演着关键角色。vue3-count-to作为Vue3生态中专精于此的轻量级库,虽然API简洁,但在真实业务场景中往往会遇到各种边界情况。本文将…...
velocity-subtemplate-variable-fix
为什么你的 Velocity 子模板变量总是失效?一行代码解决了阅读前提:你正在用 Velocity 做模板引擎开发,主模板能正常渲染,但子模板里一用变量就报空指针或者路径找不到。先说我的血泪史 昨晚被一个问题折磨了两个小时: …...
避免踩坑:Unity中Resources.LoadAll的正确使用姿势(含multiple模式Sprite处理)
Unity资源加载进阶:Resources.LoadAll与Sprite图集高效处理指南 在Unity开发中,资源加载是每个项目都无法绕开的核心环节。特别是当处理包含多张小图的Sprite图集时,很多开发者会陷入性能陷阱和功能误区。本文将深入剖析Resources.LoadAll的正…...
2分钟搞定:Windows包管理器Winget一键安装全攻略
2分钟搞定:Windows包管理器Winget一键安装全攻略 【免费下载链接】winget-install Install winget tool using PowerShell! Prerequisites automatically installed. Works on Windows 10/11 and Server 2022. 项目地址: https://gitcode.com/gh_mirrors/wi/winge…...
云原生实战:如何用GROUP模型提升容器工作负载预测准确率(附避坑指南)
云原生实战:如何用GROUP模型提升容器工作负载预测准确率(附避坑指南) 在云原生架构中,容器资源管理一直是DevOps团队面临的重大挑战。传统单容器预测方法往往忽视了微服务间复杂的协同关系,导致预测误差居高不下。本文…...
