38 #include <sys/types.h>
66 void *MeterRun(
void *carg)
71 void *MeterRunFS(
void *carg)
76 void *MeterRunPM(
void *carg)
122 if (monpgm) free(monpgm);
131 uint32_t pmem, uint32_t ppag)
133 if (pcpu > 100) pcpu = 100;
134 if (pio > 100) pio = 100;
135 if (pload > 100) pload = 100;
136 if (pmem > 100) pmem = 100;
137 if (ppag > 100) ppag = 100;
150 if (pdsk > 100) pdsk = 100;
165 {
if (Virtual ==
peerFS) {tot_util = 0;
return 0x7fffffff;}
166 if (VirtUpdt) UpdtSpace();
180 if (fsavail >> 31LL) fsavail = 0x7fffffff;
184 return static_cast<int>(fsavail);
195 char buff[1024], sfx1, sfx2, sfx3;
196 long maxfree, totfree, totDisk;
202 {
Say.
Emsg(
"Meter", rc,
"calculate file system space");
205 else if (!(fs_nums = vsInfo.
Extents))
206 {
Say.
Emsg(
"Meter",
"Warning! No writable filesystems found.");
209 else {dsk_tot = vsInfo.
Total >> 20LL;
210 dsk_lpn = vsInfo.
Large >> 20LL;
217 Say.
Emsg(
"Meter",
"Write access and staging prohibited.");
225 MinStype= Scale(MinFree, MinShow);
228 HWMStype= Scale(HWMFree, HWMShow);
234 if ((noSpace = (dsk_maxf < MinFree)) && !
Config.
asSolo())
237 Say.
Emsg(
"Meter", rc,
"start filesystem meter.");
241 sfx1 = Scale(dsk_maxf, maxfree);
242 sfx2 = Scale(dsk_tot, totDisk);
243 sfx3 = Scale(dsk_free, totfree);
244 sprintf(buff,
"Found %d filesystem(s); %ld%cB total (%d%% util);"
245 " %ld%cB free (%ld%cB max)", fs_nums, totDisk, sfx2,
246 dsk_util, totfree, sfx3, maxfree, sfx1);
249 {sprintf(buff,
"%ld%cB minimum", MinShow, MinStype);
250 Say.
Emsg(
"Meter",
"Warning! Available space <", buff);
265 mp = monpgm = strdup(pgm);
266 while(*mp && *mp !=
' ') mp++;
272 {
Say.
Emsg(
"Meter", errno,
"find executable", monpgm);
279 *mp = pp; monint = itv;
281 Say.
Emsg(
"Meter", rc,
"start performance meter.");
301 {
Say.
Emsg(
"Meter",
"Unable to configure performance monitor plugin.");
310 {
Say.
Emsg(
"Meter", rc,
"start performance meter.");
334 myLoad =
calcLoad(cpu_load,net_load,xeq_load,mem_load,pag_load);
337 {prevLoad = prevLoad - myLoad;
338 if (prevLoad < 0) prevLoad = -prevLoad;
352 int pmem,
int ppag,
int pdsk)
357 temp = cpu_load + cpu_load/2;
358 cpu_load = (cpu_load + (pcpu > temp ? temp : pcpu))/2;
359 temp = net_load + net_load/2;
360 net_load = (net_load + (pnet > temp ? temp : pnet))/2;
361 temp = xeq_load + xeq_load/2;
362 xeq_load = (xeq_load + (pxeq > temp ? temp : pxeq))/2;
363 temp = mem_load + mem_load/2;
364 mem_load = (mem_load + (pmem > temp ? temp : pmem))/2;
365 temp = pag_load + pag_load/2;
366 pag_load = (pag_load + (ppag > temp ? temp : ppag))/2;
375 int &pmem,
int &ppag,
int &pdsk)
381 if (!Virtual && montid && (time(0) - rep_tod > monint*2)) myMeter.
Drain();
387 if (!Running && !Virtual) pcpu = pnet = pmem = ppag = pxeq = 0;
388 else {pcpu = cpu_load; pnet = net_load; pmem = mem_load;
389 ppag = pag_load; pxeq = xeq_load;
404 static const int snoozeTime = 30;
410 {
if (myMeter.
Exec(monpgm) == 0)
412 if (lp)
Say.
Emsg(
"Meter",
"Perf monitor returned invalid output:",lp);
413 else Say.
Emsg(
"Meter",
"Perf monitor died.");
415 Say.
Emsg(
"Meter",
"Restarting monitor:", monpgm);
426 const struct timespec rqtp = {dsk_calc, 0};
428 int mlim = 60/dsk_calc, nowlim = 0;
431 {nanosleep(&rqtp, 0);
433 noNewSpace = dsk_maxf < (noSpace ? HWMFree : MinFree);
434 if (noSpace != noNewSpace)
435 {SpaceMsg(noNewSpace);
436 noSpace = noNewSpace;
439 else if (noSpace && !nowlim) SpaceMsg(noNewSpace);
440 nowlim = (nowlim ? nowlim-1 : mlim);
470 long long fstotal, fsminfr;
475 {
if (Virtual ==
peerFS) {minfree = 0;
return 0x7fffffff;}
476 if (VirtUpdt) UpdtSpace();
488 if (fsminfr >> 31LL) minfree = 0x7fffffff;
489 else minfree =
static_cast<unsigned int>(fsminfr);
490 if (fstotal == 0) fstotal = 1;
491 else if (fstotal >> 31LL) fstotal = 0x7fffffff;
495 return static_cast<unsigned int>(fstotal);
509 n = sscanf(line,
"%u %u %u %u %u",
510 &xeq_load, &cpu_load, &mem_load, &pag_load, &net_load);
522 myLoad =
calcLoad(cpu_load,net_load,xeq_load,mem_load,pag_load);
524 {prevLoad = prevLoad - myLoad;
525 if (prevLoad < 0) prevLoad = -prevLoad;
544 void XrdCmsMeter::calcSpace()
556 for (
int i = 0; i < 3; i++)
558 {
Say.
Emsg(
"Meter", rc,
"calculate file system space");
break;}
559 if (vsInfo.
Total)
break;
565 fsutil = (dsk_tot ? 100-(((vsInfo.
Free >> 20LL)*100)/dsk_tot) : 100);
566 if (fsutil < 0) fsutil = 0;
567 else if (fsutil > 100) fsutil = 100;
573 dsk_maxf = vsInfo.
LFree >> 20LL;
574 dsk_free = vsInfo.
Free >> 20LL;
575 dsk_util =
static_cast<int>(fsutil);
577 if (old_util != dsk_util)
578 TRACE(Space,
"New fs info; maxfree=" <<dsk_maxf
579 <<
"MB utilized=" <<dsk_util <<
"%");
588 char XrdCmsMeter::Scale(
long long inval,
long &outval)
590 const char sfx[] = {
'M',
'G',
'T',
'P'};
593 for (i = 0; i <
sizeof(sfx)-1 && inval > 1024; i++) inval = inval/1024;
595 outval =
static_cast<long>(inval);
603 void XrdCmsMeter::SpaceMsg(
int why)
606 char sfx, buff[1024];
609 sfx = Scale(dsk_maxf, maxfree);
612 {What =
"Insufficient space; ";
614 sprintf(buff,
"%ld%cB available < %ld%cB high watermark",
615 maxfree, sfx, HWMShow, HWMStype);
617 sprintf(buff,
"%ld%cB available < %ld%cB minimum",
618 maxfree, sfx, MinShow, MinStype);
620 What =
" Sufficient space; ";
621 sprintf(buff,
"%ld%cB available > %ld%cB high watermak",
622 maxfree, sfx, HWMShow, HWMStype);
631 void XrdCmsMeter::UpdtSpace()
633 static const SMask_t allNodes(~0);
644 {lastFree = mySpace.
wFree; lastUtil = mySpace.
wUtil;
646 lastFree = mySpace.
sFree; lastUtil = mySpace.
sUtil;
648 dsk_tot =
static_cast<long long>(mySpace.
Total)<<10LL;
649 MinFree = mySpace.
wMinF;
unsigned long long SMask_t
int access(const char *path, int amode)
void Space(XrdCms::SpaceData &sData, SMask_t smask)
bool Update(char *line, bool alert=false)
int Monitor(char *pgm, int itv)
void Record(int pcpu, int pnet, int pxeq, int pmem, int ppag, int pdsk)
int Report(int &pcpu, int &pnet, int &pxeq, int &pmem, int &ppag, int &pdsk)
unsigned int TotalSpace(unsigned int &minfree)
void PutInfo(XrdCmsPerfMon::PerfInfo &perfInfo, bool alert=false)
int FreeSpace(int &tutil)
int calcLoad(uint32_t pcpu, uint32_t pio, uint32_t pload, uint32_t pmem, uint32_t ppag)
static void Report_Usage(XrdLink *lp)
virtual void GetInfo(PerfInfo &info)
virtual bool Configure(const char *cfn, char *Parms, XrdSysLogger &Logger, XrdCmsPerfMon &cmsMon, XrdOucEnv *EnvInfo, bool isCMS)
void Update(StateType StateT, int ActivVal, int StageVal=0)
static XrdCmsPerfMon * loadPerfMon(XrdSysError *eDest, const char *libPath, XrdVersionInfo &urVer)
Load the performance monitor plugin.
virtual int StatVS(XrdOssVSInfo *vsP, const char *sname=0, int updt=0)
int Exec(const char *, int inrd=0, int efd=0)
int Emsg(const char *esfx, int ecode, const char *text1, const char *text2=0)
XrdSysLogger * logger(XrdSysLogger *lp=0)
static int Run(pthread_t *, void *(*proc)(void *), void *arg, int opts=0, const char *desc=0)
static int Kill(pthread_t tid)
static void Snooze(int seconds)
Structure used for reporting performance metrics.
unsigned char pag_load
Paging 0 to 100 utilization.
unsigned char xeq_load
Other 0 to 100 utilization (arbitrary)
unsigned char cpu_load
CPU 0 to 100 utilization.
unsigned char mem_load
Memory 0 to 100 utilization.
unsigned char net_load
Network 0 to 100 utilization.