|
9 | 9 | #include <math.h> |
10 | 10 | #include <Common/Timer.h> |
11 | 11 |
|
| 12 | +#include <sys/time.h> |
| 13 | +#include <sys/resource.h> |
| 14 | + |
12 | 15 |
|
13 | 16 |
|
14 | 17 | #include <Monitoring/MonitoringFactory.h> |
@@ -56,7 +59,31 @@ class ConsumerStats: public Consumer { |
56 | 59 | int monitoringUpdatePeriod; |
57 | 60 | std::unique_ptr<Collector> monitoringCollector; |
58 | 61 |
|
| 62 | + struct rusage previousUsage; // variable to keep track of last getrusage() result |
| 63 | + struct rusage currentUsage; // variable to keep track of last getrusage() result |
| 64 | + double timePreviousGetrusage=0; // variable storing 'runningTime' value when getrusage was previously called (0 if not called yet) |
| 65 | + double cpuUsedOverLastInterval=0; // average CPU usage over latest measurement interval |
| 66 | + |
59 | 67 | void publishStats() { |
| 68 | + |
| 69 | + double now=runningTime.getTime(); |
| 70 | + getrusage(RUSAGE_SELF,¤tUsage); |
| 71 | + if (timePreviousGetrusage!=0) { |
| 72 | + double tDiff=(now-timePreviousGetrusage)*1000000.0; // delta time in microseconds |
| 73 | + double fractionCpuUsed= |
| 74 | + ( |
| 75 | + currentUsage.ru_utime.tv_sec*1000000.0+currentUsage.ru_utime.tv_usec-(previousUsage.ru_utime.tv_sec*1000000.0+previousUsage.ru_utime.tv_usec) |
| 76 | + + currentUsage.ru_stime.tv_sec*1000000.0+currentUsage.ru_stime.tv_usec-(previousUsage.ru_stime.tv_sec*1000000.0+previousUsage.ru_stime.tv_usec) |
| 77 | + ) / tDiff; |
| 78 | + if (monitoringEnabled) { |
| 79 | + monitoringCollector->send(fractionCpuUsed*100, "readout.percentCpuUsed"); |
| 80 | + //theLog.log("CPU used = %.2f %%",100*fractionCpuUsed); |
| 81 | + } |
| 82 | + } |
| 83 | + timePreviousGetrusage=now; |
| 84 | + previousUsage=currentUsage; |
| 85 | + // todo: per thread? -> add feature in Thread class |
| 86 | + |
60 | 87 | if (monitoringEnabled) { |
61 | 88 | // todo: support for long long types |
62 | 89 | // https://alice.its.cern.ch/jira/browse/FLPPROT-69 |
|
0 commit comments