]> git.uio.no Git - u/mrichter/AliRoot.git/blame - STEER/STEERBase/AliSysInfo.cxx
Fixed some missing implementations, changed test task to use VV classes. Please,...
[u/mrichter/AliRoot.git] / STEER / STEERBase / AliSysInfo.cxx
CommitLineData
0e8bc704 1/**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3 * *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
6 * *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
15
16
6efecea1 17//
18// Origin: marian.ivanov@cern.ch
19//
20// Make a log file for the CPU and Memory usage
ab557934 21//
22// Principles:
23// Snapshots of the system information are writen to the text log files.
24// Text files were chosen in order to get the ouptu also in case code
25// is crashing.
26// Following information is stored in the log file:
27// TTimeStamp stamp;
28// CpuInfo_t cpuInfo;
29// MemInfo_t memInfo;
30// ProcInfo_t procInfo;
31//
32// Root TSystem is used to retrieve this information:
33// gSystem->GetCpuInfo(&cpuInfo, 10);
34// gSystem->GetMemInfo(&memInfo);
35// gSystem->GetProcInfo(&procInfo);
36// for details see:
37// http://root.cern.ch/root/html/TUnixSystem.html
38// http://root.cern.ch/root/html/ProcInfo_t.html
39// http://root.cern.ch/root/html/MemInfo_t.html
40// http://root.cern.ch/root/html/CpuInfo_t.html
41// -------------------------------------------------------------------
42// class CpuInfo_t
43// Float_t fIdle cpu idle percentage
44// Float_t fLoad15m cpu load average over 15 m
45// Float_t fLoad1m cpu load average over 1 m
46// Float_t fLoad5m cpu load average over 5 m
47// Float_t fSys cpu sys load in percentage
48// Float_t fTotal cpu user+sys load in percentage
49// Float_t fUser cpu user load in percentage
50
51// -------------------------------------------------------------------
52// class ProcInfo_t:
53// Float_t fCpuSys system time used by this process in seconds
54// Float_t fCpuUser user time used by this process in seconds
55// Long_t fMemResident resident memory used by this process in KB
56// Long_t fMemVirtual virtual memory used by this process in KB
57// -------------------------------------------------------------------
58
59
60// The information from the AliSysInfo can be used as measurement
61// of the code quality. Be aware of the limitation induced by
62// using only system info described in the AliSysInfo::Test() function
63//
64// The example usage of the AliSysInfo is shown in the
65// AliSysInfo::Test() example.
66//
6efecea1 67//
ab557934 68//
69//
70// The typical usage in the AliRoot code:
6efecea1 71// Make a set of stamps in the code in the place of interest
72// e.g.
73//
74// AliSysInfo::AddStamp("Start");
75//
76// loader->UnloadRecPoints();
77// AliSysInfo::AddStamp(Form("LRec%s_%d",fgkDetectorName[iDet],eventNr), iDet,1,eventNr);
78//
79
80// The log file can be transformed to the tree - to make a visualization
81// See $ALICE_ROOT/macros/PlotSysInfo.C as an example
82
83
0e8bc704 84#include <Riostream.h>
5d170a72 85//#include "AliLog.h"
0e8bc704 86#include "TStopwatch.h"
87#include "TSystem.h"
88#include "TTree.h"
a8bc7397 89#include "TFile.h"
0e8bc704 90
91#include "TTimeStamp.h"
92#include "AliSysInfo.h"
cd507f9c 93#include "TBufferFile.h"
0e8bc704 94
6efecea1 95//#include "TMemStatManager.h" //USE IFDEF
96
0e8bc704 97
66b0310c 98using std::endl;
99using std::cout;
100using std::ios_base;
101using std::setprecision;
0e8bc704 102ClassImp(AliSysInfo)
103
104AliSysInfo* AliSysInfo::fInstance=0;
105
106AliSysInfo::AliSysInfo():
107 TObject(),
108 fSysWatch(0),
6efecea1 109 fTimer(0),
d1d8b044 110 fMemStat(0),
111 fCallBackFunc(0),
112 fNCallBack(0)
0e8bc704 113{
114 fTimer = new TStopwatch;
115 fSysWatch = new fstream("syswatch.log", ios_base::out|ios_base::trunc);
6efecea1 116
ab557934 117 //hname/C:sname/C:sec/D:mI.fMemUsed/F:mI.fSwapUsed/F:pI.fMemResident/F:pI.fMemVirtual/F:cI.fUser/F:cI.fSys/F:cI.fCpuUser/F:pI.fCpuSys/F
0e8bc704 118
119
120 (*fSysWatch) <<"hname"<<"/C:" // hname - hostname
121 <<"sname"<<"/C:" // stamp name
6efecea1 122 <<"id0"<<"/I:" // 0 id
123 <<"id1"<<"/I:" // 1 id
124 <<"id2"<<"/I:" // 1 id
02098121 125 <<"id3"<<"/I:" // 1 id
ab557934 126 <<"first"<<"/D:" // first stamp
0e8bc704 127 //
ab557934 128 <<"stampSec"<<"/D:" // time - time stamp in seconds
129 <<"mi.fMemUsed"<<"/D:" // system info
130 <<"mi.fSwapUsed"<<"/D:" //
131 <<"cI.fUser"<<"/D:" //
132 <<"cI.fSys"<<"/D:" //
62d0bd6a 133 <<"cI.fLoad1m"<<"/D:" //
134 <<"cI.fLoad5m"<<"/D:" //
135 <<"cI.fLoad15m"<<"/D:" //
0e8bc704 136 //
ab557934 137 <<"pI.fMemResident"<<"/D:" // process info
138 <<"pI.fMemVirtual"<<"/D:" //
139 <<"pI.fCpuUser"<<"/D:" //
140 <<"pI.fCpuSys"<<"/D:" //
0e8bc704 141 //
ab557934 142 <<"stampOldSec"<<"/D:" // time - time stamp in seconds
143 <<"miOld.fMemUsed"<<"/D:" // system info - previous
144 <<"miOld.fSwapUsed"<<"/D:" //
145 <<"cIOld.fUser"<<"/D:" //
146 <<"cIOld.fSys"<<"/D:" //
0e8bc704 147 //
ab557934 148 <<"pIOld.fMemResident"<<"/D:" // process info -previous
149 <<"pIOld.fMemVirtual"<<"/D:" //
150 <<"pIOld.fCpuUser"<<"/D:" //
a8bc7397 151 <<"pIOld.fCpuSys"<<"/D:" //
152 //
153 <<"fileBytesRead"<<"/D:" // file IO information
154 <<"fileBytesWritten"<<"/D:" //
155 <<"fileCounter"<<"/D:" //
156 <<"fileReadCalls"<<"/D" //
0e8bc704 157 << endl;
158
159}
160
161
162
163
164AliSysInfo * AliSysInfo::Instance(){
165 //
166 //
167 //
168 if (!fInstance){
169 fInstance = new AliSysInfo;
170 }
171 return fInstance;
172}
173
174
02098121 175void AliSysInfo::AddStamp(const char *sname, Int_t id0, Int_t id1, Int_t id2, Int_t id3){
0e8bc704 176 //
177 //
178 //
0e8bc704 179 //
0e8bc704 180 TTimeStamp stamp;
181 CpuInfo_t cpuInfo;
182 MemInfo_t memInfo;
183 ProcInfo_t procInfo;
184 gSystem->GetCpuInfo(&cpuInfo, 10);
185 gSystem->GetMemInfo(&memInfo);
186 gSystem->GetProcInfo(&procInfo);
ab557934 187 // procInfo.fMemVirtual/=1024; //size in MBy
188 //procInfo.fMemResident/=1024; //size in MBy
d1d8b044 189
0e8bc704 190 const char * hname = gSystem->HostName();
191
192 static Int_t entry=0;
ab557934 193 static Double_t first=stamp.GetSec()+stamp.GetNanoSec()/1000000000.;
0e8bc704 194 //
195 static TTimeStamp stampOld;
196 static CpuInfo_t cpuInfoOld;
197 static MemInfo_t memInfoOld;
198 static ProcInfo_t procInfoOld;
a8bc7397 199 Double_t fileBytesRead = TFile::GetFileBytesRead();
200 Double_t fileBytesWritten = TFile::GetFileBytesWritten();
201 Double_t fileCounter = TFile::GetFileCounter();
202 Double_t fileReadCalls = TFile::GetFileReadCalls();
0e8bc704 203
204
ab557934 205 (*(Instance()->fSysWatch))
206 << hname <<"\t" // hname - hostname
207 << sname <<"\t" // stamp name
208 << id0 <<"\t"
209 << id1 <<"\t"
210 << id2 <<"\t"
02098121 211 << id3 <<"\t"
ab557934 212 <<setprecision(15)<< first <<"\t" // first stamp
0e8bc704 213 //
ab557934 214 <<setprecision(15)<< stamp.GetSec()+stamp.GetNanoSec()/1000000000.<<"\t" // time - time stamp in seconds
215 << memInfo.fMemUsed<<"\t" // system info
216 << memInfo.fSwapUsed<<"\t" //
217 << cpuInfo.fUser <<"\t" //
218 << cpuInfo.fSys <<"\t" //
62d0bd6a 219 << cpuInfo.fLoad1m <<"\t" //
220 << cpuInfo.fLoad5m <<"\t" //
221 << cpuInfo.fLoad15m <<"\t" //
ab557934 222 //
223 <<setprecision(15)<< procInfo.fMemResident/1024.<<"\t" // process info
224 <<setprecision(15)<< procInfo.fMemVirtual/1024.<<"\t" //
225 << procInfo.fCpuUser<<"\t" //
226 << procInfo.fCpuSys<<"\t" //
227 //
228 <<setprecision(15)<< stampOld.GetSec()+stampOld.GetNanoSec()/1000000000.<<"\t" // time - time stamp in seconds
229 << memInfoOld.fMemUsed<<"\t" // system info - previous
230 << memInfoOld.fSwapUsed<<"\t" //
231 << cpuInfoOld.fUser <<"\t" //
232 << cpuInfoOld.fSys <<"\t" //
233 //
234 <<setprecision(15)<< procInfoOld.fMemResident/1024.<<"\t" // process info -previous
235 <<setprecision(15)<< procInfoOld.fMemVirtual/1024.<<"\t" //
236 << procInfoOld.fCpuUser<<"\t" //
237 << procInfoOld.fCpuSys<<"\t" //
a8bc7397 238 //
239 <<fileBytesRead<<"\t" // file IO information
240 <<fileBytesWritten<<"\t" //
241 <<fileCounter<<"\t" //
242 <<fileReadCalls<<"\t" //
ab557934 243 << endl;
244
0e8bc704 245 stampOld = stamp;
246 cpuInfoOld = cpuInfo;
247 memInfoOld = memInfo;
6efecea1 248 procInfoOld= procInfo;
249
250 // if (fInstance->fMemStat) fInstance->fMemStat->AddStamps(sname);
d1d8b044 251 for (Int_t icallback=0; icallback<Instance()->fNCallBack; icallback++){
252 Instance()->fCallBackFunc[icallback](sname);
253 }
0e8bc704 254 entry++;
255}
256
257
258TTree * AliSysInfo::MakeTree(const char *lname){
259 // char * lname = "syswatch.log"
260 TTree * tree = new TTree;
261 tree->ReadFile(lname);
262 tree->SetAlias("deltaT","stampSec-stampOldSec");
6efecea1 263 tree->SetAlias("T","stampSec-first");
d1d8b044 264 tree->SetAlias("deltaVM","(pI.fMemVirtual-pIOld.fMemVirtual)");
265 tree->SetAlias("VM","pI.fMemVirtual");
0e8bc704 266 return tree;
267}
268
6efecea1 269
270Bool_t AliSysInfo::Contain(const char * str1, const char * str2){
271 //
272 //
273 //
274 TString str(str1);
275 return str.Contains(str2);
276}
277
278
279
280void AliSysInfo::OpenMemStat(){
281 //
282 //
283 //
284 //USE IFDEF if MEMSTAT ENABLED
285 // Instance()->fMemStat = TMemStatManager::GetInstance();
286 // Instance()->fMemStat->SetAutoStamp(10000000, 10000000,1000000);
287 // Instance()->fMemStat->Enable();
288}
289
290void AliSysInfo::CloseMemStat(){
291 //
292 //
293 //
294 //USE IFDEF if MEMSTAT ENABLED
295 //if (Instance()->fMemStat == TMemStatManager::GetInstance()) Instance()->fMemStat->Close();
296 //Instance()->fMemStat=0;
297}
d1d8b044 298
299
300
301void AliSysInfo::AddCallBack(StampCallback_t callback){
302 //
303 // add cal back function
304 //
305 AliSysInfo *info = Instance();
306 if (!info->fCallBackFunc)
307 info->fCallBackFunc = new StampCallback_t[100];
308 info->fCallBackFunc[info->fNCallBack]=callback;
309 info->fNCallBack++;
310}
ab557934 311
312
313
314TTree* AliSysInfo::Test(){
315 //
316 // Test example for AliSysInfo:
317 // 1. Make huge memory leak
318 // 2. Slow down execution
319 /*
320 To use the test:
321 TTree * tree = AliSysInfo::Test();
322 // Make alias what we set as input
323 tree->SetAlias("deltaVMIn","(id0*100000+id1*10000+id2*1000)/1000000.")
324 tree->SetAlias("deltaVM","(pI.fMemVirtual-pIOld.fMemVirtual)");
325 tree->SetAlias("deltaTIn","(id1+id0*10)");
326 tree->SetAlias("deltaT","stampSec-stampOldSec");
327 //
328 tree->SetMarkerStyle(23); tree->SetMarkerSize(0.5);
329 // Memory usage
330 tree->Draw("deltaVM:deltaVMIn","Entry$>0");
331 // or alternative
332 tree->Draw("deltaVM:deltaVMIn","Entry$>0","prof");
333 //
334 // draw time usage
335 tree->Draw("deltaT:deltaTIn","Entry$>0");
336 */
337 //
338 // The delta of VM as obtained from the AliSysInfo starts to be proportional
339 // to the input allocation after 0.12 MBy (and it is system dependent)
340 // Bellow these limit the deltaVM can be used only in mean.
341 // (compare first and profile histogram)
342 for (Int_t id0=0; id0<5; id0++)
343 for (Int_t id1=1; id1<10; id1++)
344 for (Int_t id2=0; id2<20; id2++){
345 new Char_t[id2*1000+id1*10000+id0*100000]; // emulate memory leak
346 gSystem->Sleep(id1+id0*10); // emulate CPU usage
347 AliSysInfo::AddStamp("Leak",id0,id1,id2);
348 }
349 TTree * tree = AliSysInfo::MakeTree("syswatch.log");
350 return tree;
351}
cd507f9c 352
353Double_t AliSysInfo::EstimateObjectSize(TObject* object){
354 //
355 // Estimate size of object as represented in the memory size in bytes
356 // Warnings:
357 // 1. Only data memebrs which are persistent are counted
358 // 2. Local copy of the object is temporary created in memory
359 // 3. Do not use it in standard programs, time and memory consument procedure
360 //
361 if (!object) return 0;
362 TBufferFile * file = new TBufferFile(TBuffer::kWrite);
363 file->WriteObject(object);
364 Double_t size=file->Length();
365 delete file;
366 return size;
367}