C++ CPU监控函数优化:解决rqt_plot曲线异常问题

问题描述:

在使用rqt_plot工具监控CPU信息时,发现调用clear_cpu_info_()函数后,CPU使用率曲线会出现异常波动,而非预期的持续增长。具体表现为CPU使用率突然降为0,然后又迅速升高。该问题会导致监控数据不准确,影响对系统性能的分析。

原因分析:

经过排查,发现问题出在clear_cpu_info_()函数未能在进程持续运行时累加CPU使用率信息。每次调用该函数时,CPU使用率信息会被重置,导致rqt_plot绘制的曲线出现断点和突变。

解决方案:

为了解决这个问题,需要修改clear_cpu_info_()函数,使其能够在进程运行时持续累加CPU使用率信息,并在进程结束后将CPU使用率清零。

以下是优化后的clear_cpu_info_()函数代码:cpp#include #include

void MONITOR_BASE::clear_cpu_info_(){ static bool process_exists = false; static int prev_cpu_data = 0, prev_mem_data = 0, prev_vsz_data = 0;

std::string process_name = 'auto_ad_memory_monitor';    std::string check_process_cmd = 'pidof ' + process_name;

FILE* pipe = popen(check_process_cmd.c_str(), 'r');    char buffer[128];    std::string result = '';    while (fgets(buffer, sizeof(buffer), pipe) != nullptr)    {        result += buffer;    }    pclose(pipe);

if (!result.empty())    {        // 进程存在        process_exists = true;        cpu_info_.auto_ad_memory_monitor.cpu.data = prev_cpu_data + 1;        cpu_info_.auto_ad_memory_monitor.mem.data = prev_mem_data + 1;        cpu_info_.auto_ad_memory_monitor.vsz.data = prev_vsz_data + 1;    }    else    {        // 进程不存在        if (process_exists)        {            // 进程刚刚结束,重置CPU使用率            cpu_info_.auto_ad_memory_monitor.cpu.data = 0;            cpu_info_.auto_ad_memory_monitor.mem.data = 0;            cpu_info_.auto_ad_memory_monitor.vsz.data = 0;        }        else        {            // 进程一直不存在,继续累加CPU使用率            cpu_info_.auto_ad_memory_monitor.cpu.data = prev_cpu_data + 1;            cpu_info_.auto_ad_memory_monitor.mem.data = prev_mem_data + 1;            cpu_info_.auto_ad_memory_monitor.vsz.data = prev_vsz_data + 1;        }        process_exists = false;    }

// 保存当前的 cpu_info_ 值    prev_cpu_data = cpu_info_.auto_ad_memory_monitor.cpu.data;    prev_mem_data = cpu_info_.auto_ad_memory_monitor.mem.data;    prev_vsz_data = cpu_info_.auto_ad_memory_monitor.vsz.data;}

代码解释:

  1. 使用静态变量: 函数内部使用静态变量process_exists记录进程是否存在,使用prev_cpu_dataprev_mem_dataprev_vsz_data记录上一次的CPU、内存和虚拟内存信息。2. 判断进程状态: 通过pidof命令判断目标进程auto_ad_memory_monitor是否存在。3. 累加CPU使用率: 如果进程存在,则将CPU使用率累加到cpu_info_结构体中。4. 重置CPU使用率: 如果进程不存在且上一次状态为存在,说明进程刚刚结束,需要将CPU使用率清零。5. 保存当前信息: 每次调用结束后,将当前的CPU、内存和虚拟内存信息保存到静态变量中,用于下次累加。

优化效果:

经过修改后,clear_cpu_info_()函数能够正确地累加CPU使用率信息,rqt_plot绘制的曲线也能够正常显示CPU使用率的变化趋势,解决了曲线异常波动的问题。

希望以上解决方案能够帮助您解决CPU监控函数的问题,提高系统性能分析的准确性。

C++ CPU监控函数优化:解决rqt_plot曲线异常问题

原文地址: https://www.cveoy.top/t/topic/kvd 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录