找到 CPU 个快速进程的用法

Find CPU usage of a fast process

我正在寻找一种方法来衡量 CPU 在 1 秒内完成的进程的使用情况。

既然这么快,top 就不公平了。据我了解,top 拍摄快照,因此该过程可以在更新之间完成。

该程序是用 C++ 编写的,我 运行 在 Linux 上。如果有一些简单的代码,我可以将其复制并粘贴到我的程序中,在 main() 的末尾打印出 CPU 用法,那就行得通了。或者,如果有一些分析工具,我也可以使用它。

编辑 - 看来大家对我想要的东西有些误解。

不是寻找持续时间。我知道持续时间。大约1秒。 我想知道的是 CPU 用法。如果是 100%,则表示我的 CPU 是 运行 整整 1 秒。

如果是 50%,则表示 CPU 有 50% 的时间处于空闲状态。有可能它正在等待另外 50% 的 IO。

如果我的程序 运行 很长一段时间,top 很好,因为它显示了这样的东西

%Cpu(s): 0.6 us, 0.3 sy, 0.0 ni, 99.1 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st

这表示我的 cpu 有 0.6% 的时间在用户 space 中,有 0.3% 的时间在内核 space 中,99.1% 的时间只是空闲。

但是 - 正如我之前所说,top 不适用于快速进程。那我该怎么办呢?

谢谢

试试这个:

#include <unistd.h>

#include <fstream>
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

#include <boost/lexical_cast.hpp>
#include <boost/regex.hpp>
#include <boost/date_time.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>


//This function reads /proc/stat and returns the idle value for each cpu in a vector
std::vector<long long> get_idle() {

    //Virtual file, created by the Linux kernel on demand
    std::ifstream in( "/proc/stat" );

    std::vector<long long> result;

    //This might broke if there are not 8 columns in /proc/stat
    boost::regex reg("cpu(\d+) (\d+) (\d+) (\d+) (\d+) (\d+) (\d+) (\d+) (\d+)");

    std::string line;
    while ( std::getline(in, line) ) {

        boost::smatch match;
        if ( boost::regex_match( line, match, reg ) ) {

            long long idle_time = boost::lexical_cast<long long>(match[5]);

            result.push_back( idle_time );
        }


    }
    return result;
}

//This function returns the avarege load in the next interval_seconds for each cpu in a vector
//get_load() halts this thread for interval_seconds
std::vector<float> get_load(unsigned interval_seconds) {

    boost::posix_time::ptime current_time_1 = boost::date_time::microsec_clock<boost::posix_time::ptime>::universal_time();
    std::vector<long long> idle_time_1 = get_idle();

    sleep(interval_seconds);

    boost::posix_time::ptime current_time_2 = boost::date_time::microsec_clock<boost::posix_time::ptime>::universal_time();
    std::vector<long long> idle_time_2 = get_idle();

    //We have to measure the time, beacuse sleep is not accurate
    const float total_seconds_elpased = float((current_time_2 - current_time_1).total_milliseconds()) / 1000.f;

    std::vector<float> cpu_loads;

    for ( unsigned i = 0; i < idle_time_1.size(); ++i ) {

        //This might get slightly negative, because our time measurment is not accurate
        const float load = 1.f - float(idle_time_2[i] - idle_time_1[i])/(100.f * total_seconds_elpased);
        cpu_loads.push_back( load );

    }
    return cpu_loads;
}

int main() {

    const unsigned measurement_count = 5;
    const unsigned interval_seconds = 5;

    for ( unsigned i = 0; i < measurement_count; ++i ) {

        std::vector<float> cpu_loads = get_load(interval_seconds);
        for ( unsigned i = 0; i < cpu_loads.size(); ++i ) {
            std::cout << "cpu " << i << " : " << cpu_loads[i] * 100.f << "%" << std::endl;
        }
    }


    return 0;
}