CMS 3D CMS Logo

ThroughputService.cc
Go to the documentation of this file.
1 // C++ headers
2 #include <algorithm>
3 #include <chrono>
4 #include <ctime>
5 
6 // boost headers
7 #include <boost/format.hpp>
8 
9 // CMSSW headers
14 #include "ThroughputService.h"
15 
16 // describe the module's configuration
19  desc.addUntracked<uint32_t>("eventRange", 10000)->setComment("Preallocate a buffer for N events");
20  desc.addUntracked<uint32_t>("eventResolution", 1)->setComment("Sample the processing time every N events");
21  desc.addUntracked<bool>("printEventSummary", false);
22  desc.ifValue(edm::ParameterDescription<bool>("enableDQM", true, false), // "false" means untracked
23  // parameters if "enableDQM" is "true"
24  true >> (edm::ParameterDescription<bool>("dqmPathByProcesses", false, false) and
25  edm::ParameterDescription<std::string>("dqmPath", "HLT/Throughput", false) and
26  edm::ParameterDescription<double>("timeRange", 60000.0, false) and
27  edm::ParameterDescription<double>("timeResolution", 10.0, false)) or
28  // parameters if "enableDQM" is "false"
29  false >> edm::EmptyGroupDescription());
30  descriptions.add("ThroughputService", desc);
31 }
32 
34  : // startup time
35  m_startup(std::chrono::system_clock::now()),
36  // configuration
37  m_resolution(config.getUntrackedParameter<uint32_t>("eventResolution")),
38  m_counter(0),
39  m_events(config.getUntrackedParameter<uint32_t>("eventRange") / m_resolution), // allocate initial size
40  m_print_event_summary(config.getUntrackedParameter<bool>("printEventSummary")),
41  m_enable_dqm(config.getUntrackedParameter<bool>("enableDQM")),
42  m_dqm_bynproc(m_enable_dqm ? config.getUntrackedParameter<bool>("dqmPathByProcesses") : false),
43  m_dqm_path(m_enable_dqm ? config.getUntrackedParameter<std::string>("dqmPath") : ""),
44  m_time_range(m_enable_dqm ? config.getUntrackedParameter<double>("timeRange") : 0.),
45  m_time_resolution(m_enable_dqm ? config.getUntrackedParameter<double>("timeResolution") : 0.) {
46  m_events.clear(); // erases all elements, but does not free internal arrays
51 }
52 
54  auto concurrent_streams = bounds.maxNumberOfStreams();
55  auto concurrent_threads = bounds.maxNumberOfThreads();
56 
58  m_dqm_path += (boost::format("/Running on %s with %d streams on %d threads") % processor_model %
59  concurrent_streams % concurrent_threads)
60  .str();
61 }
62 
64  // if the DQMStore is available, book the DQM histograms
65  // check that the DQMStore service is available
66  if (m_enable_dqm and not edm::Service<dqm::legacy::DQMStore>().isAvailable()) {
67  // the DQMStore is not available, disable all DQM plots
68  m_enable_dqm = false;
69  edm::LogWarning("ThroughputService") << "The DQMStore is not avalable, the DQM plots will not be generated";
70  }
71 
72  if (m_enable_dqm) {
73  std::string y_axis_title = (boost::format("events / %g s") % m_time_resolution).str();
74  unsigned int bins = std::round(m_time_range / m_time_resolution);
75  double range = bins * m_time_resolution;
76 
77  // define a callback that can book the histograms
78  auto bookTransactionCallback = [&, this](DQMStore::IBooker& booker, DQMStore::IGetter&) {
80  m_sourced_events = booker.book1D("throughput_sourced", "Throughput (sourced events)", bins, 0., range);
81  m_sourced_events->setXTitle("time [s]");
82  m_sourced_events->setYTitle(y_axis_title);
83  m_retired_events = booker.book1D("throughput_retired", "Throughput (retired events)", bins, 0., range);
84  m_retired_events->setXTitle("time [s]");
85  m_retired_events->setYTitle(y_axis_title);
86  };
87 
88  // book MonitorElement's for this run
89  edm::Service<DQMStore>()->meBookerGetter(bookTransactionCallback);
90  } else {
91  m_sourced_events = nullptr;
92  m_retired_events = nullptr;
93  }
94 }
95 
98  auto interval = std::chrono::duration_cast<std::chrono::duration<double>>(timestamp - m_startup).count();
99  if (m_enable_dqm) {
101  }
102 }
103 
106  auto interval = std::chrono::duration_cast<std::chrono::duration<double>>(timestamp - m_startup).count();
107  if (m_enable_dqm) {
109  }
110  ++m_counter;
111  if (m_counter % m_resolution == 0) {
112  m_events.push_back(timestamp);
113  }
114 }
115 
117  if (m_counter < 2 * m_resolution) {
118  // not enough mesurements to estimate the throughput
119  edm::LogWarning("ThroughputService") << "Not enough events to measure the throughput with a resolution of "
120  << m_resolution << " events";
121  return;
122  }
123 
124  edm::LogInfo info("ThroughputService");
125 
126  if (m_print_event_summary) {
127  for (uint32_t i = 0; i < m_events.size(); ++i) {
128  info << std::setw(8) << (i + 1) * m_resolution << ", " << std::setprecision(6) << edm::TimeOfDay(m_events[i])
129  << "\n";
130  }
131  info << '\n';
132  }
133 
134  // measure the time to process each block of m_resolution events
135  uint32_t blocks = m_counter / m_resolution - 1;
136  std::vector<double> delta(blocks);
137  for (uint32_t i = 0; i < blocks; ++i) {
138  delta[i] = std::chrono::duration_cast<std::chrono::duration<double>>(m_events[i + 1] - m_events[i]).count();
139  }
140  // measure the average and standard deviation of the time to process m_resolution
141  double time_avg = TMath::Mean(delta.begin(), delta.begin() + blocks);
142  double time_dev = TMath::StdDev(delta.begin(), delta.begin() + blocks);
143  // compute the throughput and its standard deviation across the job
144  double throughput_avg = double(m_resolution) / time_avg;
145  double throughput_dev = double(m_resolution) * time_dev / time_avg / time_avg;
146 
147  info << "Average throughput: " << throughput_avg << " ± " << throughput_dev << " ev/s";
148 }
149 
150 // declare ThroughputService as a framework Service
ThroughputService::m_time_range
const double m_time_range
Definition: ThroughputService.h:63
edm::StreamID
Definition: StreamID.h:30
ThroughputService.h
FastTimerService_cff.range
range
Definition: FastTimerService_cff.py:34
electrons_cff.bool
bool
Definition: electrons_cff.py:372
mps_fire.i
i
Definition: mps_fire.py:355
funct::false
false
Definition: Factorize.h:34
edm::TimeOfDay
Definition: TimeOfDay.h:9
ThroughputService::m_sourced_events
dqm::reco::MonitorElement * m_sourced_events
Definition: ThroughputService.h:48
ThroughputService::m_resolution
const uint32_t m_resolution
Definition: ThroughputService.h:54
edm::LogInfo
Definition: MessageLogger.h:254
edm::ParameterSetDescription
Definition: ParameterSetDescription.h:52
DEFINE_FWK_SERVICE
#define DEFINE_FWK_SERVICE(type)
Definition: ServiceMaker.h:105
dqm::implementation::NavigatorBase::setCurrentFolder
virtual void setCurrentFolder(std::string const &fullpath)
Definition: DQMStore.cc:32
ThroughputService::postEvent
void postEvent(edm::StreamContext const &sc)
Definition: ThroughputService.cc:104
DQMStore.h
info
static const TGPicture * info(bool iBackgroundIsBlack)
Definition: FWCollectionSummaryWidget.cc:152
EmptyGroupDescription.h
ThroughputService::postEndJob
void postEndJob()
Definition: ThroughputService.cc:116
ThroughputService::preGlobalBeginRun
void preGlobalBeginRun(edm::GlobalContext const &gc)
Definition: ThroughputService.cc:63
ThroughputService::m_retired_events
dqm::reco::MonitorElement * m_retired_events
Definition: ThroughputService.h:49
ThroughputService::m_dqm_path
std::string m_dqm_path
Definition: ThroughputService.h:62
ThroughputService
Definition: ThroughputService.h:30
ThroughputService::preSourceEvent
void preSourceEvent(edm::StreamID sid)
Definition: ThroughputService.cc:96
Mean
Definition: SiPixelActionExecutor.h:21
ThroughputService::m_print_event_summary
bool m_print_event_summary
Definition: ThroughputService.h:57
config
Definition: config.py:1
fileCollector.now
now
Definition: fileCollector.py:207
ThroughputService::m_events
tbb::concurrent_vector< std::chrono::system_clock::time_point > m_events
Definition: ThroughputService.h:56
cond::timestamp
Definition: Time.h:19
edm::ActivityRegistry::watchPostEndJob
void watchPostEndJob(PostEndJob::slot_type const &iSlot)
Definition: ActivityRegistry.h:168
edm::ConfigurationDescriptions::add
void add(std::string const &label, ParameterSetDescription const &psetDescription)
Definition: ConfigurationDescriptions.cc:57
edm::StreamContext
Definition: StreamContext.h:31
dqm-mbProfile.format
format
Definition: dqm-mbProfile.py:16
dqm::impl::MonitorElement::Fill
void Fill(long long x)
Definition: MonitorElement.h:290
edm::ActivityRegistry
Definition: ActivityRegistry.h:132
str
#define str(s)
Definition: TestProcessor.cc:48
processor_model.h
dqm::impl::MonitorElement::setXTitle
virtual void setXTitle(std::string const &title)
Definition: MonitorElement.cc:861
ServiceMaker.h
edm::ConfigurationDescriptions
Definition: ConfigurationDescriptions.h:28
AlCaHLTBitMon_QueryRunRegistry.string
string
Definition: AlCaHLTBitMon_QueryRunRegistry.py:256
edm::LogWarning
Definition: MessageLogger.h:141
edm::ParameterSetDescription::addUntracked
ParameterDescriptionBase * addUntracked(U const &iLabel, T const &value)
Definition: ParameterSetDescription.h:100
edm::GlobalContext
Definition: GlobalContext.h:29
edm::service::SystemBounds
Definition: SystemBounds.h:29
edm::ActivityRegistry::watchPostEvent
void watchPostEvent(PostEvent::slot_type const &iSlot)
Definition: ActivityRegistry.h:406
edm::ParameterSet
Definition: ParameterSet.h:36
edm::service::SystemBounds::maxNumberOfThreads
unsigned int maxNumberOfThreads() const
Definition: SystemBounds.h:38
KineDebug3::count
void count()
Definition: KinematicConstrainedVertexUpdatorT.h:21
dumpMFGeometry_cfg.delta
delta
Definition: dumpMFGeometry_cfg.py:25
edm::ParameterSetDescription::ifValue
ParameterDescriptionNode * ifValue(ParameterDescription< T > const &switchParameter, std::unique_ptr< ParameterDescriptionCases< T >> cases)
Definition: ParameterSetDescription.h:220
edm::Service
Definition: Service.h:30
dqm::impl::MonitorElement::setYTitle
virtual void setYTitle(std::string const &title)
Definition: MonitorElement.cc:866
edm::service::SystemBounds::maxNumberOfStreams
unsigned int maxNumberOfStreams() const
Definition: SystemBounds.h:35
readEcalDQMStatus.interval
interval
Definition: readEcalDQMStatus.py:18
ThroughputService::m_enable_dqm
bool m_enable_dqm
Definition: ThroughputService.h:60
ThroughputService::m_counter
std::atomic< uint32_t > m_counter
Definition: ThroughputService.h:55
std
Definition: JetResolutionObject.h:76
ThroughputService::m_time_resolution
const double m_time_resolution
Definition: ThroughputService.h:64
dqm::implementation::IGetter
Definition: DQMStore.h:484
edm::ActivityRegistry::watchPreSourceEvent
void watchPreSourceEvent(PreSourceEvent::slot_type const &iSlot)
Definition: ActivityRegistry.h:182
ThroughputService::fillDescriptions
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
Definition: ThroughputService.cc:17
or
The Signals That Services Can Subscribe To This is based on ActivityRegistry and is current per Services can connect to the signals distributed by the ActivityRegistry in order to monitor the activity of the application Each possible callback has some defined which we here list in angle e< void, edm::EventID const &, edm::Timestamp const & > We also list in braces which AR_WATCH_USING_METHOD_ is used for those or
Definition: Activities.doc:12
ThroughputService::m_dqm_bynproc
const bool m_dqm_bynproc
Definition: ThroughputService.h:61
dqm::implementation::IBooker
Definition: DQMStore.h:43
ThroughputService::m_startup
std::chrono::system_clock::time_point m_startup
Definition: ThroughputService.h:51
ThroughputService::preallocate
void preallocate(edm::service::SystemBounds const &bounds)
Definition: ThroughputService.cc:53
edm::ActivityRegistry::watchPreGlobalBeginRun
void watchPreGlobalBeginRun(PreGlobalBeginRun::slot_type const &iSlot)
Definition: ActivityRegistry.h:273
trigObjTnPSource_cfi.bins
bins
Definition: trigObjTnPSource_cfi.py:20
ThroughputService::ThroughputService
ThroughputService(const edm::ParameterSet &, edm::ActivityRegistry &)
Definition: ThroughputService.cc:33
processor_model
const std::string processor_model
Definition: processor_model.cc:47
TimeOfDay.h
edm::EmptyGroupDescription
Definition: EmptyGroupDescription.h:15
edm::ParameterDescription
Definition: ParameterDescription.h:110
gather_cfg.blocks
blocks
Definition: gather_cfg.py:90
dqm::implementation::IBooker::book1D
MonitorElement * book1D(TString const &name, TString const &title, int const nchX, double const lowX, double const highX, FUNC onbooking=NOOP())
Definition: DQMStore.h:98