Changeset: a8556e9e6991 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=a8556e9e6991
Modified Files:
clients/Tests/exports.stable.out
monetdb5/mal/mal_client.c
monetdb5/mal/mal_client.h
monetdb5/mal/mal_dataflow.c
monetdb5/mal/mal_profiler.c
monetdb5/mal/mal_profiler.h
monetdb5/mal/mal_runtime.c
Branch: mal-profiler-resources
Log Message:
Set process resource track on a per client basis instead of global variables.
This avoids potential race conditions while profiling multiple clients.
diffs (truncated from 479 to 300 lines):
diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out
--- a/clients/Tests/exports.stable.out
+++ b/clients/Tests/exports.stable.out
@@ -2515,9 +2515,9 @@ str printRef;
void printSignature(stream *fd, Symbol s, int flg);
void printStack(stream *f, MalBlkPtr mb, MalStkPtr s);
str prodRef;
-void profilerEvent(MalBlkPtr mb, MalStkPtr stk, InstrPtr pci, int start, str
usrname);
+void profilerEvent(MalBlkPtr mb, MalStkPtr stk, InstrPtr pci, int start, str
usrname, void *res_usage);
void profilerGetCPUStat(lng *user, lng *nice, lng *sys, lng *idle, lng
*iowait);
-void profilerHeartbeatEvent(char *alter);
+void profilerHeartbeatEvent(char *alter, void *res_usage);
str profilerRef;
str projectRef;
str projectdeltaRef;
diff --git a/monetdb5/mal/mal_client.c b/monetdb5/mal/mal_client.c
--- a/monetdb5/mal/mal_client.c
+++ b/monetdb5/mal/mal_client.c
@@ -266,6 +266,9 @@ MCinitClientRecord(Client c, oid user, b
c->filetrans = false;
MT_sema_init(&c->s, 0, "Client->s");
+#ifdef HAVE_SYS_RESOURCE_H
+ memset(&(c->res_usage), 0, sizeof(struct rusage));
+#endif
return c;
}
@@ -430,6 +433,9 @@ freeClient(Client c)
c->wlc_kind = 0;
c->wlc = NULL;
MT_sema_destroy(&c->s);
+#ifdef HAVE_SYS_RESOURCE_H
+ memset(&(c->res_usage), 0, sizeof(struct rusage));
+#endif
c->mode = MCshutdowninprogress()? BLOCKCLIENT: FREECLIENT;
}
diff --git a/monetdb5/mal/mal_client.h b/monetdb5/mal/mal_client.h
--- a/monetdb5/mal/mal_client.h
+++ b/monetdb5/mal/mal_client.h
@@ -15,6 +15,10 @@
#include "mal_resolve.h"
#include "mal_profiler.h"
+#ifdef HAVE_SYS_RESOURCE_H
+#include <sys/resource.h>
+#endif
+
#define SCENARIO_PROPERTIES 8
#define CONSOLE 0
@@ -191,6 +195,10 @@ typedef struct CLIENT {
size_t blocksize;
protocol_version protocol;
bool filetrans; /* whether the client can read
files for us */
+
+#ifdef HAVE_SYS_RESOURCE_H
+ struct rusage res_usage; /* used by the mal_profiler */
+#endif
} *Client, ClientRec;
mal_export void MCinit(void);
diff --git a/monetdb5/mal/mal_dataflow.c b/monetdb5/mal/mal_dataflow.c
--- a/monetdb5/mal/mal_dataflow.c
+++ b/monetdb5/mal/mal_dataflow.c
@@ -26,6 +26,7 @@
* access it mostly without expensive locking.
*/
#include "monetdb_config.h"
+#include "mal_client.h"
#include "mal_dataflow.h"
#include "mal_private.h"
#include "mal_runtime.h"
@@ -471,7 +472,13 @@ DFLOWworker(void *T)
last = todo->last;
MT_lock_unset(&todo->l);
if (last == 0)
- profilerHeartbeatEvent("wait");
+ profilerHeartbeatEvent("wait",
+#ifdef HAVE_SYS_RESOURCE_H
+
&(cntxt->res_usage)
+#else
+ NULL
+#endif
+ );
}
}
GDKfree(GDKerrbuf);
diff --git a/monetdb5/mal/mal_profiler.c b/monetdb5/mal/mal_profiler.c
--- a/monetdb5/mal/mal_profiler.c
+++ b/monetdb5/mal/mal_profiler.c
@@ -16,6 +16,7 @@
*/
#include "monetdb_config.h"
#include "mutils.h" /* mercurial_revision */
+#include "mal_client.h"
#include "mal_function.h"
#include "mal_listing.h"
#include "mal_profiler.h"
@@ -29,7 +30,7 @@
#include <string.h>
-static void cachedProfilerEvent(MalBlkPtr mb, MalStkPtr stk, InstrPtr pci);
+static void cachedProfilerEvent(MalBlkPtr mb, MalStkPtr stk, InstrPtr pci,
void *res_usage);
stream *eventstream = 0;
@@ -47,14 +48,9 @@ static struct timeval startup_time;
static volatile ATOMIC_TYPE hbdelay = 0;
-#ifdef HAVE_SYS_RESOURCE_H
-struct rusage infoUsage;
-static struct rusage prevUsage;
-#endif
-
static struct{
lng user, nice, system, idle, iowait;
- double load;
+ dbl load;
} corestat[256];
@@ -138,7 +134,7 @@ EXAMPLE:
}
*/
static void
-renderProfilerEvent(MalBlkPtr mb, MalStkPtr stk, InstrPtr pci, int start, str
usrname)
+renderProfilerEvent(MalBlkPtr mb, MalStkPtr stk, InstrPtr pci, int start, str
usrname, void *res_usage)
{
(void)usrname;
char logbuffer[LOGLEN], *logbase;
@@ -147,6 +143,9 @@ renderProfilerEvent(MalBlkPtr mb, MalStk
str stmtq;
lng usec= GDKusec();
uint64_t microseconds = (uint64_t)startup_time.tv_sec*1000000 +
(uint64_t)startup_time.tv_usec + (uint64_t)usec;
+#ifdef HAVE_SYS_RESOURCE_H
+ struct rusage infoUsage, *prevUsage = (struct rusage*) res_usage;
+#endif
// ignore generation of events for instructions that are called too
often
if(highwatermark && highwatermark + (start == 0) < pci->calls)
@@ -199,17 +198,19 @@ renderProfilerEvent(MalBlkPtr mb, MalStk
#ifdef HAVE_SYS_RESOURCE_H
getrusage(RUSAGE_SELF, &infoUsage);
- if(infoUsage.ru_inblock - prevUsage.ru_inblock)
- logadd("\"inblock\":%ld,%s", infoUsage.ru_inblock -
prevUsage.ru_inblock, prettify);
- if(infoUsage.ru_oublock - prevUsage.ru_oublock)
- logadd("\"oublock\":%ld,%s", infoUsage.ru_oublock -
prevUsage.ru_oublock, prettify);
- if(infoUsage.ru_majflt - prevUsage.ru_majflt)
- logadd("\"majflt\":%ld,%s", infoUsage.ru_majflt -
prevUsage.ru_majflt, prettify);
- if(infoUsage.ru_nswap - prevUsage.ru_nswap)
- logadd("\"nswap\":%ld,s%sn", infoUsage.ru_nswap -
prevUsage.ru_nswap, prettify);
- if(infoUsage.ru_nvcsw - prevUsage.ru_nvcsw)
- logadd("\"nvcsw\":%ld,%s", infoUsage.ru_nvcsw -
prevUsage.ru_nvcsw +infoUsage.ru_nivcsw - prevUsage.ru_nivcsw, prettify);
- prevUsage = infoUsage;
+ if(infoUsage.ru_inblock - prevUsage->ru_inblock)
+ logadd("\"inblock\":%ld,%s", infoUsage.ru_inblock -
prevUsage->ru_inblock, prettify);
+ if(infoUsage.ru_oublock - prevUsage->ru_oublock)
+ logadd("\"oublock\":%ld,%s", infoUsage.ru_oublock -
prevUsage->ru_oublock, prettify);
+ if(infoUsage.ru_majflt - prevUsage->ru_majflt)
+ logadd("\"majflt\":%ld,%s", infoUsage.ru_majflt -
prevUsage->ru_majflt, prettify);
+ if(infoUsage.ru_nswap - prevUsage->ru_nswap)
+ logadd("\"nswap\":%ld,s%sn", infoUsage.ru_nswap -
prevUsage->ru_nswap, prettify);
+ if(infoUsage.ru_nvcsw - prevUsage->ru_nvcsw)
+ logadd("\"nvcsw\":%ld,%s", infoUsage.ru_nvcsw -
prevUsage->ru_nvcsw +infoUsage.ru_nivcsw - prevUsage->ru_nivcsw, prettify);
+ memcpy(prevUsage, &infoUsage, sizeof(struct rusage));
+#else
+ (void) res_usage;
#endif
if( mb){
@@ -417,7 +418,7 @@ getCPULoad(char cpuload[BUFSIZ]){
goto skip;
newload = (user - corestat[cpu].user + nice -
corestat[cpu].nice + system - corestat[cpu].system);
if ( newload)
- corestat[cpu].load = (double) newload /
(newload + idle - corestat[cpu].idle + iowait - corestat[cpu].iowait);
+ corestat[cpu].load = (dbl) newload / (newload +
idle - corestat[cpu].idle + iowait - corestat[cpu].iowait);
corestat[cpu].user = user;
corestat[cpu].nice = nice;
corestat[cpu].system = system;
@@ -441,13 +442,16 @@ getCPULoad(char cpuload[BUFSIZ]){
}
void
-profilerHeartbeatEvent(char *alter)
+profilerHeartbeatEvent(char *alter, void *res_usage)
{
char cpuload[BUFSIZ];
char logbuffer[LOGLEN], *logbase;
int loglen;
lng usec = GDKusec();
uint64_t microseconds = (uint64_t)startup_time.tv_sec*1000000 +
(uint64_t)startup_time.tv_usec + (uint64_t)usec;
+#ifdef HAVE_SYS_RESOURCE_H
+ struct rusage infoUsage, *prevUsage = (struct rusage*) res_usage;
+#endif
if (ATOMIC_GET(hbdelay, mal_beatLock) == 0 || eventstream == NULL)
return;
@@ -465,18 +469,21 @@ profilerHeartbeatEvent(char *alter)
logadd("\"ctime\":%"PRIu64",%s", microseconds, prettify);
logadd("\"rss\":%zu,%s", MT_getrss()/1024/1024, prettify);
#ifdef HAVE_SYS_RESOURCE_H
+ assert(res_usage);
getrusage(RUSAGE_SELF, &infoUsage);
- if(infoUsage.ru_inblock - prevUsage.ru_inblock)
- logadd("\"inblock\":%ld,%s", infoUsage.ru_inblock -
prevUsage.ru_inblock, prettify);
- if(infoUsage.ru_oublock - prevUsage.ru_oublock)
- logadd("\"oublock\":%ld,%s", infoUsage.ru_oublock -
prevUsage.ru_oublock, prettify);
- if(infoUsage.ru_majflt - prevUsage.ru_majflt)
- logadd("\"majflt\":%ld,%s", infoUsage.ru_majflt -
prevUsage.ru_majflt, prettify);
- if(infoUsage.ru_nswap - prevUsage.ru_nswap)
- logadd("\"nswap\":%ld,%s", infoUsage.ru_nswap -
prevUsage.ru_nswap, prettify);
- if(infoUsage.ru_nvcsw - prevUsage.ru_nvcsw)
- logadd("\"nvcsw\":%ld,%s", infoUsage.ru_nvcsw -
prevUsage.ru_nvcsw +infoUsage.ru_nivcsw - prevUsage.ru_nivcsw, prettify);
- prevUsage = infoUsage;
+ if(infoUsage.ru_inblock - prevUsage->ru_inblock)
+ logadd("\"inblock\":%ld,%s", infoUsage.ru_inblock -
prevUsage->ru_inblock, prettify);
+ if(infoUsage.ru_oublock - prevUsage->ru_oublock)
+ logadd("\"oublock\":%ld,%s", infoUsage.ru_oublock -
prevUsage->ru_oublock, prettify);
+ if(infoUsage.ru_majflt - prevUsage->ru_majflt)
+ logadd("\"majflt\":%ld,%s", infoUsage.ru_majflt -
prevUsage->ru_majflt, prettify);
+ if(infoUsage.ru_nswap - prevUsage->ru_nswap)
+ logadd("\"nswap\":%ld,%s", infoUsage.ru_nswap -
prevUsage->ru_nswap, prettify);
+ if(infoUsage.ru_nvcsw - prevUsage->ru_nvcsw)
+ logadd("\"nvcsw\":%ld,%s", infoUsage.ru_nvcsw -
prevUsage->ru_nvcsw +infoUsage.ru_nivcsw - prevUsage->ru_nivcsw, prettify);
+ memcpy(prevUsage, &infoUsage, sizeof(struct rusage));
+#else
+ (void) res_usage;
#endif
logadd("\"state\":\"%s\",%s",alter,prettify);
logadd("\"cpuload\":%s%s",cpuload,prettify);
@@ -485,7 +492,7 @@ profilerHeartbeatEvent(char *alter)
}
void
-profilerEvent(MalBlkPtr mb, MalStkPtr stk, InstrPtr pci, int start, str
usrname)
+profilerEvent(MalBlkPtr mb, MalStkPtr stk, InstrPtr pci, int start, str
usrname, void *res_usage)
{
if (stk == NULL) return;
if (pci == NULL) return;
@@ -493,14 +500,14 @@ profilerEvent(MalBlkPtr mb, MalStkPtr st
return;
if( sqlProfiling && !start )
- cachedProfilerEvent(mb, stk, pci);
+ cachedProfilerEvent(mb, stk, pci, res_usage);
if( eventstream) {
- renderProfilerEvent(mb, stk, pci, start, usrname);
+ renderProfilerEvent(mb, stk, pci, start, usrname, res_usage);
if ( start && pci->pc ==0)
- profilerHeartbeatEvent("ping");
+ profilerHeartbeatEvent("ping", res_usage);
if ( !start && pci->token == ENDsymbol)
- profilerHeartbeatEvent("ping");
+ profilerHeartbeatEvent("ping", res_usage);
}
}
@@ -518,10 +525,6 @@ openProfilerStream(stream *fd, int mode)
int i,j;
Client c;
-#ifdef HAVE_SYS_RESOURCE_H
- getrusage(RUSAGE_SELF, &infoUsage);
- prevUsage = infoUsage;
-#endif
if (myname == 0){
myname = putName("profiler");
eventcounter = 0;
@@ -537,11 +540,21 @@ openProfilerStream(stream *fd, int mode)
if( (mode & PROFSHOWRUNNING) > 0){
for (i = 0; i < MAL_MAXCLIENTS; i++) {
c = mal_clients+i;
- if ( c->active )
+ if ( c->active ) {
+#ifdef HAVE_SYS_RESOURCE_H
+ getrusage(RUSAGE_SELF, &(c->res_usage));
+#endif
for(j = 0; j <THREADS; j++)
- if( c->inprogress[j].mb)
- /* show the event */
- profilerEvent(c->inprogress[j].mb,
c->inprogress[j].stk, c->inprogress[j].pci, 1, c->username);
+ if( c->inprogress[j].mb)
+ /* show the event */
+
profilerEvent(c->inprogress[j].mb, c->inprogress[j].stk, c->inprogress[j].pci,
1, c->username,
+#ifdef HAVE_SYS_RESOURCE_H
+
&(c->res_usage)
+#else
+ NULL
+#endif
+ );
+ }
}
}
return MAL_SUCCEED;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list