From d1c0d22ed6b7d01877fc06989cd9ce17d9a50ca2 Mon Sep 17 00:00:00 2001 From: Ben Date: Sat, 8 Dec 2018 17:01:28 +0000 Subject: [PATCH] Multithreaded CPU stat --- bin/resource-monitor | Bin 40328 -> 67872 bytes include/cpu.h | 7 +++- platform/linux/monitoring/cpu.cpp | 59 ++++++++++++++++++++++++++---- src/main.cpp | 7 +++- 4 files changed, 63 insertions(+), 10 deletions(-) diff --git a/bin/resource-monitor b/bin/resource-monitor index 4813aaabd15f9e1957e8fb869b3ad7bbf91f1c05..24d21884a76cd51e94732b7620e3349976ce5ec3 100755 GIT binary patch literal 67872 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 f9ZyN2D;obBa%w%B literal 40328 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 E502LrkpKVy diff --git a/include/cpu.h b/include/cpu.h index 13bdabc..d78d858 100644 --- a/include/cpu.h +++ b/include/cpu.h @@ -16,17 +16,20 @@ public: int UPDATE_INTERVAL; // s + std::vector> CPU_PREVIOUS_CORES_WORK_AND_TOTAL; std::vector> CPU_CORES_WORK_AND_TOTAL; void START_CPU_POLLING(); static void CPU_POLL(CPU* cpu); void END_CPU_POLLING(); - double CPU_PERCENT(); + double CPU_PERCENT(int core); std::vector CPU_CORE_PERCENT(); + unsigned int CPU_HARDWARE_THREADS = std::thread::hardware_concurrency(); + virtual ~CPU(); -private: +private: std::thread* m_pollThread; bool m_isPolling; }; diff --git a/platform/linux/monitoring/cpu.cpp b/platform/linux/monitoring/cpu.cpp index 29675ff..8d62d0a 100644 --- a/platform/linux/monitoring/cpu.cpp +++ b/platform/linux/monitoring/cpu.cpp @@ -1,13 +1,26 @@ #include +#include +#include #include #include -#include #include CPU::CPU() { this->UPDATE_INTERVAL = 1000; this->m_isPolling = false; + std::cout << "Number of hardware threads supported: " << CPU_HARDWARE_THREADS << std::endl; + for (unsigned int thread; thread < CPU_HARDWARE_THREADS; thread++) { + std::vector temp1, temp2; + + for (int i = 0; i <= 2; i++) { + temp1.push_back(0); + temp2.push_back(0); + } + + CPU_PREVIOUS_CORES_WORK_AND_TOTAL.push_back(temp1); + CPU_CORES_WORK_AND_TOTAL.push_back(temp2); + } } void CPU::START_CPU_POLLING() { @@ -34,10 +47,9 @@ void CPU::CPU_POLL(CPU* cpu) { // READ TOTAL CPU unsigned long long luser, nice, system, idle, iowait, irq, softirq; - FILE* file = fopen("/proc/stat", "r"); - fscanf(file, "cpu %llu %llu %llu %llu %llu %llu %llu", &luser, + FILE* ProcStat = fopen("/proc/stat", "r"); + fscanf(ProcStat, "cpu %llu %llu %llu %llu %llu %llu %llu", &luser, &nice, &system, &idle, &iowait, &irq, &softirq); - fclose(file); cpu->CPU_Mutex.lock(); @@ -48,6 +60,28 @@ void CPU::CPU_POLL(CPU* cpu) { cpu->CPU_WORK = luser + nice + system; cpu->CPU_Mutex.unlock(); + + for (unsigned int thread = 0; thread < cpu->CPU_HARDWARE_THREADS; thread++) { + unsigned long long tluser, tnice, tsystem, tidle, tiowait, + tirq, tsoftirq; + + std::stringstream pattern; + pattern << "cpu" << thread << " %llu %llu %llu %llu %llu %llu %llu"; + + fscanf(ProcStat, pattern.str().c_str(), &tluser, &tnice, &tsystem, + &tidle, &tiowait, &tirq, &tsoftirq); + + cpu->CPU_Mutex.lock(); + + cpu->CPU_PREVIOUS_CORES_WORK_AND_TOTAL[thread][0] = cpu->CPU_CORES_WORK_AND_TOTAL[thread][0]; + cpu->CPU_PREVIOUS_CORES_WORK_AND_TOTAL[thread][1] = cpu->CPU_CORES_WORK_AND_TOTAL[thread][1]; + cpu->CPU_CORES_WORK_AND_TOTAL[thread][0] = tluser + tnice + tsystem + tidle + tiowait + tirq + tsoftirq; + cpu->CPU_CORES_WORK_AND_TOTAL[thread][1] = tluser + tnice + tsystem; + + cpu->CPU_Mutex.unlock(); + } + + fclose(ProcStat); sleep(1); } } @@ -61,10 +95,21 @@ void CPU::END_CPU_POLLING() { delete m_pollThread; } -double CPU::CPU_PERCENT() { +double CPU::CPU_PERCENT(int core) { + core--; + this->CPU_Mutex.lock(); - long double workOverTime = this->CPU_PREVIOUS_WORK - this->CPU_WORK; - long double totalOverTime = this->CPU_PREVIOUS_TOTAL - this->CPU_TOTAL; + + long double totalOverTime = 0.0; + long double workOverTime = 0.0; + if (core == -1) { + totalOverTime = this->CPU_PREVIOUS_TOTAL - this->CPU_TOTAL; + workOverTime = this->CPU_PREVIOUS_WORK - this->CPU_WORK; + } else { + totalOverTime = this->CPU_PREVIOUS_CORES_WORK_AND_TOTAL[core][0] - this->CPU_CORES_WORK_AND_TOTAL[core][0]; + workOverTime = this->CPU_PREVIOUS_CORES_WORK_AND_TOTAL[core][1] - this->CPU_CORES_WORK_AND_TOTAL[core][1]; + } + this->CPU_Mutex.unlock(); double percent = (workOverTime / totalOverTime) * 100; diff --git a/src/main.cpp b/src/main.cpp index b4c6799..a5a5733 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -9,7 +9,12 @@ int main(int argc, char** argv) { cpu->START_CPU_POLLING(); while(1) { - std::cout << "TOTAL CPU USAGE: " << cpu->CPU_PERCENT() << std::endl; + std::cout << "TOTAL CPU USAGE: " << cpu->CPU_PERCENT(0) << std::endl; + // std::cout << "CORE 1 USAGE: " << cpu->CPU_PERCENT(1) << std::endl; + // std::cout << "CORE 2 USAGE: " << cpu->CPU_PERCENT(2) << std::endl; + // std::cout << "CORE 3 USAGE: " << cpu->CPU_PERCENT(3) << std::endl; + // std::cout << "CORE 4 USAGE: " << cpu->CPU_PERCENT(4) << std::endl; + std::cout << std::endl; sleep(1); } }