| |
| biggraph = "rpctotal/diff" |
| |
| graphname = new Array( |
| "*/diskbw", |
| "<b>disk</b> bytes/second", |
| "*/netbw", |
| "<b>network</b> bytes/second", |
| "*/iobw", |
| "total: <b>disk+net</b> bytes/second", |
| |
| "apartreadbyte/diff", |
| "arena read bytes/second", |
| "apartwritebyte/diff", |
| "arena write bytes/second", |
| |
| "bloomfalsemiss/pctdiff=bloomlookup", |
| "bloom false hit %", |
| "bloomhit/pctdiff=bloomlookup", |
| "bloom miss %", |
| "bloomlookuptime/divdiff=bloomlookup", |
| "bloom lookup time", |
| "bloomones/pct=bloombits", |
| "bloom usage %", |
| |
| "dcachedirty/pct=dcachesize", |
| "dcache dirty %", |
| "dcachehit/pctdiff=dcachelookup", |
| "dcache hit %", |
| "dcachelookuptime/divdiff=dcachelookup", |
| "dcache lookup time", |
| "dcachelookup/diff", |
| "dcache lookups/second", |
| "dcachewrite/diff", |
| "dcache writes/second", |
| |
| "icachedirty/pct=icachesize", |
| "icache dirty %", |
| "icachehit/pctdiff=icachelookup", |
| "icache hit %", |
| "icachelookuptime/divdiff=icachelookup", |
| "icache lookup time", |
| "icacheprefetch/diff", |
| "icache prefetches/second", |
| "icachewrite/diff", |
| "icache writes/second", |
| |
| "isectreadbyte/diff", |
| "isect read bytes/second", |
| "isectwritebyte/diff", |
| "isect write bytes/second", |
| |
| "lcachehit/pctdiff=lcachelookup", |
| "lump cache hit %", |
| "lcachelookuptime/divdiff=lcachelookup", |
| "lump cache lookup time", |
| "lcachewrite/diff", |
| "lcache writes/second", |
| |
| "rpcreadbyte/diff", |
| "read RPC bytes/second", |
| "rpctotal/diff", |
| "RPCs/second", |
| "rpcwritebyte/diff", |
| "write RPC bytes/second", |
| "rpcreadtime/divdiff=rpcread", |
| "read RPC time", |
| "rpcwritetime/divdiff=rpcwrite", |
| "write RPC time", |
| "rpcreadcachedtime/divdiff=rpcreadcached", |
| "cached read RPC time", |
| "rpcreaduncachedtime/divdiff=rpcreaduncached", |
| "uncached read RPC time", |
| "rpcwritenewtime/divdiff=rpcwritenew", |
| "fresh write RPC time", |
| "rpcwriteoldtime/divdiff=rpcwriteold", |
| "dup write RPC time", |
| |
| "sumreadbyte/diff", |
| "checksum bytes/second", |
| |
| "dblockstall", |
| "threads stalled: dblock", |
| "dcachestall", |
| "threads stalled: dcache", |
| "icachestall", |
| "threads stalled: icache", |
| "lumpstall", |
| "threads stalled: lump", |
| |
| "END" |
| ) |
| |
| column0 = new Array( |
| "column0", |
| "!bandwidth", |
| "*/iobw", |
| "*/netbw", |
| "rpcreadbyte/diff", |
| "rpcwritebyte/diff", |
| "*/diskbw", |
| "isectreadbyte/diff", |
| "isectwritebyte/diff", |
| "apartreadbyte/diff", |
| "apartwritebyte/diff", |
| "sumreadbyte/diff", |
| |
| "!bloom filter", |
| "bloomhit/pctdiff=bloomlookup", |
| "bloomfalsemiss/pctdiff=bloomlookup", |
| "bloomones/pct=bloombits", |
| |
| "END" |
| ) |
| |
| column1 = new Array( |
| "column1", |
| "!icache", |
| "icachedirty/pct=icachesize", |
| "icachehit/pctdiff=icachelookup", |
| "icachewrite/diff", |
| "icacheprefetch/diff", |
| |
| "!dcache", |
| "dcachedirty/pct=dcachesize", |
| "dcachehit/pctdiff=dcachelookup", |
| "dcachelookup/diff", |
| "dcachewrite/diff", |
| |
| "!lump cache", |
| "lcachehit/pctdiff=lcachelookup", |
| "lcachewrite/diff", |
| |
| "END" |
| ) |
| |
| column2 = new Array( |
| "column2", |
| |
| "!stalls", |
| "icachestall", |
| "dcachestall", |
| "dblockstall", |
| "lumpstall", |
| |
| "!timings", |
| "bloomlookuptime/divdiff=bloomlookup", |
| "icachelookuptime/divdiff=icachelookup", |
| "lcachelookuptime/divdiff=lcachelookup", |
| "dcachelookuptime/divdiff=dcachelookup", |
| "rpcreadtime/divdiff=rpcread", |
| "rpcwritetime/divdiff=rpcwrite", |
| "rpcreadcachedtime/divdiff=rpcreadcached", |
| "rpcreaduncachedtime/divdiff=rpcreaduncached", |
| "rpcwritenewtime/divdiff=rpcwritenew", |
| "rpcwriteoldtime/divdiff=rpcwriteold", |
| |
| "END" |
| |
| ) |
| |
| col0info = new Array(column0.length) |
| col1info = new Array(column1.length) |
| col2info = new Array(column2.length) |
| |
| function cleardebug() { |
| var p = document.getElementById("debug") |
| p.innerHTML = "" |
| } |
| |
| function debug(s) { |
| var p = document.getElementById("debug") |
| if(p.innerHTML == "") |
| p.innerHTML = "<a href=\"javascript:cleardebug()\">clear</a>\n" |
| p.innerHTML += "<br>"+s |
| } |
| |
| function Ginfo(y, fill, name) { |
| var g = new Object() |
| g.y = y |
| g.fill = fill |
| g.name = name |
| return g |
| } |
| |
| function cleartable(t) { |
| for(var i=t.rows.length-1; i>=0; i--) |
| t.deleteRow(i) |
| } |
| |
| function textofname(name) |
| { |
| for(var i=0; i<graphname.length; i+=2) |
| if(name == graphname[i]) |
| return graphname[i+1] |
| } |
| |
| function graphrow(row, span, name, dt, wid, ht, fill, text) { |
| var url = "/graph/"+name |
| url = url+"/min=0" |
| url = url+"/t0=-"+dt |
| url = url+"/wid="+wid |
| url = url+"/ht="+ht |
| url = url+"/fill="+fill |
| |
| var s = "<td colSpan="+span |
| s = s+" valign=bottom" |
| s = s+" align=center" |
| s = s+" width="+wid |
| s = s+" height="+ht |
| s = s+" style=\"background-image: url("+url+");\"" |
| s = s+">"+textofname(name)+text+"</td>" |
| row.innerHTML = s |
| } |
| |
| |
| function graphcell(cell, name, dt, wid, ht, fill) { |
| cell.vAlign = "bottom" |
| cell.align = "center" |
| cell.width = wid |
| cell.height = ht |
| } |
| |
| function redraw() { |
| redrawgraphs() |
| redrawsettings() |
| } |
| |
| function redrawgraphs() { |
| var t = document.getElementById("statgraphs") |
| |
| cleartable(t) |
| for(var i=0; i<4; i++) |
| t.insertRow(i) |
| |
| graphrow(t.rows[0], 3, biggraph, 86400, 900, 30, 0, " – showing 24 hours") |
| debug("t.rows.length="+t.rows.length) |
| graphrow(t.rows[1], 3, biggraph, 3600, 900, 30, 1, " – showing 1 hour") |
| debug("t.rows.length="+t.rows.length) |
| t.rows[2].innerHTML = "<td height=10></td>" |
| |
| var r = t.rows[3] |
| graphtable(r.insertCell(0), column0, col0info, 0) |
| graphtable(r.insertCell(1), column1, col1info, 2) |
| graphtable(r.insertCell(2), column2, col2info, 4) |
| } |
| |
| function graphtable(bigcell, list, infolist, fill) { |
| bigcell.innerHTML = "<table id=\""+list[0]+"\"></table>" |
| bigcell.vAlign = "top" |
| var t = document.getElementById(list[0]) |
| t.onclick = columnclick |
| |
| for(var i=1; i<list.length; i++){ |
| var r = t.insertRow(t.rows.length) |
| name = list[i] |
| infolist[i] = Ginfo(t.offsetHeight, fill, name) |
| if(name == "END") |
| break |
| if(name.substring(0,1) == "!"){ |
| name = name.substring(1) |
| if(i > 1){ |
| r.innerHTML = "<td height=10></td>" |
| r = t.insertRow(t.rows.length) |
| } |
| r.innerHTML = "<td align=center><b>"+name+"</b>" |
| }else{ |
| graphrow(r, 1, name, 600, 300, 30, fill++, "") |
| } |
| } |
| } |
| |
| function xpos(obj) { |
| var x = 0 |
| if(obj.fixedx) |
| return obj.fixedx |
| if(obj.offsetParent){ |
| while(obj.offsetParent){ |
| x += obj.offsetLeft |
| obj = obj.offsetParent |
| } |
| }else if(obj.x) |
| x = obj.x |
| return x |
| } |
| |
| function ypos(obj) { |
| var y = 0 |
| if(obj.fixedy) |
| return obj.fixedy |
| if(obj.offsetParent){ |
| while(obj.offsetParent){ |
| y += obj.offsetTop |
| obj = obj.offsetParent |
| } |
| }else if(obj.y) |
| y = obj.y |
| return y |
| } |
| |
| function scrollleft() { |
| return document.body.scrollLeft |
| } |
| |
| function scrolltop() { |
| return document.body.scrollTop |
| } |
| |
| function columnclick(e) { |
| if(e.which && e.which != 1) |
| return |
| var g = findgraph(scrollleft()+e.clientX, scrolltop()+e.clientY) |
| if(g && g.name.substring(0,1) != "!"){ |
| biggraph = g.name |
| var t = document.getElementById("statgraphs") |
| graphrow(t.rows[0], 3, biggraph, 86400, 900, 30, 0, " – showing 24 hours") |
| graphrow(t.rows[1], 3, biggraph, 3600, 900, 30, 1, " – showing 1 hour") |
| } |
| } |
| |
| function findgraph(x, y) { |
| var g |
| |
| if(g = findgraphin(x, y, "column2", col2info)) |
| return g |
| if(g = findgraphin(x, y, "column1", col1info)) |
| return g |
| if(g = findgraphin(x, y, "column0", col0info)) |
| return g |
| return |
| } |
| |
| function findgraphin(x, y, tname, info) { |
| var t = document.getElementById(tname) |
| if(x < xpos(t)) |
| return |
| y = y - ypos(t) |
| for(var i=info.length-2; i>=1; i--) |
| if(y > info[i].y) |
| return info[i] |
| return |
| } |
| |
| function setof(name, val, list) { |
| var s = "" |
| for(var i=0; i<list.length; i++){ |
| if(val == list[i]) |
| s = s+" <b>"+val+"</b>" |
| else |
| s = s+" <a href=\"javascript:set('"+name+"', '"+list[i]+"')\">"+list[i]+"</a>" |
| } |
| return s |
| } |
| |
| function loglinks(list) { |
| var s = "" |
| for(var i=0; i<list.length; i++){ |
| s = s+" <a href=\"/log/"+list[i]+"\">"+list[i]+"</a>" |
| } |
| return s |
| } |
| |
| first = 1 |
| function redrawsettings() { |
| if(first){ |
| loadsettings() |
| first = 0 |
| } |
| var s = "" |
| s = s+"<font size=-1>\n" |
| s = s+"logging:"+setof("logging", logging, loggingchoices) |
| s = s+" " |
| s = s+"stats:"+setof("stats", stats, statschoices) |
| s = s+"\n<p/>\n" |
| s = s+"compression:"+setof("compress", compress, compresschoices1) |
| s = s+"<br>"+setof("compress", compress, compresschoices2) |
| s = s+"\n<p/>\n" |
| s = s+"<a href=/index>index</a> | <a href=/storage>storage</a> | " |
| s = s+"log:"+loglinks(logs) |
| s = s+"</font>" |
| document.getElementById("settings").innerHTML = s |
| } |
| |
| function set(name, value) { |
| eval(name+"= \""+value+"\"") |
| redrawsettings() |
| // Works in FireFox, not in Safari |
| parent.hidden.location.href = "/set/"+name+"/"+value |
| } |