CMS 3D CMS Logo

List of all members | Public Member Functions | Static Public Member Functions | Private Member Functions | Private Attributes
edm::service::ResourceEnforcer Class Reference

Public Member Functions

 ResourceEnforcer (edm::ParameterSet const &iConfig, edm::ActivityRegistry &iAR)
 

Static Public Member Functions

static void fillDescriptions (edm::ConfigurationDescriptions &descriptions)
 

Private Member Functions

void check ()
 
void postEventProcessing (edm::StreamContext const &)
 

Private Attributes

std::atomic< bool > m_doingCheck
 
std::atomic< unsigned int > m_eventCount
 
ProcInfoFetcher m_fetcher
 
double m_maxRSS
 
double m_maxTime
 
double m_maxVSize
 
unsigned int m_nEventsToSkip
 
CPUTimer m_timer
 

Detailed Description

Definition at line 29 of file ResourceEnforcer.cc.

Constructor & Destructor Documentation

ResourceEnforcer::ResourceEnforcer ( edm::ParameterSet const &  iConfig,
edm::ActivityRegistry iAR 
)

Definition at line 64 of file ResourceEnforcer.cc.

References m_nEventsToSkip, m_timer, edm::service::SystemBounds::maxNumberOfStreams(), postEventProcessing(), edm::CPUTimer::start(), edm::ActivityRegistry::watchPostEvent(), and edm::ActivityRegistry::watchPreallocate().

65  : m_maxVSize(iConfig.getUntrackedParameter<double>("maxVSize", 0) * 1000.), //convert to MB
66  m_maxRSS(iConfig.getUntrackedParameter<double>("maxRSS", 0) * 1000.),
67  m_maxTime(iConfig.getUntrackedParameter<double>("maxTime", 0) * 60. * 60.), //convert from hours to seconds
68  m_nEventsToSkip(0),
69  m_eventCount(0),
70  m_doingCheck(false) {
71  iReg.watchPostEvent(this, &ResourceEnforcer::postEventProcessing);
72  iReg.watchPreallocate([this](edm::service::SystemBounds const& iBounds) {
73  //We do not want the frequency of checking to be dependent on
74  // how many parallel streams are running
75  m_nEventsToSkip = iBounds.maxNumberOfStreams() - 1;
76  });
77  m_timer.start();
78 }
void start()
Definition: CPUTimer.cc:68
void postEventProcessing(edm::StreamContext const &)
unsigned int maxNumberOfStreams() const
Definition: SystemBounds.h:35
std::atomic< bool > m_doingCheck
std::atomic< unsigned int > m_eventCount

Member Function Documentation

void ResourceEnforcer::check ( void  )
private

Definition at line 101 of file ResourceEnforcer.cc.

References edm::errors::ExceededResourceRSS, edm::errors::ExceededResourceTime, edm::errors::ExceededResourceVSize, Exception, edm::service::ProcInfoFetcher::fetch(), m_fetcher, m_maxRSS, m_maxTime, m_maxVSize, m_timer, pi, edm::CPUTimer::realTime(), edm::service::ProcInfo::rss, and edm::service::ProcInfo::vsize.

Referenced by postEventProcessing().

101  {
103 
104  if (0 != m_maxVSize && m_maxVSize < pi.vsize) {
106  << "Exceeded maximum allowed VSize of " << m_maxVSize / 1000. << " GB (VSize is " << pi.vsize / 1000. << ")";
107  }
108 
109  if (0 != m_maxRSS && m_maxRSS < pi.rss) {
111  << "Exceeded maximum allowed RSS of " << m_maxRSS / 1000. << " GB (VSize is " << pi.rss / 1000. << ")";
112  }
113 
114  if (0 != m_maxTime && m_maxTime < m_timer.realTime()) {
116  << "Exceeded maximum allowed time of " << m_maxTime / 60. / 60. << " hours";
117  }
118 }
const Double_t pi
double realTime() const
Definition: CPUTimer.cc:139
void ResourceEnforcer::fillDescriptions ( edm::ConfigurationDescriptions descriptions)
static

Definition at line 124 of file ResourceEnforcer.cc.

References edm::ConfigurationDescriptions::add(), edm::ParameterSetDescription::addUntracked(), DEFINE_FWK_SERVICE, and edm::ParameterDescriptionNode::setComment().

124  {
126  desc.addUntracked<double>("maxVSize", 0.)
127  ->setComment("Maximum allowed VSize for the job in GB. Ignored if set to 0.");
128  desc.addUntracked<double>("maxRSS", 0.)->setComment("Maximum allowd RSS for the job in GB. Ignored if set to 0.");
129  desc.addUntracked<double>("maxTime", 0.)
130  ->setComment("Maximum allowd wallclock time for the job in hours. Ignored if set to 0.");
131  descriptions.add("ResourceEnforcer", desc);
132 }
void add(std::string const &label, ParameterSetDescription const &psetDescription)
void ResourceEnforcer::postEventProcessing ( edm::StreamContext const &  )
private

Definition at line 88 of file ResourceEnforcer.cc.

References check(), KineDebug3::count(), m_doingCheck, m_eventCount, and m_nEventsToSkip.

Referenced by ResourceEnforcer().

88  {
89  //If another thread is already doing a check, we don't need to do another one
90  auto count = ++m_eventCount;
91  if (count > m_nEventsToSkip) {
92  bool expected = false;
93  if (m_doingCheck.compare_exchange_strong(expected, true, std::memory_order_acq_rel)) {
94  this->check();
95  m_doingCheck.store(false, std::memory_order_release);
96  m_eventCount.store(0, std::memory_order_release);
97  }
98  }
99 }
std::atomic< bool > m_doingCheck
std::atomic< unsigned int > m_eventCount

Member Data Documentation

std::atomic<bool> edm::service::ResourceEnforcer::m_doingCheck
private

Definition at line 47 of file ResourceEnforcer.cc.

Referenced by postEventProcessing().

std::atomic<unsigned int> edm::service::ResourceEnforcer::m_eventCount
private

Definition at line 46 of file ResourceEnforcer.cc.

Referenced by postEventProcessing().

ProcInfoFetcher edm::service::ResourceEnforcer::m_fetcher
private

Definition at line 39 of file ResourceEnforcer.cc.

Referenced by check().

double edm::service::ResourceEnforcer::m_maxRSS
private

Definition at line 43 of file ResourceEnforcer.cc.

Referenced by check().

double edm::service::ResourceEnforcer::m_maxTime
private

Definition at line 44 of file ResourceEnforcer.cc.

Referenced by check().

double edm::service::ResourceEnforcer::m_maxVSize
private

Definition at line 42 of file ResourceEnforcer.cc.

Referenced by check().

unsigned int edm::service::ResourceEnforcer::m_nEventsToSkip
private

Definition at line 45 of file ResourceEnforcer.cc.

Referenced by postEventProcessing(), and ResourceEnforcer().

CPUTimer edm::service::ResourceEnforcer::m_timer
private

Definition at line 40 of file ResourceEnforcer.cc.

Referenced by check(), and ResourceEnforcer().