Changeset: 5c0d570b7056 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=5c0d570b7056
Modified Files:
monetdb5/mal/mal_profiler.c
Branch: default
Log Message:
Gather the cpu core utilization
It is an expensive operation, but it is worthwhile for large heartbeats (>1sec)
to also obtain some insight in the performance of the cpu cores.
diffs (142 lines):
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
@@ -1240,6 +1240,57 @@ getDiskSpace(void)
/* the heartbeat process produces a ping event once every X milliseconds */
static int hbdelay = 0;
+/* the processor statistics are gathered in Linux settings from the proc files.
+ * Given the parsing involved, it should be used sparingly */
+
+static struct{
+ long user, nice, system, idle, iowait;
+ double load;
+} corestat[256];
+
+static char cpuload[BUFSIZ];
+static FILE *proc;
+
+static void gatherCPULoad(void){
+ int cpu, len;
+ long user, nice, system, idle, iowait;
+ char buf[BUFSIZ],*s;
+
+ if ( proc == 0)
+ return;
+ rewind(proc);
+ while (fgets(buf, BUFSIZ,proc) != NULL)
+ if ( strncmp(buf,"cpu",3)== 0){
+ s= buf+3;
+ if ( *s == ' ') {
+ s++;
+ cpu = 0;
+ } else{
+ cpu = atoi(s);
+ s= strchr(buf,' ');
+ if ( s== 0) break;
+ }
+ while( *s && isspace((int)*s)) s++;
+ (void) sscanf(s,"%ld %ld %ld %ld %ld", &user, &nice, &system,
&idle, &iowait);
+ corestat[cpu].load = (user - corestat[cpu].user + nice -
corestat[cpu].nice + system - corestat[cpu].system);
+ if ( corestat[cpu].load )
+ corestat[cpu].load = corestat[cpu].load /
(corestat[cpu].load + idle - corestat[cpu].idle);
+ corestat[cpu].user = user;
+ corestat[cpu].nice = nice;
+ corestat[cpu].system = system;
+ corestat[cpu].idle = idle;
+ corestat[cpu].iowait = iowait;
+ } else break;
+
+ s= cpuload;
+ len = BUFSIZ;
+ for ( cpu = 0; cpu < 256 && corestat[cpu].user; cpu++) {
+ snprintf(s, len, " %.2f ",corestat[cpu].load);
+ len -= (int)strlen(s);
+ s += (int) strlen(s);
+ }
+}
+
static void profilerHeartbeat(void *dummy){
Thread thr = THRnew("profilerHeartbeat");
#ifdef HAVE_SYS_RESOURCE_H
@@ -1247,6 +1298,8 @@ static void profilerHeartbeat(void *dumm
struct rusage infoUsage;
#endif
static int eventcounter;
+ struct timeval tv;
+ time_t clock, prevclock=0;
#ifdef HAVE_TIMES
struct tms newTms;
struct tms prevtimer;
@@ -1256,6 +1309,11 @@ static void profilerHeartbeat(void *dumm
getrusage(RUSAGE_SELF, &prevUsage);
#endif
(void) dummy;
+ proc = fopen("/proc/stat","r");
+ gatherCPULoad();
+ gettimeofday(&tv,NULL);
+ prevclock = (time_t) tv.tv_sec;
+
while (hbdelay){
MT_sleep_ms(hbdelay);
@@ -1267,6 +1325,18 @@ static void profilerHeartbeat(void *dumm
if (eventstream == NULL)
continue;
+ /* without this cast, compilation on Windows fails with
+ * argument of type "long *" is incompatible with parameter of
type "const time_t={__time64_t={__int64}} *"
+ */
+
+ gettimeofday(&tv,NULL);
+ clock = (time_t) tv.tv_sec;
+
+ /* get CPU load on second boundaries only */
+ if ( clock - prevclock >= 0 ) {
+ gatherCPULoad();
+ prevclock = clock;
+ }
MT_lock_set(&mal_profileLock, "profileLock");
#ifdef HAVE_TIMES
times(&newTms);
@@ -1284,15 +1354,6 @@ static void profilerHeartbeat(void *dumm
log("\"ping\",\t");
if (profileCounter[PROFtime].status) {
char *tbuf, *c;
-
- /* without this cast, compilation on Windows fails with
- * argument of type "long *" is incompatible with
parameter of type "const time_t={__time64_t={__int64}} *"
- */
- struct timeval tv;
- time_t clock;
-
- gettimeofday(&tv,NULL);
- clock = (time_t) tv.tv_sec;
tbuf = ctime(&clock);
if (tbuf) {
c = strchr(tbuf, '\n');
@@ -1353,17 +1414,18 @@ static void profilerHeartbeat(void *dumm
log("0,\t0,\t");
if (profileCounter[PROFstmt].status)
- log(" \"ping\",\t");
- if (profileCounter[PROFtype].status)
- log("\"\",\t");
- if (profileCounter[PROFuser].status) {
- log(" 0");
- }
+ log(" %s", cpuload);
+ //if (profileCounter[PROFtype].status)
+ //log("\"\",\t");
+ //if (profileCounter[PROFuser].status)
+ //log(" 0");
log(" ]\n");
eventcounter++;
flushLog();
MT_lock_unset(&mal_profileLock, "profileLock");
}
+ if ( proc)
+ (void) fclose(proc);
THRdel(thr);
}
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list