在OR项目中使用火焰图

火焰图介绍

看到openresty里用火焰图觉得挺有意思的,又装逼又有用。它可以快速的定位到程序性能的瓶颈,生成程序的调用栈并且计算调用栈中每部分的 CPU 消耗,能够比较容易的找到CPU占用高、内存泄漏等问题。今天在自己以前的项目中测试了下,下面贴个图留个纪念。
![图片描述

这里面不要看颜色,因为颜色是随机搞来的,没有任何意义。要看火焰山上纵向的高度和每个对应的长度。纵向的高度代表函数调用栈的深度,横向长度代表此函数执行占用CPU的比例。

下面来了解下火焰图工具如何安装。

火焰图安装

参考 http://kernelmaker.github.io/...

安装systemtap

其实主要就是安装内核探测工具 systemtap。(SystemTap 通过将脚本语句翻译成C语句,编译成内核模块。模块加载之后,依据时间处理机制来收集有关正在运行的Linux系统的信息)

    1. yum install yum-utils
    2. yum install kernel-devel
    3. debuginfo-install kernel
    4. yum install systemtap

第三步安装失败的话,使用内核版本号找到对应的包进行安装就好了。
完成后输入以下命令进行测试

    stap -ve 'probe begin { log("hello world") exit() }'

如果安装成功则是这样
clipboard.png

下载 openresty-systemtap-toolkit

要知道systemtap只是个内核探测工具,不只是可以用在openresty中的,你得自己写好脚本来进行埋点等工作。但是春哥已经在 openresty-systemtap-toolkit 中提供了许多可以直接使用的脚本,我们直接拿过来用就好了,毕竟我自己是不会写的。

下载 FlameGraph

使用上面openresty-systemtap-toolkit这些脚本后,我们其实已经可以拿到我们所需要的信息了,只是还是不够直观,所以我们得用FlameGraph火焰图生成工具来生成直观的图片。

使用示例

1.找到我们要监控的nginx的某个进程
ps -ef | grep nginx

clipboard.png

2.ngx-sample-lua-bt 抓取栈信息(这个工具可以看到在某个文件对应行函数的情况)
此处我是把上面下载的openresty-systemtap-toolkitFlameGraph加到环境变量里面去了。所以直接输入命令就行了

ngx-sample-lua-bt -p 19075 --luajit20 -t 5 > temp.bt

3.使用fix-lua-bt把上面得到的文件转化更友好点(直接看到对应的lua函数)

fix-lua-bt temp.bt > a.bt 

4.使用下面两个FlameGraph中的命令将文件转化为svg图片

stackcollapse-stap.pl a.bt > a.cbt
flamegraph.pl a.cbt > a.svg

然后打开a.svg就可以看到火焰图了

### STM32实现火焰像分割的方法与代码 #### 方法概述 基于STM32的火焰像分割通常涉及硬件和软件两部分的设计。硬件方面主要依赖于摄像头采集像并传输至STM32微控制器;而软件则负责对像进行预处理、特征提取以及最终的分割操作。一种常见的方法是利用颜色空间转换(如RGB到HSV)、阈值化处理以及形态学运算完成火焰区域的检测[^1]。 以下是具体的技术细节: - **颜色空间转换**:由于火焰的颜色特性在HSV色彩模型下更容易区分,因此可以先将原始RGB像转化为HSV格式。 - **阈值设定**:针对Hue(色调)、Saturation(饱和度)和Value(亮度),分别设置合理的范围以筛选出可能属于火焰的部分。 - **形态学滤波**:为了去除噪声干扰,可采用腐蚀膨胀等形态学手段平滑边界并填充孔洞。 #### 示例代码 下面是一个简单的C语言伪代码片段用于演示上述过程的核心逻辑,在实际应用中需结合具体的库函数调整参数适配目标平台: ```c #include "stm32f4xx_hal.h" // 假设已初始化好相机驱动及相关变量定义... void flame_segmentation(uint8_t *image_data, int width, int height){ uint8_t hsv_image[width*height*3]; // 存储转换后的hsv数据 rgb_to_hsv(image_data, hsv_image, width*height); for(int i=0;i<width*height;i++){ if((hsv_image[i*3]>=FLAME_H_MIN && hsv_image[i*3]<=FLAME_H_MAX)&& (hsv_image[i*3+1]>=FLAME_S_MIN && hsv_image[i*3+1]<=FLAME_S_MAX)&& (hsv_image[i*3+2]>=FLAME_V_MIN && hsv_image[i*3+2]<=FLAME_V_MAX)){ image_data[i]=255; // 表示此像素被判定为火焰的一部分 }else{ image_data[i]=0; } } morphology_filter(image_data,width,height); } int main(void){ HAL_Init(); while(1){ capture_frame(camera_buffer,CAMERA_WIDTH,CAMERA_HEIGHT); flame_segmentation(camera_buffer,CAMERA_WIDTH,CAMERA_HEIGHT); send_result_to_display_or_further_processing(camera_buffer,CAMERA_WIDTH,CAMERA_HEIGHT); } } ``` 以上代码仅为示意框架,真实项目开发还需要考虑更多因素比如性能优化、实时性保障等问题[^3]。 #### 注意事项 当选用此类课题作为毕业设计时,建议充分调研现有算法优劣,并尝试改进创新点来提升成果质量[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值