53 TPerfEvent::TPerfEvent(TTimeStamp *offset)
54 : fEvtNode(
"-3"), fType(TVirtualPerfStats::kUnDefined), fSlave(),
55 fEventsProcessed(0), fBytesRead(0), fLen(0), fLatency(0.0), fProcTime(0.0), fCpuTime(0.0),
56 fIsStart(kFALSE), fIsOk(kFALSE)
58 if (gProofServ != 0) {
59 fEvtNode = gProofServ->GetOrdinal();
61 if (gProof && gProof->IsLite())
68 fTimeStamp = TTimeStamp(fTimeStamp.GetSec() - offset->GetSec(),
69 fTimeStamp.GetNanoSec() - offset->GetNanoSec());
77 Int_t TPerfEvent::Compare(
const TObject *obj)
const
79 const TPerfEvent *pe =
dynamic_cast<const TPerfEvent*
>(obj);
82 Error(
"Compare",
"input is not a TPerfEvent object");
86 if (fTimeStamp < pe->fTimeStamp) {
88 }
else if (fTimeStamp == pe->fTimeStamp) {
98 void TPerfEvent::Print(Option_t *)
const
101 if (fEvtNode == -2) {
102 where =
"TPerfEvent: StandAlone ";
103 }
else if ( fEvtNode == -1 ) {
104 where =
"TPerfEvent: Master ";
106 where.Form(
"TPerfEvent: Worker %s ", fEvtNode.Data());
108 Printf(
"%s %s %f", where.Data(),
109 TVirtualPerfStats::EventType(fType), double(fTimeStamp));
112 Long_t TPerfStats::fgVirtMemMax = -1;
113 Long_t TPerfStats::fgResMemMax = -1;
118 TPerfStats::TPerfStats(TList *input, TList *output)
119 : fTrace(0), fPerfEvent(0), fPacketsHist(0), fProcPcktHist(0),
120 fEventsHist(0), fNodeHist(0), fLatencyHist(0),
121 fProcTimeHist(0), fCpuTimeHist(0), fBytesRead(0),
122 fTotCpuTime(0.), fTotBytesRead(0), fTotEvents(0), fNumEvents(0),
123 fSlaves(0), fDoHist(kFALSE),
124 fDoTrace(kFALSE), fDoTraceRate(kFALSE), fDoSlaveTrace(kFALSE), fDoQuota(kFALSE),
125 fMonitorPerPacket(kFALSE), fMonSenders(3),
126 fDataSet(
"+++none+++"), fDataSetSize(-1), fOutput(output)
128 TProof *proof = (gProofServ) ? gProofServ->GetProof() : gProof;
131 Bool_t isMaster = ((proof && proof->TestBit(TProof::kIsMaster)) ||
132 (gProofServ && gProofServ->IsMaster())) ? kTRUE : kFALSE;
133 Bool_t isEndMaster = ((gProofServ && gProofServ->IsEndMaster()) ||
134 (proof && proof->IsLite())) ? kTRUE : kFALSE;
137 Bool_t deletel = kFALSE;
138 TParameter<Int_t> *dyns = (TParameter<Int_t> *) input->FindObject(
"PROOF_DynamicStartup");
142 Int_t nwrks = dyns->GetVal();
145 for (Int_t i = 0; i < nwrks; i++) {
146 TSlaveInfo *wi =
new TSlaveInfo(TString::Format(
"0.%d", i));
147 wi->SetStatus(TSlaveInfo::kActive);
154 if (!l) l = proof ? proof->GetListOfSlaveInfos() : 0 ;
156 TIter nextslaveinfo(l);
157 while (TSlaveInfo *si = dynamic_cast<TSlaveInfo*>(nextslaveinfo()))
158 if (si->fStatus == TSlaveInfo::kActive) fSlaves++;
160 PDB(kMonitoring,1) Info("TPerfStats", "Statistics for %d slave(s)", fSlaves);
162 fDoHist = (input->FindObject("PROOF_StatsHist") != 0);
163 fDoTrace = (input->FindObject("PROOF_StatsTrace") != 0);
164 fDoTraceRate = (input->FindObject("PROOF_RateTrace") != 0);
165 fDoSlaveTrace = (input->FindObject("PROOF_SlaveStatsTrace") != 0);
167 Info("TPerfStats", "master:%d hist:%d,trace:%d,rate:%d,wrktrace:%d",
168 isMaster, fDoHist, fDoTrace, fDoTraceRate, fDoSlaveTrace);
171 Int_t perpacket = -1;
172 if (TProof::GetParameter(input, "PROOF_MonitorPerPacket", perpacket) != 0) {
174 perpacket = gEnv->GetValue(
"Proof.MonitorPerPacket", 0);
176 fMonitorPerPacket = (perpacket == 1) ? kTRUE : kFALSE;
177 if (fMonitorPerPacket)
178 Info(
"TPerfStats",
"sending full information after each packet");
184 if (!strncmp(o->ClassName(),
"TDSet", strlen(
"TDSet")))
break;
187 fDataSetSize = fDSet->GetNumOfFiles();
188 if (fDataSetSize > 0) {
190 TString grus = (gProofServ) ? TString::Format(
"/%s/%s/", gProofServ->GetGroup(),
191 gProofServ->GetUser()) : TString(
"");
192 TString dss = fDSet->GetName(), ds;
193 Ssiz_t fd = 0, nq = kNPOS;
194 while (dss.Tokenize(ds, fd,
"[,| ]")) {
195 if ((nq = ds.Index(
"?")) != kNPOS) ds.Remove(nq);
196 ds.ReplaceAll(grus,
"");
197 if (!fDataSet.IsNull()) fDataSet +=
",";
204 fDataSetLen = gEnv->GetValue(
"Proof.Monitor.DataSetLen", 512);
205 if (fDataSetLen != 512)
206 Info(
"TPerfStats",
"dataset string length truncated to %d chars", fDataSetLen);
207 if (fDataSet.Length() > fDataSetLen) fDataSet.Resize(fDataSetLen);
210 Info("TPerfStats", "dataset: '%s',
# files: %d", fDataSet.Data(), fDataSetSize);
212 if ((isMaster && (fDoTrace || fDoTraceRate)) || (!isMaster && fDoSlaveTrace)) {
214 gDirectory->RecursiveRemove(gDirectory->FindObject(
"PROOF_PerfStats"));
215 fTrace =
new TTree(
"PROOF_PerfStats",
"PROOF Statistics");
216 fTrace->SetDirectory(0);
217 fTrace->Bronch(
"PerfEvents",
"TPerfEvent", &fPerfEvent, 64000, 0);
220 Info("TPerfStats", "tree '%s' added to the output list", fTrace->GetName());
223 if (fDoHist && isEndMaster) {
225 Double_t time_per_bin = 1e-3;
226 Double_t min_time = 0;
227 Int_t ntime_bins = 1000;
229 gDirectory->RecursiveRemove(gDirectory->FindObject(
"PROOF_PacketsHist"));
230 fPacketsHist =
new TH1D(
"PROOF_PacketsHist",
"Packets processed per Worker",
231 fSlaves, 0, fSlaves);
232 fPacketsHist->SetFillColor(kCyan);
233 fPacketsHist->SetDirectory(0);
234 fPacketsHist->SetMinimum(0);
235 output->Add(fPacketsHist);
237 Info("TPerfStats", "histo '%s' added to the output list", fPacketsHist->GetName());
239 gDirectory->RecursiveRemove(gDirectory->FindObject("PROOF_ProcPcktHist"));
240 fProcPcktHist = new TH1I("PROOF_ProcPcktHist", "Packets being processed per Worker",
241 fSlaves, 0, fSlaves);
242 fProcPcktHist->SetFillColor(kRed);
243 fProcPcktHist->SetDirectory(0);
244 fProcPcktHist->SetMinimum(0);
245 output->Add(fProcPcktHist);
247 Info("TPerfStats", "histo '%s' added to the output list", fProcPcktHist->GetName());
249 gDirectory->RecursiveRemove(gDirectory->FindObject("PROOF_EventsHist"));
250 fEventsHist = new TH1D("PROOF_EventsHist", "Events processed per Worker",
251 fSlaves, 0, fSlaves);
252 fEventsHist->SetFillColor(kGreen);
253 fEventsHist->SetDirectory(0);
254 fEventsHist->SetMinimum(0);
255 output->Add(fEventsHist);
257 Info("TPerfStats", "histo '%s' added to the output list", fEventsHist->GetName());
259 gDirectory->RecursiveRemove(gDirectory->FindObject("PROOF_NodeHist"));
260 fNodeHist = new TH1D("PROOF_NodeHist", "Slaves per Fileserving Node",
261 fSlaves, 0, fSlaves);
262 fNodeHist->SetDirectory(0);
263 fNodeHist->SetMinimum(0);
264 fNodeHist->SetCanExtend(TH1::kAllAxes);
265 output->Add(fNodeHist);
267 Info("TPerfStats", "histo '%s' added to the output list", fNodeHist->GetName());
269 gDirectory->RecursiveRemove(gDirectory->FindObject("PROOF_LatencyHist"));
270 fLatencyHist = new TH2D("PROOF_LatencyHist", "GetPacket Latency per Worker",
272 ntime_bins, min_time, time_per_bin);
273 fLatencyHist->SetDirectory(0);
274 fLatencyHist->SetMarkerStyle(4);
275 fLatencyHist->SetCanExtend(TH1::kAllAxes);
276 output->Add(fLatencyHist);
278 Info("TPerfStats", "histo '%s' added to the output list", fLatencyHist->GetName());
280 gDirectory->RecursiveRemove(gDirectory->FindObject("PROOF_ProcTimeHist"));
281 fProcTimeHist = new TH2D("PROOF_ProcTimeHist", "Packet Processing Time per Worker",
283 ntime_bins, min_time, time_per_bin);
284 fProcTimeHist->SetDirectory(0);
285 fProcTimeHist->SetMarkerStyle(4);
286 fProcTimeHist->SetCanExtend(TH1::kAllAxes);
287 output->Add(fProcTimeHist);
289 Info("TPerfStats", "histo '%s' added to the output list", fProcTimeHist->GetName());
291 gDirectory->RecursiveRemove(gDirectory->FindObject("PROOF_CpuTimeHist"));
292 fCpuTimeHist = new TH2D("PROOF_CpuTimeHist", "Packet CPU Time per Worker",
294 ntime_bins, min_time, time_per_bin);
295 fCpuTimeHist->SetDirectory(0);
296 fCpuTimeHist->SetMarkerStyle(4);
297 fCpuTimeHist->SetCanExtend(TH1::kAllAxes);
298 output->Add(fCpuTimeHist);
300 Info("TPerfStats", "histo '%s' added to the output list", fCpuTimeHist->GetName());
302 nextslaveinfo.Reset();
304 while (TSlaveInfo *si = dynamic_cast<TSlaveInfo*>(nextslaveinfo())) {
305 if (si->fStatus == TSlaveInfo::kActive) {
306 fPacketsHist->GetXaxis()->SetBinLabel(slavebin, si->GetOrdinal());
307 fProcPcktHist->GetXaxis()->SetBinLabel(slavebin, si->GetOrdinal());
308 fEventsHist->GetXaxis()->SetBinLabel(slavebin, si->GetOrdinal());
309 fNodeHist->GetXaxis()->SetBinLabel(slavebin, si->GetOrdinal());
310 fLatencyHist->GetXaxis()->SetBinLabel(slavebin, si->GetOrdinal());
311 fProcTimeHist->GetXaxis()->SetBinLabel(slavebin, si->GetOrdinal());
312 fCpuTimeHist->GetXaxis()->SetBinLabel(slavebin, si->GetOrdinal());
318 if (deletel)
delete(l);
329 TString mons = gEnv->GetValue(
"ProofServ.Monitoring",
""), mon;
331 TProofMonSender *monSender = 0;
332 while (mons.Tokenize(mon, fmon,
"[,|\\\\]")) {
337 TString tok, sendopts;
339 while (mon.Tokenize(tok, from,
" ")) {
340 if (tok.BeginsWith(
"sendopts:")) {
341 tok.ReplaceAll(
"sendopts:",
"");
349 TPluginHandler *h = 0;
350 if ((h = gROOT->GetPluginManager()->FindHandler(
"TProofMonSender", a[0]))) {
351 if (h->LoadPlugin() != -1) {
353 (TProofMonSender *) h->ExecPlugin(na, a[1].Data(), a[2].Data(), a[3].Data(),
354 a[4].Data(), a[5].Data(), a[6].Data(),
355 a[7].Data(), a[8].Data(), a[9].Data());
356 if (monSender && monSender->TestBit(TObject::kInvalidObject)) SafeDelete(monSender);
357 if (monSender && monSender->SetSendOptions(sendopts) != 0) SafeDelete(monSender);
363 fMonSenders.Add(monSender);
365 Info("TPerfStats", "created monitoring
object: %s -
# of active monitors: %d",
366 mon.Data(), fMonSenders.GetEntries());
377 TPerfStats::~TPerfStats()
380 fMonSenders.SetOwner(kTRUE);
381 fMonSenders.Delete();
387 void TPerfStats::SimpleEvent(EEventType type)
389 if (type == kStop && fPacketsHist != 0) {
390 fPacketsHist->LabelsDeflate(
"X");
391 fPacketsHist->LabelsOption(
"auv",
"X");
394 if (type == kStop && fDoQuota)
397 if (fTrace == 0)
return;
399 TPerfEvent pe(&fTzero);
403 fTrace->SetBranchAddress(
"PerfEvents",&fPerfEvent);
413 void TPerfStats::PacketEvent(
const char *slave,
const char* slavename,
const char* filename,
414 Long64_t eventsprocessed, Double_t latency, Double_t proctime,
415 Double_t cputime, Long64_t bytesRead)
417 if (fDoTrace && fTrace != 0) {
418 TPerfEvent pe(&fTzero);
421 pe.fSlaveName = slavename;
422 pe.fFileName = filename;
424 pe.fEventsProcessed = eventsprocessed;
425 pe.fBytesRead = bytesRead;
426 pe.fLatency = latency;
427 pe.fProcTime = proctime;
428 pe.fCpuTime = cputime;
431 fTrace->SetBranchAddress(
"PerfEvents",&fPerfEvent);
437 Info("PacketEvent","%s: fDoHist: %d, fPacketsHist: %p, eventsprocessed: %lld",
438 slave, fDoHist, fPacketsHist, eventsprocessed);
440 if (fDoHist && fPacketsHist != 0) {
441 fPacketsHist->Fill(slave, 1);
442 fEventsHist->Fill(slave, eventsprocessed);
443 fLatencyHist->Fill(slave, latency, 1);
444 fProcTimeHist->Fill(slave, proctime, 1);
445 fCpuTimeHist->Fill(slave, cputime, 1);
449 fTotCpuTime += cputime;
450 fTotBytesRead += bytesRead;
451 fTotEvents += eventsprocessed;
455 if (!fMonSenders.IsEmpty() && fMonitorPerPacket) {
456 TQueryResult *qr = (gProofServ && gProofServ->GetProof()) ?
457 gProofServ->GetProof()->GetQueryResult() : 0;
458 if (!gProofServ || !gProofServ->GetSessionTag() || !gProofServ->GetProof() || !qr) {
459 Error(
"PacketEvent",
"some required object are undefined (%p %p %p %p)",
460 gProofServ, (gProofServ ? gProofServ->GetSessionTag() : 0),
461 (gProofServ ? gProofServ->GetProof() : 0),
462 ((gProofServ && gProofServ->GetProof()) ? qr : 0));
468 identifier.Form(
"%s-q%d", gProofServ->GetSessionTag(), qr->GetSeqNum());
472 values.Add(
new TParameter<int>(
"id", 0));
473 values.Add(
new TNamed(
"user", gProofServ->GetUser()));
474 values.Add(
new TNamed(
"proofgroup", gProofServ->GetGroup()));
475 values.Add(
new TNamed(
"begin", fTzero.AsString(
"s")));
476 values.Add(
new TNamed(
"end", stop.AsString(
"s")));
477 values.Add(
new TParameter<int>(
"walltime", stop.GetSec()-fTzero.GetSec()));
478 values.Add(
new TParameter<Long64_t>(
"bytesread", fTotBytesRead));
479 values.Add(
new TParameter<Long64_t>(
"events", fTotEvents));
480 values.Add(
new TParameter<Long64_t>(
"totevents", fNumEvents));
481 values.Add(
new TParameter<int>(
"workers", fSlaves));
482 values.Add(
new TNamed(
"querytag", identifier.Data()));
485 TStatus *pst = (fOutput) ? (TStatus *) fOutput->FindObject(
"PROOF_Status") : 0;
487 Long64_t vmxw = (pst) ? (Long64_t) pst->GetVirtMemMax() : -1;
488 Long64_t rmxw = (pst) ? (Long64_t) pst->GetResMemMax() : -1;
489 values.Add(
new TParameter<Long64_t>(
"vmemmxw", vmxw));
490 values.Add(
new TParameter<Long64_t>(
"rmemmxw", rmxw));
492 values.Add(
new TParameter<Long64_t>(
"vmemmxm", (Long64_t) fgVirtMemMax));
493 values.Add(
new TParameter<Long64_t>(
"rmemmxm", (Long64_t) fgResMemMax));
495 values.Add(
new TNamed(
"dataset", fDataSet.Data()));
496 values.Add(
new TParameter<int>(
"numfiles", fDataSetSize));
498 TList *mfls = (fOutput) ? (TList *) fOutput->FindObject(
"MissingFiles") : 0;
499 Int_t nmiss = (mfls && mfls->GetSize() > 0) ? mfls->GetSize() : 0;
500 values.Add(
new TParameter<int>(
"missfiles", nmiss));
502 Int_t est = (pst) ? pst->GetExitStatus() : -1;
503 values.Add(
new TParameter<int>(
"status", est));
505 TString rver = TString::Format(
"%s|%s", gROOT->GetVersion(), gROOT->GetGitCommit());
506 values.Add(
new TNamed(
"rootver", rver.Data()));
508 for (Int_t i = 0; i < fMonSenders.GetEntries(); i++) {
509 TProofMonSender *m = (TProofMonSender *) fMonSenders[i];
512 if (m->SendSummary(&values, identifier) != 0)
513 Error(
"PacketEvent",
"sending of summary info failed (%s)", m->GetName());
515 Warning(
"PacketEvent",
"undefined entry found in monitors array for id: %d", i);
524 void TPerfStats::FileEvent(
const char *slave,
const char *slavename,
const char *nodename,
525 const char *filename, Bool_t isStart)
527 if (fDoTrace && fTrace != 0) {
528 TPerfEvent pe(&fTzero);
531 pe.fSlaveName = slavename;
532 pe.fNodeName = nodename;
533 pe.fFileName = filename;
535 pe.fIsStart = isStart;
538 fTrace->SetBranchAddress(
"PerfEvents",&fPerfEvent);
543 if (fDoHist && fPacketsHist != 0) {
544 fNodeHist->Fill(nodename, isStart ? 1 : -1);
551 void TPerfStats::FileOpenEvent(TFile *file,
const char *filename, Double_t start)
553 if (fDoTrace && fTrace != 0) {
554 TPerfEvent pe(&fTzero);
556 pe.fType = kFileOpen;
557 pe.fFileName = filename;
558 pe.fFileClass = file != 0 ? file->ClassName() :
"none";
559 pe.fProcTime = double(TTimeStamp())-start;
560 pe.fIsOk = (file != 0);
563 fTrace->SetBranchAddress(
"PerfEvents",&fPerfEvent);
572 void TPerfStats::FileReadEvent(TFile *file, Int_t len, Double_t start)
574 if (fDoTrace && fTrace != 0) {
575 TPerfEvent pe(&fTzero);
577 pe.fType = kFileRead;
578 pe.fFileName = file->GetName();
579 pe.fFileClass = file->ClassName();
581 pe.fProcTime = double(TTimeStamp())-start;
584 fTrace->SetBranchAddress(
"PerfEvents",&fPerfEvent);
597 void TPerfStats::UnzipEvent(TObject * , Long64_t ,
607 void TPerfStats::RateEvent(Double_t proctime, Double_t deltatime,
608 Long64_t eventsprocessed, Long64_t bytesRead)
610 if ((fDoTrace || fDoTraceRate) && fTrace != 0) {
611 TPerfEvent pe(&fTzero);
614 pe.fEventsProcessed = eventsprocessed;
615 pe.fBytesRead = bytesRead;
616 pe.fProcTime = proctime;
617 pe.fLatency = deltatime;
620 fTrace->SetBranchAddress(
"PerfEvents",&fPerfEvent);
629 void TPerfStats::SetBytesRead(Long64_t num)
637 Long64_t TPerfStats::GetBytesRead()
const
648 void TPerfStats::WriteQueryLog()
653 if (!fMonSenders.IsEmpty()) {
654 TQueryResult *qr = (gProofServ && gProofServ->GetProof()) ?
655 gProofServ->GetProof()->GetQueryResult() : 0;
656 if (!gProofServ || !gProofServ->GetSessionTag() || !gProofServ->GetProof() || !qr) {
657 Error(
"WriteQueryLog",
"some required object are undefined (%p %p %p %p)",
658 gProofServ, (gProofServ ? gProofServ->GetSessionTag() : 0),
659 (gProofServ ? gProofServ->GetProof() : 0),
660 ((gProofServ && gProofServ->GetProof()) ? qr : 0));
665 identifier.Form(
"%s-q%d", gProofServ->GetSessionTag(), qr->GetSeqNum());
669 values.Add(
new TParameter<int>(
"id", 0));
670 values.Add(
new TNamed(
"user", gProofServ->GetUser()));
671 values.Add(
new TNamed(
"proofgroup", gProofServ->GetGroup()));
672 values.Add(
new TNamed(
"begin", fTzero.AsString(
"s")));
673 values.Add(
new TNamed(
"end", stop.AsString(
"s")));
674 values.Add(
new TParameter<int>(
"walltime", stop.GetSec()-fTzero.GetSec()));
675 values.Add(
new TParameter<float>(
"cputime", fTotCpuTime));
676 values.Add(
new TParameter<Long64_t>(
"bytesread", fTotBytesRead));
677 values.Add(
new TParameter<Long64_t>(
"events", fTotEvents));
678 values.Add(
new TParameter<Long64_t>(
"totevents", fTotEvents));
679 values.Add(
new TParameter<int>(
"workers", fSlaves));
680 values.Add(
new TNamed(
"querytag", identifier.Data()));
682 TList *mfls = (fOutput) ? (TList *) fOutput->FindObject(
"MissingFiles") : 0;
684 TStatus *pst = (fOutput) ? (TStatus *) fOutput->FindObject(
"PROOF_Status") : 0;
685 Long64_t vmxw = (pst) ? (Long64_t) pst->GetVirtMemMax() : -1;
686 Long64_t rmxw = (pst) ? (Long64_t) pst->GetResMemMax() : -1;
687 values.Add(
new TParameter<Long64_t>(
"vmemmxw", vmxw));
688 values.Add(
new TParameter<Long64_t>(
"rmemmxw", rmxw));
690 values.Add(
new TParameter<Long64_t>(
"vmemmxm", (Long64_t) fgVirtMemMax));
691 values.Add(
new TParameter<Long64_t>(
"rmemmxm", (Long64_t) fgResMemMax));
693 values.Add(
new TNamed(
"dataset", fDataSet.Data()));
694 values.Add(
new TParameter<int>(
"numfiles", fDataSetSize));
696 Int_t nmiss = (mfls && mfls->GetSize() > 0) ? mfls->GetSize() : 0;
697 values.Add(
new TParameter<int>(
"missfiles", nmiss));
699 Int_t est = (pst) ? pst->GetExitStatus() : -1;
700 values.Add(
new TParameter<int>(
"status", est));
702 TString rver = TString::Format(
"%s|%s", gROOT->GetVersion(), gROOT->GetGitCommit());
703 values.Add(
new TNamed(
"rootver", rver.Data()));
705 for (Int_t i = 0; i < fMonSenders.GetEntries(); i++) {
706 TProofMonSender *m = (TProofMonSender *) fMonSenders[i];
709 if (m->SendSummary(&values, identifier) != 0)
710 Error(
"WriteQueryLog",
"sending of summary info failed (%s)", m->GetName());
712 if (m->SendDataSetInfo(fDSet, mfls, fTzero.AsString(
"s"), identifier) != 0)
713 Error(
"WriteQueryLog",
"sending of dataset info failed (%s)", m->GetName());
715 if (m->SendFileInfo(fDSet, mfls, fTzero.AsString(
"s"), identifier) != 0)
716 Error(
"WriteQueryLog",
"sending of files info failed (%s)", m->GetName());
718 Warning(
"WriteQueryLog",
"undefined entry found in monitors array for id: %d", i);
727 void TPerfStats::Setup(TList *input)
730 const char *tags[ntags] = {
"StatsHist",
"StatsTrace",
"SlaveStatsTrace"};
732 TString varname, parname;
733 for (Int_t i=0; i<ntags; i++) {
734 varname.Form(
"Proof.%s", tags[i]);
735 parname.Form(
"PROOF_%s", tags[i]);
736 if (!input->FindObject(parname))
737 if (gEnv->GetValue(varname, 0)) input->Add(
new TNamed(parname.Data(),
""));
744 void TPerfStats::Start(TList *input, TList *output)
750 TPerfStats::SetMemValues();
752 gPerfStats =
new TPerfStats(input, output);
753 if (gPerfStats && !gPerfStats->TestBit(TObject::kInvalidObject)) {
755 gPerfStats->SimpleEvent(TVirtualPerfStats::kStart);
757 SafeDelete(gPerfStats);
764 void TPerfStats::Stop()
766 if (!gPerfStats)
return;
768 TPerfStats::SetMemValues();
769 gPerfStats->SimpleEvent(TVirtualPerfStats::kStop);
778 void TPerfStats::SetMemValues()
781 if (!gSystem->GetProcInfo(&pi)){
782 if (pi.fMemVirtual > fgVirtMemMax) fgVirtMemMax = pi.fMemVirtual;
783 if (pi.fMemResident > fgResMemMax) fgResMemMax = pi.fMemResident;
790 void TPerfStats::GetMemValues(Long_t &vmax, Long_t &rmax)