ATLAS Offline Software
SemiDetMisc.h
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 // //
7 // Description: Miscellaneous utilities and data structures //
8 // used by the SemiDetHelper class. //
9 // //
10 // Author: Thomas H. Kittelmann (Thomas.Kittelmann@cern.ch) //
11 // Initial version: March 2011 //
12 // //
14 
15 #ifndef PERFMONCOMPS_SEMIDETMISC_H
16 #define PERFMONCOMPS_SEMIDETMISC_H
17 
18 #include "PerfMonEvent/mallinfo.h"
20 #include <sys/time.h>
21 #include <fcntl.h>
22 #include <ctime>
23 #include <cassert>
24 #include <cstring>
25 #include <climits>
26 #include <limits>
27 #include <sstream>
28 #include <string>
29 #include <map>
30 #include <unordered_map>
31 #include <cmath>//fabs
32 #include <cstdlib>//for getenv
33 #include <dlfcn.h>
34 #include <stdio.h> // for fopen
35 
36 
37 #ifdef __linux
38 #include <malloc.h>
39 #endif
40 
41 #include <stdint.h>
42 #include <unistd.h>
43 
44 namespace PMonSD {
45 
46  //base functions for collecting data:
47  void get_vmem_rss_kb(double&vmem,double&rss,bool vmemonly=false);//~4microsecs
48  double get_malloc_kb ATLAS_NOT_THREAD_SAFE ();//~0.2microsecs (stdcmalloc) or ~4microsecs (tcmalloc)
49  double get_vmem_kb();//~4microsecs
50  double get_rss_kb();//~4microsecs
51  double get_cpu_ms();//~0.3microsecs
52  double get_wall_ms();
53  void setUTCTimeString(std::string&s,double offset_ms=0);
54 
55  struct Meas {
56  double vmem;
57  double malloc;
58  double cpu;
59  double wall;
60  bool hasWallTime() const { return wall>-950; }
61  void capture ATLAS_NOT_THREAD_SAFE (bool cpufirst=true)
62  {
63  m_unused=false;
64 
65  if (cpufirst) {
66  cpu=get_cpu_ms();
67  if (hasWallTime())
68  wall=get_wall_ms();
69  }
70 
71  vmem=get_vmem_kb();
72  malloc = m_mallocDisabled ? 0.0 : get_malloc_kb();
73  if (!cpufirst) {
74  if (hasWallTime())
75  wall=get_wall_ms();
76  cpu=get_cpu_ms();
77  }
82  }
83  Meas(bool enable_walltime=false) : vmem(-999), malloc(-999), cpu(-999),wall(enable_walltime?-900:-999),
85  m_unused(true),m_mallocDisabled(false)
86  {}
87  //Double counting protection:
88  void incrementOffsets(double pvmem,double pmalloc,double pcpu,double pwall=0)
89  {
90  m_offset_vmem+=pvmem;
91  if (!m_mallocDisabled) m_offset_malloc+=pmalloc;
92  m_offset_cpu+=pcpu;
93  m_offset_wall+=pwall;
94  }
95  bool unused() const { return m_unused; }
96  void captureIfUnused ATLAS_NOT_THREAD_SAFE () { if (unused()) capture(); }
97  double last_cpu_raw_ms() { return cpu+m_offset_cpu; }//for internal overhead monitoring
98  bool mallocDisabled() const { return m_mallocDisabled; }
100  private:
103  double m_offset_cpu;
105  bool m_unused;
107  };
108 
110  public:
111  //Simply calculates a running mean of each variable (intended for
112  //steps typically occuring just once in a job)
113  CompDataBasic();
114  virtual ~CompDataBasic(){}
115  virtual void addPointStart(const Meas&);
116  virtual void addPointStop(Meas&, unsigned val_nevts=0);
117  unsigned nEntries() const;
118  double meanDeltaCPU() const;
119  double meanDeltaVMEM() const;
120  double meanDeltaMalloc() const;
121 
122  //for sorting:
123  double sortVal(unsigned i) const { return fabs(getVal(i)); }
124  double sortValCPU() const { return fabs(m_sum_dcpu); }
125  double sortValVMEM() const { return fabs(m_sum_dmem); }
126  double sortValMalloc() const { return fabs(m_sum_dmal); }
127  double sortValMemory() const { return fabs(m_sum_dmal)+fabs(m_sum_dmem); }
128  //
129  static constexpr unsigned nvals=3;
130  static constexpr unsigned ival_cpu=0;
131  static constexpr unsigned ival_vmem=1;
132  static constexpr unsigned ival_malloc=2;
133  float getVal(unsigned i) const
134  {
135  if (i==ival_cpu) return m_sum_dcpu;
136  else if (i==ival_vmem) return m_sum_dmem;
137  else return m_sum_dmal;
138  }
139  //To be used by the post-processing and double-dso protection:
140  void setEntries(unsigned n) {
141  m_nentries=n;
142  }
143  void add(const CompDataBasic& other) {
144  //Does deliberately add just 1 to nentries (used this way in post-proc.)
145  ++m_nentries;
146  m_sum_dcpu+=other.m_sum_dcpu;
147  m_sum_dmem+=other.m_sum_dmem;
148  m_sum_dmal+=other.m_sum_dmal;
149  }
150  protected:
151  unsigned m_nentries;
152  float m_tmp_dcpu;float m_sum_dcpu;
153  float m_tmp_dmem;float m_sum_dmem;
154  float m_tmp_dmal;float m_sum_dmal;
155  };
156 
158  public:
159  //Extends CompDataBasic by also noticing which event had the
160  //maximal contribution for each variable (intended for the "evt" step).
162  void addPointStart(const Meas&);
163  void addPointStop(Meas&, unsigned val_nevts);
164  double maxDeltaCPU() const;
165  unsigned maxDeltaCPU_iEntry() const;
166  double maxDeltaVMEM() const;
167  unsigned maxDeltaVMEM_iEntry() const;
168  double maxDeltaMalloc() const;
169  unsigned maxDeltaMalloc_iEntry() const;
170  private:
174  };
175 
177  CompDataExtended data_evt;//evt (after first event)
178  CompDataBasic data[4];//ini/1st/fin/cbk (not dso since compNames there are libs)
179 
180  //Helper method for proper classification:
181  static constexpr int index_other=-2;
182  static constexpr int index_evt=-1;
183  static constexpr int index_1st=0;
184  static constexpr int index_ini=1;
185  static constexpr int index_fin=2;
186  static constexpr int index_cbk=3;
187  static int index(const std::string& stepName);//index in data array (if >=0)
188  };
189 
190  //Maps for standard steps:
191  typedef std::pair<std::string,std::string> OtherKey;
192  class FastStrCmp {
193  //Fast comparisons without hash calculations.
194  public:
195  bool operator()(const std::string&a,const std::string&b) const {
196  //by size, middle char and finally entire string
197  if (a.size()!=b.size()) return a.size()<b.size();
198  if (!a.empty()&&a[a.size()-1]!=b[a.size()-1])
199  return a[a.size()-1]<b[a.size()-1];
200  return a<b;
201  }
202  bool operator()(const OtherKey&a,const OtherKey&b) const {
203  if (a.first.size()!=b.first.size()) return a.first.size()<b.first.size();
204  if (a.second.size()!=b.second.size()) return a.second.size()<b.second.size();
205  return a<b;
206  }
207  };
208  typedef std::map<std::string,CompDataStdSteps,FastStrCmp> MapStdSteps;
209  //Maps for custom steps (not in the same map for memory reasons):
210  typedef std::map<OtherKey,CompDataBasic,FastStrCmp> MapOtherSteps;
211 
212  // To make sorting and presenting two different types of data storages easier we add a wrapper:
213  class StepWrapper {
214  public:
215  virtual ~StepWrapper(){}
216  virtual const std::string& stepName() const = 0;
217  virtual const CompDataBasic* getData(const std::string&compName) const = 0;
218  virtual void iterateReset() = 0;
219  virtual bool getNext(const std::string*& compName,const CompDataBasic*&) = 0;
220  virtual unsigned nComps() const =0;
221  virtual bool extended() const { return false; }
222  const CompDataBasic* getExampleData()//for formatting columns
223  {
224  iterateReset();
225  const std::string* dummy;const CompDataBasic* data;
226  bool ok= getNext(dummy,data);
227  iterateReset();
228  return ok ? data : 0;
229  }
230  };
232  class StepWrapperStd : public StepWrapper {
233  public:
235  : m_map(m),
236  m_it(m_map->begin()),
237  m_itE(m_map->end()),
240  {}
241  const std::string& stepName() const { return m_stepName; }
242  const CompDataBasic* getData(const std::string&
243 #ifndef NDEBUG
244  compName
245 #endif
246  ) const
247  {
248  assert(m_map->find(compName) != m_map->end());
249  return 0;
250  }
251  virtual void iterateReset() { m_it=m_map->begin(); }
252  virtual bool getNext(const std::string*& compName,const CompDataBasic*&data) {
253  if (m_it==m_itE) return false;
254  compName=&(m_it->first);
255  if (m_idx==CompDataStdSteps::index_evt) data=&(m_it->second.data_evt);
256  else data=&(m_it->second.data[m_idx]);
257  ++m_it;
258  return true;
259  }
260  virtual unsigned nComps() const { return m_map->size(); }
261  virtual bool extended() const { return (m_idx==CompDataStdSteps::index_evt); }
262  private:
264  MapStdSteps::const_iterator m_it;
265  MapStdSteps::const_iterator m_itE;
266  const std::string m_stepName;
267  int m_idx;
268  };
270  class StepWrapperOther : public StepWrapper {
271  public:
272  StepWrapperOther(const std::string&stepName,const MapOtherSteps*m)
273  : m_map(m), m_itE(m->end()), m_stepName(stepName)
274  {
275  iterateReset();
276  }
277  const std::string& stepName() const { return m_stepName; }
278  const CompDataBasic* getData(const std::string&compName) const
279  {
280  MapOtherSteps::const_iterator it= m_map->find(OtherKey(compName,m_stepName));
281  assert(it!=m_itE);
282  return &(it->second);
283  }
284  void iterateReset() { m_it=m_map->begin(); }
285  bool getNext(const std::string*& compName,const CompDataBasic*&data)
286  {
287  if (m_it==m_itE) return false;
288  while(m_it!=m_itE&&m_it->first.second!=m_stepName) { ++m_it; }
289  if (m_it==m_itE) return false;
290  compName=&(m_it->first.first);
291  data=&(m_it->second);
292  ++m_it;
293  return true;
294  }
295  virtual unsigned nComps() const { return m_map->size(); }
296  private:
298  MapOtherSteps::const_iterator m_it;
299  MapOtherSteps::const_iterator m_itE;
300  const std::string m_stepName;
301  };
302  inline unsigned vmpeak()
303  {
304  FILE* file = fopen("/proc/self/status", "r");
305  if (!file)
306  return 0;
307  unsigned result = 0;
308  char line[256];
309  while (fgets(line, 256, file) != NULL){
310  if (strncmp(line, "VmPeak:", 7) == 0) {
311  result=atoi(&(line[7]));
312  break;
313  }
314  }
315  fclose(file);
316  return result;
317  }
318  inline std::string get_field(const char* filename,const std::string& fieldname,char space='_')
319  {
320  //nb: not hyper-optimised
321  FILE* file = fopen(filename, "r");
322  if (!file)
323  return "unknown";
324  std::string result;
325  result.reserve(128);
326  result="unknown";
327  char line[256];
328  while (fgets(line, 256, file) != NULL){
329  if (strncmp(line, fieldname.c_str(), fieldname.size()) == 0) {
330  size_t pos = std::string(line).find( ':', fieldname.size() );
331  if (pos==std::string::npos) {
332  fclose(file);
333  return result;
334  }
335  result.clear();
336  bool ignore_nextspace=true;
337  ++pos;
338  for (;pos<256;++pos) {
339  if (line[pos]=='\n')
340  break;
341  if (line[pos]==' '||line[pos]=='\t') {
342  if (ignore_nextspace)
343  continue;
344  ignore_nextspace=true;
345  result+=space;
346  } else {
347  result+=line[pos];
348  ignore_nextspace=false;
349  }
350  }
351  break;
352  }
353  }
354  fclose(file);
355  //make sure there are no trailing "spaces":
356  while (!result.empty()&&result.at(result.size()-1)==space)
357  result.resize(result.size()-1);
358  return result;
359  }
360  inline int64_t clock_nooverflow();
361  inline std::string cpu_model()
362  {
363  std::stringstream s;
364  s<<get_field("/proc/cpuinfo","model name",'_')<<"/"<<get_field("/proc/cpuinfo","cache size",'_');
365  return s.str();
366  }
367  inline int bogomips()
368  {
369  std::string bm=get_field("/proc/cpuinfo","bogomips",' ');
370  if (bm=="unknown")
371  return 0;
372  return int(atof(bm.c_str())+0.5);
373  }
374  inline const char * envvar(const char*e,const char * def ="")
375  {
376  const char * c = getenv(e);
377  return c ? c : def;
378  }
379  inline bool envvar_is_set(const char*e) {
380  const char * c = getenv(e);
381  if (!c) return false;
382  return strncmp(c,"1",2)==0;
383  }
384  inline unsigned long system_boot_time_seconds()
385  {
386  FILE* file = fopen("/proc/stat", "r");
387  if (!file)
388  return 0;
389  char line[32];
390  while (fgets(line, 32, file) != NULL){
391  if (strncmp(line, "btime ", 6) == 0) {
392  unsigned long l;
393  sscanf(&(line[6]),"%80lu",&l);
394  fclose(file);
395  return l;
396  }
397  }
398  fclose(file);
399  return 0;
400  }
401 
402  inline double get_absolute_wall_ms()
403  {
404  timeval tv;
405  int err=gettimeofday(&tv, 0);
406  if (err!=0)
407  return 0.0;
408  uint64_t res_usec=uint64_t(tv.tv_sec)*1000000 + uint64_t(tv.tv_usec);
409  return 0.001*res_usec;
410  }
411 
412  inline double secs_per_jiffy()
413  {
414 #ifdef __linux
415  //tick will almost certainly be one of 100, 250, 300 or 1000
416  //depending on the kernel configuration (USER_HZ).
417  long tick=sysconf(_SC_CLK_TCK);
418  if (tick>=1&&tick<1000000)
419  return 1.0/tick;
420 #endif
421  //Fall-back to getting it the hard way:
422  clock_t t0=clock(); clock_t t1=t0; while (t1==t0) t1=clock();
423  return double(t1-t0)/CLOCKS_PER_SEC;
424  }
425 
426  inline double jobstart_jiffy2unix_ms(const std::string& s) {
427  const double d=strtod(&(s[0]),0); if (d<=0.) return 0;
428  const unsigned long b=system_boot_time_seconds(); if (!b) return 0;
429  const double spj = secs_per_jiffy(); if (!spj) return 0;
430  return 1000.0*(d*spj+b);
431  }
432 
433  inline const char * symb2lib(const char*symbol,const char * failstr = "unknown") {
434  void * addr = dlsym(RTLD_DEFAULT,symbol);
435  if (!addr) return failstr;
436  Dl_info di;
437  if (!dladdr(addr, &di)) return failstr;
438  if (!di.dli_fname) return failstr;
439  return di.dli_fname;
440  }
441 }
442 
444 // IMPLEMENTATION //
446 
447 inline void PMonSD::get_vmem_rss_kb(double&vmem,double&rss,bool vmemonly) {
448  vmem=rss=0.0;
449 #ifndef __linux
450  vmemonly=false;//avoid compile warning
451  return;
452 #else
453  //It would be a lot faster without this open call...
454  int fd = open("/proc/self/statm", O_RDONLY);
455  if (fd<0) return;
456  char data[32];
457  int l = read(fd, data, sizeof(data));
458  close(fd);
459  if (l<4) return;//Failure or suspiciously short
460  static const float pg_size_in_kb = sysconf(_SC_PAGESIZE)/1024.0;
461  //Assume that the first field is vmem and the second is rss.
462  vmem=atoi(data)*pg_size_in_kb;
463  if (vmemonly)
464  return;
465  for (unsigned i=0;i+1<sizeof(data);++i)
466  if (data[i]==' ') {
467  rss=atoi(&(data[i+1]))*pg_size_in_kb;
468  return;
469  }
470 #endif
471 }
472 inline double PMonSD::get_vmem_kb() { double v,r;get_vmem_rss_kb(v,r,true); return v; }
473 inline double PMonSD::get_rss_kb() { double v,r;get_vmem_rss_kb(v,r); return r; }
474 inline double PMonSD::get_malloc_kb ATLAS_NOT_THREAD_SAFE () {
475 #ifndef __linux
476  return 0.0;
477 #else
478  //~0.2microsec/call under libc malloc, 4microsec/call under tcmalloc (mallinfo() call dominates).
479  //NB: Bug in http://sourceware.org/bugzilla/show_bug.cgi?id=4349
480  //makes mallinfo quite slow for fragmented processes on libc<=2.5 (like on SLC5)
482  //mallinfo fields are always "int" which is pretty annoying. As long
483  //as the true amount of mallocs between two calls does not change
484  //more than 2GB, we can work around this with the following ugly
485  //code, repeated for each of the two fields we are looking at:
486  int64_t uordblks_raw = m.uordblks;
487  if (sizeof(m.uordblks)==sizeof(int32_t)) {
488  //assert(typeid(m.uordblks)==typeid(int32_t));
489  const int64_t half_range =std::numeric_limits<int32_t>::max();
490  static int64_t last_uordblks=m.uordblks;
491  static int64_t offset_uordblks=0;
492  if (uordblks_raw-last_uordblks>half_range) {
493  //underflow detected
494  offset_uordblks-=2*half_range;
495  } else if (last_uordblks-uordblks_raw>half_range) {
496  //overflow detected
497  offset_uordblks+=2*half_range;
498  }
499  last_uordblks=uordblks_raw;
500  uordblks_raw+=offset_uordblks;
501  }
502  //exact same code for hblkhd (a bit of code duplication...):
503  int64_t hblkhd_raw = m.hblkhd;
504  if (sizeof(m.hblkhd)==sizeof(int32_t)) {
505  //assert(typeid(m.hblkhd)==typeid(int32_t));
506  const int64_t half_range =std::numeric_limits<int32_t>::max();
507  static int64_t last_hblkhd=m.hblkhd;
508  static int64_t offset_hblkhd=0;
509  if (hblkhd_raw-last_hblkhd>half_range) {
510  //underflow detected
511  offset_hblkhd-=2*half_range;
512  } else if (last_hblkhd-hblkhd_raw>half_range) {
513  //overflow detected
514  offset_hblkhd+=2*half_range;
515  }
516  last_hblkhd=hblkhd_raw;
517  hblkhd_raw+=offset_hblkhd;
518  }
519  return (uordblks_raw+hblkhd_raw)/1024.0;
520 #endif
521 }
522 
523 inline int64_t PMonSD::clock_nooverflow() {
524  //In gnu, clock_t is a long and CLOCKS_PER_SECOND 1000000 so clock()
525  //will overflow in 32bit builds after a few thousands of seconds. To
526  //avoid this, we have the following method instead which notices when
527  //overflow occurs and corrects for it (it won't notice if it doesn't
528  //get called for >4000ms, but this should be ok for almost all of our
529  //use cases):
530  assert(std::numeric_limits<clock_t>::is_integer);
531  if (sizeof(clock_t)>=sizeof(int64_t))
532  return clock();//64bit builds shouldn't have overflow issues.
533 
534  //not so clean with statics i guess:
535  static clock_t last=clock();
536  static int64_t offset=0;
537  clock_t c=clock();
538  if (c<last)
540  last=c;
541  return offset+c;
542 }
543 
544 inline double PMonSD::get_cpu_ms() { return clock_nooverflow()*(1000.0/CLOCKS_PER_SEC); }
546  : m_nentries(0),
547  m_tmp_dcpu(0.),m_sum_dcpu(0.),
548  m_tmp_dmem(0.),m_sum_dmem(0.),
549  m_tmp_dmal(0.),m_sum_dmal(0.)
550 {
551 }
553 {
554  m_tmp_dcpu=m.cpu;
555  m_tmp_dmem=m.vmem;
556  m_tmp_dmal=m.malloc;
557 }
559 {
560  float dcpu(m.cpu-m_tmp_dcpu);m_sum_dcpu+=dcpu;
561  float dmem(m.vmem-m_tmp_dmem);m_sum_dmem+=dmem;
562  float dmal(m.malloc-m_tmp_dmal);m_sum_dmal+=dmal;
563  m.incrementOffsets(dmem,dmal,dcpu);//register that we dished these out already.
564  ++m_nentries;
565 }
566 inline unsigned PMonSD::CompDataBasic::nEntries() const { return m_nentries; }
567 inline double PMonSD::CompDataBasic::meanDeltaCPU() const { return m_nentries ? m_sum_dcpu/m_nentries : 0.0; }
568 inline double PMonSD::CompDataBasic::meanDeltaVMEM() const { return m_nentries ? m_sum_dmem/m_nentries : 0.0; }
569 inline double PMonSD::CompDataBasic::meanDeltaMalloc() const { return m_nentries ? m_sum_dmal/m_nentries : 0.0; }
571  : CompDataBasic(),
572  m_max_dcpu(0.),m_max_dcpu_ientry(0),
573  m_max_dmem(0.),m_max_dmem_ientry(0),
574  m_max_dmal(0.),m_max_dmal_ientry(0)
575 {}
577 {
578  m_tmp_dcpu=m.cpu;
579  m_tmp_dmem=m.vmem;
580  m_tmp_dmal=m.malloc;
581 }
582 inline void PMonSD::CompDataExtended::addPointStop(Meas&m,unsigned val_nevt)
583 {
584  float dcpu(m.cpu-m_tmp_dcpu);m_sum_dcpu+=dcpu;
585  float dmem(m.vmem-m_tmp_dmem);m_sum_dmem+=dmem;
586  float dmal(m.malloc-m_tmp_dmal);m_sum_dmal+=dmal;
587  m.incrementOffsets(dmem,dmal,dcpu);//register that we dished these out already.
588  if (dcpu>m_max_dcpu) { m_max_dcpu=dcpu; m_max_dcpu_ientry=val_nevt; }
589  if (dmem>m_max_dmem) { m_max_dmem=dmem; m_max_dmem_ientry=val_nevt; }
590  if (dmal>m_max_dmal) { m_max_dmal=dmal; m_max_dmal_ientry=val_nevt; }
591  ++m_nentries;
592 }
593 inline double PMonSD::CompDataExtended::maxDeltaCPU() const { return m_max_dcpu; }
594 inline unsigned PMonSD::CompDataExtended::maxDeltaCPU_iEntry() const { return m_max_dcpu_ientry; }
595 inline double PMonSD::CompDataExtended::maxDeltaVMEM() const { return m_max_dmem; }
596 inline unsigned PMonSD::CompDataExtended::maxDeltaVMEM_iEntry() const { return m_max_dmem_ientry; }
597 inline double PMonSD::CompDataExtended::maxDeltaMalloc() const { return m_max_dmal; }
598 inline unsigned PMonSD::CompDataExtended::maxDeltaMalloc_iEntry() const { return m_max_dmal_ientry; }
599 inline int PMonSD::CompDataStdSteps::index(const std::string& stepName)
600 {
601  // Only 5 possibilities --- not worth doing anything fancier.
602  // Try to put the most frequent ones first.
603  if (stepName == "evt") return index_evt;
604  if (stepName == "cbk") return index_cbk;
605  if (stepName == "1st") return index_1st;
606  if (stepName == "ini") return index_ini;
607  if (stepName == "fin") return index_fin;
608  return index_other;
609 }
610 
611 inline void PMonSD::setUTCTimeString(std::string&s,double offset_ms)
612 {
613  //Encoded in ISO 8601 UTC time format. It can be decoded in python
614  //(in a "naive" timezone unaware datetime object) with:
615  //datetime.strptime(input,'%Y-%m-%dT%H:%M:%S+0000')
616  time_t t = time(NULL);//unixtime in seconds
617  if (offset_ms)
618  t+=static_cast<time_t>(0.5+0.001*offset_ms);
619  struct tm ptm;
620  gmtime_r(&t, &ptm);
621  s.clear();
622  s.resize(26);
623  size_t r = strftime(&(s[0]),25,"%Y-%m-%dT%H:%M:%S+0000",&ptm);
624  if (r>0&&r<25) s.resize(r);
625  else s="0000-00-00T00:00:00+0000";
626 }
627 
628 inline double PMonSD::get_wall_ms()
629 {
630  //don't care about timezone since we will just be doing differences
631  //(ignore daylight savings issues...). Like clock() it returns 0.0
632  //on first call in a process.
633  double t=get_absolute_wall_ms();
634  static const double offset = [&]() {
635  return t;
636  }();
637  return t-offset;
638 }
639 
640 #endif // PERFMONCOMPS_SEMIDETMISC_H
read
IovVectorMap_t read(const Folder &theFolder, const SelectionCriterion &choice, const unsigned int limit=10)
Definition: openCoraCool.cxx:569
PMonSD::StepWrapper::~StepWrapper
virtual ~StepWrapper()
Definition: SemiDetMisc.h:215
beamspotman.r
def r
Definition: beamspotman.py:676
data
char data[hepevt_bytes_allocation_ATLAS]
Definition: HepEvt.cxx:11
PMonSD::ATLAS_NOT_THREAD_SAFE
double get_malloc_kb ATLAS_NOT_THREAD_SAFE()
AddEmptyComponent.compName
compName
Definition: AddEmptyComponent.py:32
checkFileSG.line
line
Definition: checkFileSG.py:75
PMonSD::StepWrapper::getData
virtual const CompDataBasic * getData(const std::string &compName) const =0
PMonSD::StepWrapperOther::stepName
const std::string & stepName() const
Definition: SemiDetMisc.h:277
python.SystemOfUnits.s
int s
Definition: SystemOfUnits.py:131
PMonSD::setUTCTimeString
void setUTCTimeString(std::string &s, double offset_ms=0)
Definition: SemiDetMisc.h:611
get_generator_info.result
result
Definition: get_generator_info.py:21
python.SystemOfUnits.m
int m
Definition: SystemOfUnits.py:91
PMonSD::Meas::disableMalloc
void disableMalloc()
Definition: SemiDetMisc.h:99
max
#define max(a, b)
Definition: cfImp.cxx:41
PMonSD::StepWrapperStd::m_map
const MapStdSteps * m_map
Definition: SemiDetMisc.h:263
PMonSD::StepWrapperOther::getData
const CompDataBasic * getData(const std::string &compName) const
Definition: SemiDetMisc.h:278
PMonSD::Meas::vmem
double vmem
Definition: SemiDetMisc.h:56
CaloCellPos2Ntuple.int
int
Definition: CaloCellPos2Ntuple.py:24
PMonSD::StepWrapper::stepName
virtual const std::string & stepName() const =0
PMonSD::CompDataStdSteps::index_ini
static constexpr int index_ini
Definition: SemiDetMisc.h:184
PMonSD::Meas::Meas
Meas(bool enable_walltime=false)
Definition: SemiDetMisc.h:83
PMonSD::Meas::hasWallTime
bool hasWallTime() const
Definition: SemiDetMisc.h:60
PMonSD::get_absolute_wall_ms
double get_absolute_wall_ms()
Definition: SemiDetMisc.h:402
PMonSD::CompDataExtended::m_max_dcpu
float m_max_dcpu
Definition: SemiDetMisc.h:171
index
Definition: index.py:1
PMonSD::StepWrapperStd::extended
virtual bool extended() const
Definition: SemiDetMisc.h:261
hist_file_dump.d
d
Definition: hist_file_dump.py:137
PMonSD::Meas::cpu
double cpu
Definition: SemiDetMisc.h:58
PMonSD::FastStrCmp
Definition: SemiDetMisc.h:192
PMonSD::CompDataBasic::sortValMalloc
double sortValMalloc() const
Definition: SemiDetMisc.h:126
PMonSD::CompDataStdSteps::index_fin
static constexpr int index_fin
Definition: SemiDetMisc.h:185
PMonSD::CompDataBasic::meanDeltaVMEM
double meanDeltaVMEM() const
Definition: SemiDetMisc.h:568
PMonSD::MapOtherSteps
std::map< OtherKey, CompDataBasic, FastStrCmp > MapOtherSteps
Definition: SemiDetMisc.h:210
ALFA_EventTPCnv_Dict::t0
std::vector< ALFA_RawData_p1 > t0
Definition: ALFA_EventTPCnvDict.h:42
PMonSD::StepWrapper::nComps
virtual unsigned nComps() const =0
PlotCalibFromCool.begin
begin
Definition: PlotCalibFromCool.py:94
PMonSD::CompDataStdSteps::index_evt
static constexpr int index_evt
Definition: SemiDetMisc.h:182
PMonSD::Meas::m_unused
bool m_unused
Definition: SemiDetMisc.h:105
ALFA_EventTPCnv_Dict::t1
std::vector< ALFA_RawDataCollection_p1 > t1
Definition: ALFA_EventTPCnvDict.h:43
skel.it
it
Definition: skel.GENtoEVGEN.py:423
PMonSD::CompDataStdSteps::index_other
static constexpr int index_other
Definition: SemiDetMisc.h:181
PMonSD::CompDataExtended::addPointStop
void addPointStop(Meas &, unsigned val_nevts)
Definition: SemiDetMisc.h:582
PMonSD::StepWrapperStd::getData
const CompDataBasic * getData(const std::string &compName) const
Definition: SemiDetMisc.h:242
PMonSD::get_rss_kb
double get_rss_kb()
Definition: SemiDetMisc.h:473
PMonSD::StepWrapperOther::m_stepName
const std::string m_stepName
Definition: SemiDetMisc.h:300
PMonSD::CompDataBasic::getVal
float getVal(unsigned i) const
Definition: SemiDetMisc.h:133
PerfMon::mallinfo
mallinfo_t mallinfo()
Definition: mallinfo.h:29
PMonSD::CompDataBasic::addPointStart
virtual void addPointStart(const Meas &)
Definition: SemiDetMisc.h:552
UploadAMITag.l
list l
Definition: UploadAMITag.larcaf.py:158
PMonSD::Meas::m_offset_cpu
double m_offset_cpu
Definition: SemiDetMisc.h:103
PMonSD::CompDataExtended::m_max_dmem_ientry
unsigned m_max_dmem_ientry
Definition: SemiDetMisc.h:172
PMonSD::StepWrapperOther::m_itE
MapOtherSteps::const_iterator m_itE
Definition: SemiDetMisc.h:299
PMonSD::CompDataStdSteps::index_1st
static constexpr int index_1st
Definition: SemiDetMisc.h:183
PMonSD::CompDataExtended::maxDeltaVMEM_iEntry
unsigned maxDeltaVMEM_iEntry() const
Definition: SemiDetMisc.h:596
PMonSD::CompDataBasic::meanDeltaMalloc
double meanDeltaMalloc() const
Definition: SemiDetMisc.h:569
PMonSD::CompDataBasic::ival_malloc
static constexpr unsigned ival_malloc
Definition: SemiDetMisc.h:132
PMonSD::CompDataBasic
Definition: SemiDetMisc.h:109
PMonSD::get_vmem_kb
double get_vmem_kb()
Definition: SemiDetMisc.h:472
PMonSD::StepWrapperStd::stepName
const std::string & stepName() const
Definition: SemiDetMisc.h:241
read_hist_ntuple.t
t
Definition: read_hist_ntuple.py:5
PMonSD::system_boot_time_seconds
unsigned long system_boot_time_seconds()
Definition: SemiDetMisc.h:384
PMonSD::get_wall_ms
double get_wall_ms()
Definition: SemiDetMisc.h:628
PMonSD::FastStrCmp::operator()
bool operator()(const std::string &a, const std::string &b) const
Definition: SemiDetMisc.h:195
PMonSD::CompDataBasic::m_tmp_dmal
float m_tmp_dmal
Definition: SemiDetMisc.h:154
PMonSD::Meas::m_offset_malloc
double m_offset_malloc
Definition: SemiDetMisc.h:102
PMonSD::secs_per_jiffy
double secs_per_jiffy()
Definition: SemiDetMisc.h:412
PMonSD::FastStrCmp::operator()
bool operator()(const OtherKey &a, const OtherKey &b) const
Definition: SemiDetMisc.h:202
PMonSD::Meas
Definition: SemiDetMisc.h:55
PMonSD::CompDataExtended::addPointStart
void addPointStart(const Meas &)
Definition: SemiDetMisc.h:576
PMonSD::StepWrapperStd::StepWrapperStd
StepWrapperStd(const char *stepName, const MapStdSteps *m)
Definition: SemiDetMisc.h:234
PMonSD::StepWrapper::getExampleData
const CompDataBasic * getExampleData()
Definition: SemiDetMisc.h:222
mergePhysValFiles.end
end
Definition: DataQuality/DataQualityUtils/scripts/mergePhysValFiles.py:93
PMonSD::get_cpu_ms
double get_cpu_ms()
Definition: SemiDetMisc.h:544
PMonSD::OtherKey
std::pair< std::string, std::string > OtherKey
Definition: SemiDetMisc.h:191
PMonSD::CompDataExtended::m_max_dmal
float m_max_dmal
Definition: SemiDetMisc.h:173
PMonSD::cpu_model
std::string cpu_model()
Definition: SemiDetMisc.h:361
PMonSD::StepWrapperOther::StepWrapperOther
StepWrapperOther(const std::string &stepName, const MapOtherSteps *m)
Definition: SemiDetMisc.h:272
PMonSD::envvar
const char * envvar(const char *e, const char *def="")
Definition: SemiDetMisc.h:374
PMonSD::jobstart_jiffy2unix_ms
double jobstart_jiffy2unix_ms(const std::string &s)
Definition: SemiDetMisc.h:426
ATLAS_NOT_THREAD_SAFE
double PMonSD::get_malloc_kb ATLAS_NOT_THREAD_SAFE()
Install fatal handler with default options.
Definition: SemiDetMisc.h:474
PMonSD::Meas::incrementOffsets
void incrementOffsets(double pvmem, double pmalloc, double pcpu, double pwall=0)
Definition: SemiDetMisc.h:88
PMonSD::CompDataBasic::sortVal
double sortVal(unsigned i) const
Definition: SemiDetMisc.h:123
dqt_zlumi_pandas.err
err
Definition: dqt_zlumi_pandas.py:193
PMonSD::get_field
std::string get_field(const char *filename, const std::string &fieldname, char space='_')
Definition: SemiDetMisc.h:318
lumiFormat.i
int i
Definition: lumiFormat.py:92
beamspotman.n
n
Definition: beamspotman.py:731
PMonSD::Meas::mallocDisabled
bool mallocDisabled() const
Definition: SemiDetMisc.h:98
PMonSD::CompDataBasic::addPointStop
virtual void addPointStop(Meas &, unsigned val_nevts=0)
Definition: SemiDetMisc.h:558
PMonSD::CompDataExtended::m_max_dcpu_ientry
unsigned m_max_dcpu_ientry
Definition: SemiDetMisc.h:171
PMonSD::CompDataBasic::nEntries
unsigned nEntries() const
Definition: SemiDetMisc.h:566
file
TFile * file
Definition: tile_monitor.h:29
PMonSD::StepWrapper::getNext
virtual bool getNext(const std::string *&compName, const CompDataBasic *&)=0
PMonSD::CompDataStdSteps
Definition: SemiDetMisc.h:176
PerfMon::mallinfo_t
struct mallinfo mallinfo_t
Definition: mallinfo.h:28
xAOD::uint64_t
uint64_t
Definition: EventInfo_v1.cxx:123
python.xAODType.dummy
dummy
Definition: xAODType.py:4
PMonSD::Meas::last_cpu_raw_ms
double last_cpu_raw_ms()
Definition: SemiDetMisc.h:97
PMonSD::CompDataBasic::m_nentries
unsigned m_nentries
Definition: SemiDetMisc.h:151
xAOD::double
double
Definition: CompositeParticle_v1.cxx:159
PMonSD::CompDataExtended::m_max_dmal_ientry
unsigned m_max_dmal_ientry
Definition: SemiDetMisc.h:173
PMonSD::CompDataExtended::CompDataExtended
CompDataExtended()
Definition: SemiDetMisc.h:570
PMonSD::CompDataExtended::maxDeltaVMEM
double maxDeltaVMEM() const
Definition: SemiDetMisc.h:595
mallinfo.h
Wrappers for mallinfo.
PMonSD::StepWrapperStd::nComps
virtual unsigned nComps() const
Definition: SemiDetMisc.h:260
CxxUtils::atof
double atof(std::string_view str)
Converts a string into a double / float.
Definition: Control/CxxUtils/Root/StringUtils.cxx:91
min
#define min(a, b)
Definition: cfImp.cxx:40
PMonSD::CompDataBasic::setEntries
void setEntries(unsigned n)
Definition: SemiDetMisc.h:140
ReadFromCoolCompare.fd
fd
Definition: ReadFromCoolCompare.py:196
PMonSD
Definition: PerfMonSvc.h:61
PMonSD::StepWrapperOther::iterateReset
void iterateReset()
Definition: SemiDetMisc.h:284
PMonSD::StepWrapperStd
Definition: SemiDetMisc.h:232
PMonSD::CompDataBasic::sortValCPU
double sortValCPU() const
Definition: SemiDetMisc.h:124
PMonSD::StepWrapperOther::nComps
virtual unsigned nComps() const
Definition: SemiDetMisc.h:295
PMonSD::symb2lib
const char * symb2lib(const char *symbol, const char *failstr="unknown")
Definition: SemiDetMisc.h:433
plotBeamSpotMon.b
b
Definition: plotBeamSpotMon.py:77
PMonSD::Meas::ATLAS_NOT_THREAD_SAFE
void capture ATLAS_NOT_THREAD_SAFE(bool cpufirst=true)
Definition: SemiDetMisc.h:61
PMonSD::CompDataStdSteps::index_cbk
static constexpr int index_cbk
Definition: SemiDetMisc.h:186
PMonSD::CompDataExtended::maxDeltaCPU_iEntry
unsigned maxDeltaCPU_iEntry() const
Definition: SemiDetMisc.h:594
PMonSD::CompDataBasic::sortValMemory
double sortValMemory() const
Definition: SemiDetMisc.h:127
PMonSD::StepWrapperStd::getNext
virtual bool getNext(const std::string *&compName, const CompDataBasic *&data)
Definition: SemiDetMisc.h:252
PMonSD::CompDataBasic::~CompDataBasic
virtual ~CompDataBasic()
Definition: SemiDetMisc.h:114
PMonSD::StepWrapperOther::m_map
const MapOtherSteps * m_map
Definition: SemiDetMisc.h:297
PMonSD::Meas::ATLAS_NOT_THREAD_SAFE
void captureIfUnused ATLAS_NOT_THREAD_SAFE()
Definition: SemiDetMisc.h:96
python.LumiBlobConversion.pos
pos
Definition: LumiBlobConversion.py:18
PMonSD::Meas::m_mallocDisabled
bool m_mallocDisabled
Definition: SemiDetMisc.h:106
Trk::open
@ open
Definition: BinningType.h:40
PMonSD::StepWrapper::extended
virtual bool extended() const
Definition: SemiDetMisc.h:221
python.PyAthena.v
v
Definition: PyAthena.py:157
PMonSD::StepWrapper::iterateReset
virtual void iterateReset()=0
PMonSD::CompDataBasic::add
void add(const CompDataBasic &other)
Definition: SemiDetMisc.h:143
PMonSD::CompDataBasic::m_tmp_dmem
float m_tmp_dmem
Definition: SemiDetMisc.h:153
PMonSD::StepWrapper
Definition: SemiDetMisc.h:213
DiTauMassTools::MaxHistStrategyV2::e
e
Definition: PhysicsAnalysis/TauID/DiTauMassTools/DiTauMassTools/HelperFunctions.h:26
PMonSD::StepWrapperOther
Definition: SemiDetMisc.h:270
PMonSD::vmpeak
unsigned vmpeak()
Definition: SemiDetMisc.h:302
a
TList * a
Definition: liststreamerinfos.cxx:10
InDetDD::other
@ other
Definition: InDetDD_Defs.h:16
PMonSD::CompDataBasic::ival_vmem
static constexpr unsigned ival_vmem
Definition: SemiDetMisc.h:131
SCT_ConditionsAlgorithms::CoveritySafe::getenv
std::string getenv(const std::string &variableName)
get an environment variable
Definition: SCT_ConditionsUtilities.cxx:17
CaloSwCorrections.time
def time(flags, cells_name, *args, **kw)
Definition: CaloSwCorrections.py:242
PMonSD::Meas::malloc
double malloc
Definition: SemiDetMisc.h:57
PMonSD::Meas::m_offset_vmem
double m_offset_vmem
Definition: SemiDetMisc.h:101
PMonSD::CompDataBasic::nvals
static constexpr unsigned nvals
Definition: SemiDetMisc.h:129
PMonSD::CompDataBasic::m_tmp_dcpu
float m_tmp_dcpu
Definition: SemiDetMisc.h:152
PMonSD::StepWrapperOther::m_it
MapOtherSteps::const_iterator m_it
Definition: SemiDetMisc.h:298
PMonSD::StepWrapperStd::m_stepName
const std::string m_stepName
Definition: SemiDetMisc.h:266
PMonSD::CompDataBasic::sortValVMEM
double sortValVMEM() const
Definition: SemiDetMisc.h:125
PMonSD::bogomips
int bogomips()
Definition: SemiDetMisc.h:367
PMonSD::StepWrapperStd::m_it
MapStdSteps::const_iterator m_it
Definition: SemiDetMisc.h:264
PMonSD::get_vmem_rss_kb
void get_vmem_rss_kb(double &vmem, double &rss, bool vmemonly=false)
Definition: SemiDetMisc.h:447
PMonSD::CompDataBasic::meanDeltaCPU
double meanDeltaCPU() const
Definition: SemiDetMisc.h:567
convertTimingResiduals.offset
offset
Definition: convertTimingResiduals.py:71
PMonSD::CompDataBasic::CompDataBasic
CompDataBasic()
Definition: SemiDetMisc.h:545
CaloCellTimeCorrFiller.filename
filename
Definition: CaloCellTimeCorrFiller.py:24
PMonSD::CompDataExtended::maxDeltaMalloc_iEntry
unsigned maxDeltaMalloc_iEntry() const
Definition: SemiDetMisc.h:598
CxxUtils::atoi
int atoi(std::string_view str)
Helper functions to unpack numbers decoded in string into integers and doubles The strings are requir...
Definition: Control/CxxUtils/Root/StringUtils.cxx:85
PMonSD::CompDataBasic::ival_cpu
static constexpr unsigned ival_cpu
Definition: SemiDetMisc.h:130
PMonSD::Meas::unused
bool unused() const
Definition: SemiDetMisc.h:95
PMonSD::CompDataExtended::maxDeltaMalloc
double maxDeltaMalloc() const
Definition: SemiDetMisc.h:597
PMonSD::CompDataStdSteps::data_evt
CompDataExtended data_evt
Definition: SemiDetMisc.h:177
PMonSD::MapStdSteps
std::map< std::string, CompDataStdSteps, FastStrCmp > MapStdSteps
Definition: SemiDetMisc.h:208
PMonSD::CompDataStdSteps::index
static int index(const std::string &stepName)
Definition: SemiDetMisc.h:599
checker_macros.h
Define macros for attributes used to control the static checker.
PMonSD::CompDataBasic::m_sum_dmal
float m_sum_dmal
Definition: SemiDetMisc.h:154
python.compressB64.c
def c
Definition: compressB64.py:93
PMonSD::CompDataExtended::m_max_dmem
float m_max_dmem
Definition: SemiDetMisc.h:172
PMonSD::Meas::m_offset_wall
double m_offset_wall
Definition: SemiDetMisc.h:104
PMonSD::CompDataBasic::m_sum_dcpu
float m_sum_dcpu
Definition: SemiDetMisc.h:152
PMonSD::StepWrapperStd::m_itE
MapStdSteps::const_iterator m_itE
Definition: SemiDetMisc.h:265
PMonSD::StepWrapperStd::iterateReset
virtual void iterateReset()
Definition: SemiDetMisc.h:251
PMonSD::envvar_is_set
bool envvar_is_set(const char *e)
Definition: SemiDetMisc.h:379
PMonSD::StepWrapperStd::m_idx
int m_idx
Definition: SemiDetMisc.h:267
PMonSD::CompDataBasic::m_sum_dmem
float m_sum_dmem
Definition: SemiDetMisc.h:153
PMonSD::CompDataExtended::maxDeltaCPU
double maxDeltaCPU() const
Definition: SemiDetMisc.h:593
PMonSD::StepWrapperOther::getNext
bool getNext(const std::string *&compName, const CompDataBasic *&data)
Definition: SemiDetMisc.h:285
PMonSD::CompDataExtended
Definition: SemiDetMisc.h:157
PMonSD::Meas::wall
double wall
Definition: SemiDetMisc.h:59
PMonSD::CompDataStdSteps::data
CompDataBasic data[4]
Definition: SemiDetMisc.h:178
PMonSD::clock_nooverflow
int64_t clock_nooverflow()
Definition: SemiDetMisc.h:523