C++ CPU监控函数优化:解决rqt_plot曲线异常问题
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
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;}
代码解释:
- 使用静态变量: 函数内部使用静态变量
process_exists记录进程是否存在,使用prev_cpu_data、prev_mem_data和prev_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监控函数的问题,提高系统性能分析的准确性。
原文地址: https://www.cveoy.top/t/topic/kvd 著作权归作者所有。请勿转载和采集!