Cpu_time, полученное proc_pid_rusage, не соответствует ожиданиям от чипа macOS M1

В настоящее время мне нужно рассчитать использование процессора определенным процессом на платформе macOS (целевой процесс не связан напрямую с текущим процессом). Я использую API proc_pid_rusage . Метод расчета состоит в том, чтобы вызывать его время от времени, а затем вычислять этот раздел. Разница между ri_user_time и ri_system_time времени. Чтобы рассчитать процент использования процессора.

Я использовал его в системе macOS с чипом, отличным от M1, и результаты соответствовали ожиданиям (в основном такие же, как то, что я видел на мониторе активности), но недавно я обнаружил, что значение, полученное в системе macOS с M1 фишка маленькая. Например, один из моих процессов, который потребляет более 30% ЦП (из монитора активности), составляет менее 1% .

Я предоставляю демонстрационный код, вы можете напрямую создать новый проект для запуска:

      //
//  main.cpp
//  SimpleMonitor
//
//  Created by m1 on 2021/2/23.
//
#include <stdio.h>
#include <stdlib.h>
#include <libproc.h>
#include <stdint.h>
#include <iostream>
#include <thread>         // std::this_thread::sleep_for
#include <chrono>         // std::chrono::seconds

int main(int argc, const char * argv[]) {
    // insert code here...
    std::cout << "run simple monitor!\n";
    
    // TODO: change process id:
    int64_t pid = 12483;

    struct rusage_info_v4 ru;
    struct rusage_info_v4 ru2;

    int64_t success = (int64_t)proc_pid_rusage((pid_t)pid, RUSAGE_INFO_V0, (rusage_info_t *)&ru);
    
    if (success != 0) {
        std::cout << "get cpu time fail \n";
        return 0;
    }
    
    std::cout<<"getProcessPerformance, pid=" + std::to_string(pid) + " ru.ri_user_time=" + std::to_string(ru.ri_user_time) + " ru.ri_system_time=" + std::to_string(ru.ri_system_time)<<std::endl;

    std::this_thread::sleep_for (std::chrono::seconds(10));
    
    int64_t success2 = (int64_t)proc_pid_rusage((pid_t)pid, RUSAGE_INFO_V0, (rusage_info_t *)&ru2);
    
    if (success2 != 0) {
        std::cout << "get cpu time fail \n";
        return 0;
    }

    std::cout<<"getProcessPerformance, pid=" + std::to_string(pid) + " ru2.ri_user_time=" + std::to_string(ru2.ri_user_time) + " ru2.ri_system_time=" + std::to_string(ru2.ri_system_time)<<std::endl;
    
    int64_t cpu_time = ru2.ri_user_time - ru.ri_user_time + ru2.ri_system_time - ru.ri_system_time;

    // percentage:
    double cpu_usage = (double)cpu_time / 10 / 1000000000 * 100 ;
    
    std::cout<<pid<<" cpu usage: "<<cpu_usage<<std::endl;

}

Здесь я хочу знать, есть ли проблема с моим методом расчета, если нет, как я могу обработать неточные результаты в системе MacOS с чипом M1?

1 ответ

вам нужно умножить использование процессора на некоторую константу. Вот несколько фрагментов кода из файла diff.

+#include <mach/mach_time.h>

  • mach_timebase_info_data_t sTimebase;

  • mach_timebase_info(&sTimebase);

  • timebase_to_ns = (двойной)sTimebase.numer / (двойной)sTimebase.denom;

  •           syscpu.total = task_info.ptinfo.pti_total_system* timebase_to_ns/ 1000000;
    
  •           usercpu.total = task_info.ptinfo.pti_total_user* timebase_to_ns / 1000000;
    

~

Другие вопросы по тегам