Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #include "FWCore/Services/src/CPU.h"
00013 #include "FWCore/MessageLogger/interface/JobReport.h"
00014 #include "FWCore/ServiceRegistry/interface/ActivityRegistry.h"
00015 #include "FWCore/ServiceRegistry/interface/Service.h"
00016 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00017 #include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
00018 #include "FWCore/ParameterSet/interface/ParameterSetDescription.h"
00019
00020 #include <iostream>
00021 #include <sys/time.h>
00022 #include <sys/resource.h>
00023 #include <stdio.h>
00024 #include <string>
00025 #include <fstream>
00026 #include <sstream>
00027 #include <set>
00028
00029 namespace edm {
00030 namespace service {
00031 namespace {
00032
00033 std::string i2str(int i){
00034 std::ostringstream t;
00035 t << i;
00036 return t.str();
00037 }
00038
00039 std::string d2str(double d){
00040 std::ostringstream t;
00041 t << d;
00042 return t.str();
00043 }
00044
00045 double str2d(std::string s){
00046 return atof(s.c_str());
00047 }
00048
00049 int str2i(std::string s){
00050 return atoi(s.c_str());
00051 }
00052
00053 void trim(std::string& s, const std::string& drop = " \t") {
00054 std::string::size_type p = s.find_last_not_of(drop);
00055 if(p != std::string::npos) {
00056 s = s.erase(p+1);
00057 }
00058 s = s.erase(0, s.find_first_not_of(drop));
00059 }
00060
00061 std::string eraseExtraSpaces(std::string s) {
00062 bool founded = false;
00063 std::string aux;
00064 for(std::string::const_iterator iter = s.begin(); iter != s.end(); iter++){
00065 if(founded){
00066 if(*iter == ' ') founded = true;
00067 else{
00068 aux += " "; aux += *iter;
00069 founded = false;
00070 }
00071 }
00072 else{
00073 if(*iter == ' ') founded = true;
00074 else aux += *iter;
00075 }
00076 }
00077 return aux;
00078 }
00079 }
00080
00081
00082 CPU::CPU(const ParameterSet& iPS, ActivityRegistry&iRegistry):
00083 totalNumberCPUs_(0),
00084 averageCoreSpeed_(0.0),
00085 reportCPUProperties_(iPS.getUntrackedParameter<bool>("reportCPUProperties"))
00086 {
00087 iRegistry.watchPostEndJob(this,&CPU::postEndJob);
00088 }
00089
00090
00091 CPU::~CPU()
00092 {
00093 }
00094
00095 void CPU::fillDescriptions(edm::ConfigurationDescriptions & descriptions) {
00096 edm::ParameterSetDescription desc;
00097 desc.addUntracked<bool>("reportCPUProperties", false);
00098 descriptions.add("CPU", desc);
00099 }
00100
00101
00102 void CPU::postEndJob()
00103 {
00104 Service<JobReport> reportSvc;
00105
00106 std::map<std::string, std::string> reportCPUProperties;
00107 std::map<std::string, std::string> currentCoreProperties;
00108
00109 std::ifstream fcpuinfo ("/proc/cpuinfo");
00110
00111 if(fcpuinfo.is_open()){
00112
00113 std::string buf;
00114 std::string currentCore;
00115 std::string CPUModels;
00116
00117 std::set<std::string> models;
00118
00119 while(!fcpuinfo.eof()){
00120
00121 std::getline(fcpuinfo, buf);
00122
00123 std::istringstream iss(buf);
00124 std::string token;
00125 std::string property;
00126 std::string value;
00127
00128 int time = 1;
00129
00130 while(std::getline(iss, token, ':')) {
00131 switch(time){
00132 case 1:
00133 property = token;
00134 break;
00135 case 2:
00136 value = token;
00137 break;
00138 default:
00139 value += token;
00140 break;
00141 }
00142 time++;
00143 }
00144 trim(property);
00145 trim(value);
00146
00147 if(!property.empty()){
00148 if(property == "processor") {
00149 if(reportCPUProperties_){
00150 if(currentCore.empty()) {
00151 currentCore = value;
00152 }
00153 else{
00154 reportSvc->reportPerformanceForModule("SystemCPU", "CPU-"+currentCore, currentCoreProperties);
00155 currentCoreProperties.clear();
00156 currentCore = value;
00157 }
00158 }
00159 totalNumberCPUs_++;
00160 }
00161 else {
00162 if(reportCPUProperties_){
00163 currentCoreProperties.insert(std::make_pair(property, value));
00164 }
00165 if(property == "cpu MHz"){
00166 averageCoreSpeed_ += str2d(value);
00167 }
00168 if(property == "model name"){
00169 models.insert(eraseExtraSpaces(value));
00170 }
00171 }
00172 }
00173 }
00174
00175 fcpuinfo.close();
00176
00177 if(!currentCore.empty() && reportCPUProperties_) {
00178 reportSvc->reportPerformanceForModule("SystemCPU", "CPU-"+currentCore, currentCoreProperties);
00179 }
00180
00181 reportCPUProperties.insert(std::make_pair("totalCPUs", i2str(totalNumberCPUs_)));
00182
00183 if(totalNumberCPUs_ == 0){
00184 averageCoreSpeed_ = 0.0;
00185 }
00186 else{
00187 averageCoreSpeed_ = averageCoreSpeed_/totalNumberCPUs_;
00188 }
00189
00190 reportCPUProperties.insert(std::make_pair("averageCoreSpeed", d2str(averageCoreSpeed_)));
00191
00192 int model = 0;
00193 for(std::set<std::string>::const_iterator iter = models.begin(); iter != models.end(); iter++){
00194 if(model == 0)
00195 CPUModels += *iter;
00196 else
00197 CPUModels += ", " + *iter;
00198 model++;
00199 }
00200 reportCPUProperties.insert(std::make_pair("CPUModels", CPUModels));
00201
00202
00203 reportSvc->reportPerformanceSummary("SystemCPU", reportCPUProperties);
00204
00205 }
00206 }
00207 }
00208 }
00209
00210