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
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to