Changeset: 94bdb32e97d7 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=94bdb32e97d7 Modified Files: clients/mapiclient/tomograph.c monetdb5/mal/mal_profiler.c Branch: default Log Message:
Merge with Feb2013 branch. diffs (truncated from 347 to 300 lines): diff --git a/clients/mapiclient/tomograph.c b/clients/mapiclient/tomograph.c --- a/clients/mapiclient/tomograph.c +++ b/clients/mapiclient/tomograph.c @@ -533,6 +533,7 @@ colors[] = { 0, 0, "language", "*", "darkgray" }, { 0, 0, "mat", "pack", "red" }, + { 0, 0, "mat", "packIncrement", "red" }, { 0, 0, "mat", "*", "red" }, @@ -551,11 +552,13 @@ colors[] = //{0,0,"sql","bind","thistle"}, //{0,0,"sql","bind_dbat","thistle"}, //{0,0,"sql","mvc","thistle"}, - { 0, 0, "sql", "projectdelta ", "hotpink" }, - { 0, 0, "sql", "subdelta ", "violet" }, - { 0, 0, "sql", "delta ", "salmon" }, + { 0, 0, "sql", "projectdelta", "hotpink" }, + { 0, 0, "sql", "subdelta", "violet" }, + { 0, 0, "sql", "delta", "salmon" }, { 0, 0, "sql", "tid ", "plum" }, - { 0, 0, "sql", "*", "thistle" }, + { 0, 0, "sql", "bind", "thistle" }, + { 0, 0, "sql", "bind_idxbat", "deeppink" }, + { 0, 0, "sql", "*", "pink" }, { 0, 0, "*", "*", "lavender" }, { 0, 0, 0, 0, 0 } @@ -584,6 +587,7 @@ static void dumpboxes(void) FILE *fcpu = 0; char buf[BUFSIZ]; int i; + lng e=0; if (tracefile) { snprintf(buf, BUFSIZ, "scratch.dat"); @@ -603,8 +607,13 @@ static void dumpboxes(void) //io counters are zero at start of instruction ! //fprintf(f,""LLFMT" %3.2f 0 0 \n", box[i].clkstart, (box[i].memstart/1024.0)); fprintf(f, ""LLFMT" %3.2f 0 0\n", box[i].clkend, (box[i].memend / 1024.0)); - } else { - fprintf(f, ""LLFMT" %3.2f "LLFMT" "LLFMT"\n", box[i].clkend, (box[i].memend / 1024.0), box[i].reads, box[i].writes); + } else + if (box[i].state == PING) { + /* cpu stat events may arrive out of order, drop those */ + if ( box[i].clkstart <= e) + continue; + e = box[i].clkstart; + fprintf(f, ""LLFMT" %3.2f "LLFMT" "LLFMT"\n", box[i].clkstart, (box[i].memend / 1024.0), box[i].reads, box[i].writes); if (cpus == 0) { char *s = box[i].stmt; while (s && isspace((int) *s)) @@ -863,7 +872,7 @@ static void scandata(char *filename) { FILE *f; char line[2*BUFSIZ], buf[BUFSIZ], buf2[BUFSIZ]; - int cnt, i = 0; + int i = 0; f = fopen(filename, "r"); if (f == 0) { @@ -880,17 +889,12 @@ static void scandata(char *filename) if ( fgets(line,2 * BUFSIZ,f) == NULL) { fprintf(stderr, "scandata read error\n"); } - if ( (cnt =sscanf(line, "%d\t"LLFMT"\t"LLFMT"\t"LLFMT"\t"LLFMT"\t"LLFMT"\t%d\t"LLFMT"\t"LLFMT"\t%s\t%s\n", - &box[i].thread, &box[i].clkstart, &box[i].clkend, - &box[i].ticks, &box[i].memstart, &box[i].memend, - &box[i].state, &box[i].reads, &box[i].writes, buf, buf2)) != 11){ - fprintf(stderr, "scandata error %d\n",cnt); - dumpbox(i); - topbox = i; - return; - } + sscanf(line, "%d\t"LLFMT"\t"LLFMT"\t"LLFMT"\t"LLFMT"\t"LLFMT"\t%d\t"LLFMT"\t"LLFMT"\t%s\t%s\n", + &box[i].thread, &box[i].clkstart, &box[i].clkend, + &box[i].ticks, &box[i].memstart, &box[i].memend, + &box[i].state, &box[i].reads, &box[i].writes, buf, buf2); + box[i].fcn = strdup(buf); box[i].stmt = strdup(buf); - box[i].fcn = strdup(buf2); /* focus on part of the time frame */ if (endrange) { if (box[i].clkend < startrange || box[i].clkstart >endrange) @@ -944,7 +948,7 @@ static void createTomogram(void) double w = (lastclktick - starttime) / 10.0; int scale; char *scalename; - lng totalticks; + lng totalticks, tick; static int figures = 0; snprintf(buf, BUFSIZ, "%s.gpl", filename); @@ -970,7 +974,7 @@ static void createTomogram(void) /* detect all different threads and assign them a row */ for (i = 0; i < topbox; i++) - if (box[i].clkend && box[i].state < PING) { + if (box[i].clkend && box[i].state != PING) { for (j = 0; j < top; j++) if (rows[j] == box[i].thread) break; @@ -1016,6 +1020,7 @@ static void createTomogram(void) fprintf(gnudata, "set xlabel \"%sseconds, parallelism usage %6.1f %%\"\n", scalename, totalclkticks / (totalticks / 100.0)); h = 10; /* unit height of bars */ + tick = totalticks/2000; fprintf(gnudata, "set ytics ("); for (i = 0; i < top; i++) fprintf(gnudata, "\"%d\" %d%c", rows[i], i * 2 * h + h / 2, (i < top - 1 ? ',' : ' ')); @@ -1028,7 +1033,8 @@ static void createTomogram(void) /* fill the duration of each instruction encountered that fit our range constraint */ for (i = 0; i < topbox; i++) - switch (box[i].clkend && box[i].state ) { + if ( box[i].clkend) + switch (box[i].state ) { default: if (debug) dumpbox(i); @@ -1038,8 +1044,8 @@ static void createTomogram(void) case PING: break; case WAIT: - fprintf(gnudata, "set object %d rectangle from "LLFMT", %d to "LLFMT", %d fillcolor rgb \"%s\" fillstyle solid 0.6\n", - object++, box[i].clkstart, box[i].row * 2 * h+h, box[i].clkend, box[i].row * 2 * h + h +h/5, colors[box[i].color].col); + fprintf(gnudata, "set object %d rectangle from "LLFMT", %d to "LLFMT", %d front fillcolor rgb \"red\" fillstyle solid 1.0\n", + object++, box[i].clkstart, box[i].row * 2 * h+h, box[i].clkend+tick, (int)(box[i].row * 2 * h + 1.25*h)); } @@ -1167,10 +1173,14 @@ static void update(int state, int thread } } +/* + * Beware the UDP protocol may cause some loss + * Incomplete records from previous runs may also appear + */ static int parser(char *row) { #ifdef HAVE_STRPTIME - char *c; + char *c, *cc; struct tm stm; lng clkticks = 0; int thread = 0; @@ -1180,8 +1190,12 @@ static int parser(char *row) int state = 0; lng reads, writes; + /* check basic validaty first */ if (row[0] != '[') return -1; + if ( (cc= strrchr(row,']')) == 0 || *(cc+1) !=0) + return -1; + c = strchr(row, (int) '"'); if (c == 0) return -2; @@ -1244,6 +1258,9 @@ static int parser(char *row) return -8; writes = strtoll(c + 1, NULL, 10); + /* check basic validity */ + if ( (cc= strrchr(row,']')) == 0 || *(cc+1) !=0) + return -1; c = strchr(c + 1, (int) ','); if (c == 0) return -9; 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 @@ -63,7 +63,7 @@ static void stopHeartbeat(void); int malProfileMode = 0; /* global flag to indicate profiling mode */ static int profileAll = 0; /* all instructions should be profiled */ static int delayswitch = 0; /* to wait before sending the profile info */ -static int eventcounter; +static int eventcounter = 0; #define PROFevent 0 #define PROFtime 1 @@ -165,16 +165,23 @@ deactivateCounter(str name) (void) snprintf(logbase+loglen, LOGLEN -1 - loglen, __VA_ARGS__); \ loglen += (int) strlen(logbase+loglen); \ } while (0) -#define logsent() \ - do { assert(loglen <= LOGLEN); \ - MT_lock_set(&mal_profileLock, "profileLock"); \ - if (eventstream) { \ - (void)mnstr_write(eventstream, logbuffer,loglen,1 );\ - mnstr_flush(eventstream); \ - } \ - eventcounter++; \ - MT_lock_unset(&mal_profileLock, "profileLock"); \ - } while (0) + +static void logsent(int header, char *logbuffer) +{ + MT_lock_set(&mal_profileLock, "profileLock"); + if (eventstream) { + if ( header) + mnstr_printf(eventstream,"%s\n", logbuffer); + else + if (profileCounter[PROFevent].status && eventcounter) + mnstr_printf(eventstream,"[ %d,\t%s ]\n", eventcounter, logbuffer); + else + mnstr_printf(eventstream,"[ %s ]\n", logbuffer); + mnstr_flush(eventstream); + } + eventcounter++; + MT_lock_unset(&mal_profileLock, "profileLock"); +} #define flushLog() if (eventstream) mnstr_flush(eventstream); @@ -280,8 +287,8 @@ offlineProfilerHeader(void) logadd("types,\t"); if (profileCounter[PROFuser].status) logadd("user,\t"); - logadd("# name\n"); - logsent(); + logadd("# name"); + logsent(1, logbuffer); } void @@ -330,10 +337,6 @@ offlineProfilerEvent(int idx, MalBlkPtr /* make basic profile event tuple */ lognew(); - logadd("[ "); - if (profileCounter[PROFevent].status) { - logadd("%d,\t", eventcounter); - } if (profileCounter[PROFstart].status) { if ( start) { logadd("\"start\",\t"); @@ -459,8 +462,7 @@ offlineProfilerEvent(int idx, MalBlkPtr if (profileCounter[PROFuser].status) { logadd(" %d", idx); } - logadd(" ]\n"); - logsent(); + logsent(0, logbuffer); } /* * Postprocessing events @@ -536,6 +538,7 @@ closeProfilerStream(void) (void)mnstr_close(eventstream); (void)mnstr_destroy(eventstream); } + profilerHeartbeatEvent("ping"); eventstream = NULL; malProfileMode = FALSE; return MAL_SUCCEED; @@ -593,6 +596,7 @@ startProfiling(void) if (TRACE_init == 0) _initTrace(); malProfileMode = TRUE; + eventcounter = 0; MT_lock_unset(&mal_profileLock, "profileLock"); return MAL_SUCCEED; } @@ -1049,16 +1053,15 @@ cachedProfilerEvent(int idx, MalBlkPtr m #ifdef HAVE_SYS_RESOURCE_H getrusage(RUSAGE_SELF, &infoUsage); #endif - MT_lock_set(&mal_profileLock, "profileLock"); - if (initTrace() || TRACE_init == 0) { - MT_lock_unset(&mal_profileLock, "profileLock"); + if (initTrace() || TRACE_init == 0) return; - } /* update the Trace tables */ snprintf(buf, 1024, "%s.%s[%d]", getModuleId(getInstrPtr(mb, 0)), getFunctionId(getInstrPtr(mb, 0)), getPC(mb, pci)); + + MT_lock_set(&mal_profileLock, "profileLock"); TRACE_id_pc = BUNappend(TRACE_id_pc, buf, FALSE); TRACE_id_thread = BUNappend(TRACE_id_thread, &tid, FALSE); @@ -1227,9 +1230,7 @@ static struct{ double load; } corestat[256]; -static char cpuload[BUFSIZ]; - -static int gatherCPULoad(void){ +static int gatherCPULoad(char cpuload[BUFSIZ]){ int cpu, len, i; lng user, nice, system, idle, iowait; char buf[BUFSIZ],*s; @@ -1286,6 +1287,7 @@ static int gatherCPULoad(void){ void profilerHeartbeatEvent(str msg) { char logbuffer[LOGLEN], *logbase; _______________________________________________ checkin-list mailing list checkin-list@monetdb.org http://mail.monetdb.org/mailman/listinfo/checkin-list