svg.c revision 6bb25a058227d89fbbeba6c12873e6f83da5cf94
6d0274f11547a0f11200bb82bf598a5a253e12cfLennart Poettering bootchart.c - This file is part of systemd-bootchart
6d0274f11547a0f11200bb82bf598a5a253e12cfLennart Poettering Copyright (C) 2009-2013 Intel Coproration
2f6a59070559786428d9eaf199ae3d61772b2225Kay Sievers Auke Kok <auke-jan.h.kok@intel.com>
6d0274f11547a0f11200bb82bf598a5a253e12cfLennart Poettering systemd is free software; you can redistribute it and/or modify it
6d0274f11547a0f11200bb82bf598a5a253e12cfLennart Poettering under the terms of the GNU Lesser General Public License as published by
6d0274f11547a0f11200bb82bf598a5a253e12cfLennart Poettering the Free Software Foundation; either version 2.1 of the License, or
6d0274f11547a0f11200bb82bf598a5a253e12cfLennart Poettering (at your option) any later version.
6d0274f11547a0f11200bb82bf598a5a253e12cfLennart Poettering systemd is distributed in the hope that it will be useful, but
6d0274f11547a0f11200bb82bf598a5a253e12cfLennart Poettering WITHOUT ANY WARRANTY; without even the implied warranty of
6d0274f11547a0f11200bb82bf598a5a253e12cfLennart Poettering MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
6d0274f11547a0f11200bb82bf598a5a253e12cfLennart Poettering Lesser General Public License for more details.
6d0274f11547a0f11200bb82bf598a5a253e12cfLennart Poettering You should have received a copy of the GNU Lesser General Public License
6d0274f11547a0f11200bb82bf598a5a253e12cfLennart Poettering along with systemd; If not, see <http://www.gnu.org/licenses/>.
e1636421f46db6d06fbd028ef20a3113fa3e11f8Lennart Poettering#define kb_to_graph(m) ((m) * scale_y * 0.0001)
6d0274f11547a0f11200bb82bf598a5a253e12cfLennart Poettering#define max(x, y) (((x) > (y)) ? (x) : (y))
6d0274f11547a0f11200bb82bf598a5a253e12cfLennart Poettering#define min(x, y) (((x) < (y)) ? (x) : (y))
6d0274f11547a0f11200bb82bf598a5a253e12cfLennart Poettering#define svg(a...) do { snprintf(str, 8092, ## a); fputs(str, of); fflush(of); } while (0)
ffc06c3513d9a0693c7f810d03b20705127ba55aKay Sieversstatic int pfiltered = 0;
2f6a59070559786428d9eaf199ae3d61772b2225Kay Sieversstatic int pcount = 0;
2f6a59070559786428d9eaf199ae3d61772b2225Kay Sieversstatic int kcount = 0;
2f6a59070559786428d9eaf199ae3d61772b2225Kay Sieversstatic float psize = 0;
2f6a59070559786428d9eaf199ae3d61772b2225Kay Sieversstatic float ksize = 0;
2f6a59070559786428d9eaf199ae3d61772b2225Kay Sieversstatic float esize = 0;
6d0274f11547a0f11200bb82bf598a5a253e12cfLennart Poetteringstatic void svg_header(void)
6d0274f11547a0f11200bb82bf598a5a253e12cfLennart Poettering /* min width is about 1600px due to the label */
9ff09bcb86fb125768667aca9bc0b10b1745370aShawn Landden w = 150.0 + 10.0 + time_to_graph(sampletime[samples-1] - graph_start);
6d0274f11547a0f11200bb82bf598a5a253e12cfLennart Poettering /* height is variable based on pss, psize, ksize */
599659860c770058f2eb04d578c521c16e0b1853Lennart Poettering h = 400.0 + (scale_y * 30.0) /* base graphs and title */
599659860c770058f2eb04d578c521c16e0b1853Lennart Poettering + (pss ? (100.0 * scale_y) + (scale_y * 7.0) : 0.0) /* pss estimate */
d95a74ed1191bb09f5be57b0619d3d77708e019dLennart Poettering svg("<?xml version=\"1.0\" standalone=\"no\"?>\n");
d95a74ed1191bb09f5be57b0619d3d77708e019dLennart Poettering svg("<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" ");
2311eb2ff0c3ff80ec3645b02c97170c9a565454Kay Sievers svg("\"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n");
d95a74ed1191bb09f5be57b0619d3d77708e019dLennart Poettering //svg("<g transform=\"translate(10,%d)\">\n", 1000 + 150 + (pcount * 20));
d95a74ed1191bb09f5be57b0619d3d77708e019dLennart Poettering svg("<svg width=\"%.0fpx\" height=\"%.0fpx\" version=\"1.1\" ",
d95a74ed1191bb09f5be57b0619d3d77708e019dLennart Poettering svg("xmlns=\"http://www.w3.org/2000/svg\">\n\n");
9ff09bcb86fb125768667aca9bc0b10b1745370aShawn Landden /* write some basic info as a comment, including some help */
9ff09bcb86fb125768667aca9bc0b10b1745370aShawn Landden svg("<!-- This file is a bootchart SVG file. It is best rendered in a browser -->\n");
9ff09bcb86fb125768667aca9bc0b10b1745370aShawn Landden svg("<!-- such as Chrome, Chromium, or Firefox. Other applications that -->\n");
d95a74ed1191bb09f5be57b0619d3d77708e019dLennart Poettering svg("<!-- render these files properly but more slowly are ImageMagick, gimp, -->\n");
9ff09bcb86fb125768667aca9bc0b10b1745370aShawn Landden svg("<!-- inkscape, etc. To display the files on your system, just point -->\n");
9ff09bcb86fb125768667aca9bc0b10b1745370aShawn Landden svg("<!-- your browser to file:///var/log/ and click. This bootchart was -->\n\n");
d95a74ed1191bb09f5be57b0619d3d77708e019dLennart Poettering svg("<!-- generated by bootchart version %s, running with options: -->\n", VERSION);
6d0274f11547a0f11200bb82bf598a5a253e12cfLennart Poettering svg("<!-- hz=\"%f\" n=\"%d\" -->\n", hz, len);
9ff09bcb86fb125768667aca9bc0b10b1745370aShawn Landden svg("<!-- x=\"%f\" y=\"%f\" -->\n", scale_x, scale_y);
5ffa8c818120e35c89becd938d160235c069dd12Zbigniew Jędrzejewski-Szmek svg("<!-- rel=\"%d\" f=\"%d\" -->\n", relative, filter);
5ffa8c818120e35c89becd938d160235c069dd12Zbigniew Jędrzejewski-Szmek svg("<!-- p=\"%d\" e=\"%d\" -->\n", pss, entropy);
5ffa8c818120e35c89becd938d160235c069dd12Zbigniew Jędrzejewski-Szmek svg("<!-- o=\"%s\" i=\"%s\" -->\n\n", output_path, init_path);
5ffa8c818120e35c89becd938d160235c069dd12Zbigniew Jędrzejewski-Szmek /* style sheet */
9ff09bcb86fb125768667aca9bc0b10b1745370aShawn Landden svg("<defs>\n <style type=\"text/css\">\n <![CDATA[\n");
9ff09bcb86fb125768667aca9bc0b10b1745370aShawn Landden svg(" rect.cpu { fill: rgb(64,64,240); stroke-width: 0; fill-opacity: 0.7; }\n");
6d0274f11547a0f11200bb82bf598a5a253e12cfLennart Poettering svg(" rect.wait { fill: rgb(240,240,0); stroke-width: 0; fill-opacity: 0.7; }\n");
2f6a59070559786428d9eaf199ae3d61772b2225Kay Sievers svg(" rect.bi { fill: rgb(240,128,128); stroke-width: 0; fill-opacity: 0.7; }\n");
2f6a59070559786428d9eaf199ae3d61772b2225Kay Sievers svg(" rect.bo { fill: rgb(192,64,64); stroke-width: 0; fill-opacity: 0.7; }\n");
6d0274f11547a0f11200bb82bf598a5a253e12cfLennart Poettering svg(" rect.ps { fill: rgb(192,192,192); stroke: rgb(128,128,128); fill-opacity: 0.7; }\n");
d95a74ed1191bb09f5be57b0619d3d77708e019dLennart Poettering svg(" rect.krnl { fill: rgb(240,240,0); stroke: rgb(128,128,128); fill-opacity: 0.7; }\n");
5ffa8c818120e35c89becd938d160235c069dd12Zbigniew Jędrzejewski-Szmek svg(" rect.box { fill: rgb(240,240,240); stroke: rgb(192,192,192); }\n");
5ffa8c818120e35c89becd938d160235c069dd12Zbigniew Jędrzejewski-Szmek svg(" rect.clrw { stroke-width: 0; fill-opacity: 0.7;}\n");
2f6a59070559786428d9eaf199ae3d61772b2225Kay Sievers svg(" line { stroke: rgb(64,64,64); stroke-width: 1; }\n");
6d0274f11547a0f11200bb82bf598a5a253e12cfLennart Poettering svg(" line.sec5 { stroke-width: 2; }\n");
5ffa8c818120e35c89becd938d160235c069dd12Zbigniew Jędrzejewski-Szmek svg(" line.sec01 { stroke: rgb(224,224,224); stroke-width: 1; }\n");
5ffa8c818120e35c89becd938d160235c069dd12Zbigniew Jędrzejewski-Szmek svg(" line.dot { stroke-dasharray: 2 4; }\n");
2667cc25896a15f82f9f1583e80d416beb1316e1Thomas Hindoe Paaboel Andersen svg(" line.idle { stroke: rgb(64,64,64); stroke-dasharray: 10 6; stroke-opacity: 0.7; }\n");
d95a74ed1191bb09f5be57b0619d3d77708e019dLennart Poettering svg(" .run { font-size: 8; font-style: italic; }\n");
d95a74ed1191bb09f5be57b0619d3d77708e019dLennart Poettering svg(" text { font-family: Verdana, Helvetica; font-size: 10; }\n");
6d0274f11547a0f11200bb82bf598a5a253e12cfLennart Poetteringstatic void svg_title(void)
b92bea5d2a9481de69bb627a7b442a9f58fca43dZbigniew Jędrzejewski-Szmek f = fopen("/proc/cmdline", "r");
9f6eb1cd58f2ddf2eb6ba0e4de056e13d938af75Kay Sievers /* extract root fs so we can find disk model name in sysfs */
a281d9c7851b16c4c9195d042901540ee9ced799Thomas Hindoe Paaboel Andersen sprintf(filename, "/sys/block/%s/device/model", rootbdev);
ffc06c3513d9a0693c7f810d03b20705127ba55aKay Sievers fprintf(stderr, "Error reading disk model for %s\n", rootbdev);
da927ba997d68401563b927f92e6e40e021a8e5cMichal Schmidt /* various utsname parameters */
adacb9575a09981fcf11279f2f661e3fc21e58ffLennart Poettering fprintf(stderr, "Error getting uname info\n");
ffc06c3513d9a0693c7f810d03b20705127ba55aKay Sievers strftime(date, sizeof(date), "%a, %d %b %Y %H:%M:%S %z", localtime(&t));
ffc06c3513d9a0693c7f810d03b20705127ba55aKay Sievers /* CPU type */
a281d9c7851b16c4c9195d042901540ee9ced799Thomas Hindoe Paaboel Andersen if (strstr(buf, "model name")) {
6d0274f11547a0f11200bb82bf598a5a253e12cfLennart Poettering /* Build - 1st line from /etc/system-release */
a281d9c7851b16c4c9195d042901540ee9ced799Thomas Hindoe Paaboel Andersen svg("<text class=\"t1\" x=\"0\" y=\"30\">Bootchart for %s - %s</text>\n",
a281d9c7851b16c4c9195d042901540ee9ced799Thomas Hindoe Paaboel Andersen svg("<text class=\"t2\" x=\"20\" y=\"50\">System: %s %s %s %s</text>\n",
a281d9c7851b16c4c9195d042901540ee9ced799Thomas Hindoe Paaboel Andersen uts.sysname, uts.release, uts.version, uts.machine);
a281d9c7851b16c4c9195d042901540ee9ced799Thomas Hindoe Paaboel Andersen svg("<text class=\"t2\" x=\"20\" y=\"65\">CPU: %s</text>\n",
a281d9c7851b16c4c9195d042901540ee9ced799Thomas Hindoe Paaboel Andersen svg("<text class=\"t2\" x=\"20\" y=\"80\">Disk: %s</text>\n",
a281d9c7851b16c4c9195d042901540ee9ced799Thomas Hindoe Paaboel Andersen svg("<text class=\"t2\" x=\"20\" y=\"95\">Boot options: %s</text>\n",
a281d9c7851b16c4c9195d042901540ee9ced799Thomas Hindoe Paaboel Andersen svg("<text class=\"t2\" x=\"20\" y=\"110\">Build: %s</text>\n",
6d0274f11547a0f11200bb82bf598a5a253e12cfLennart Poettering svg("<text class=\"t2\" x=\"20\" y=\"125\">Log start time: %.03fs</text>\n", log_start);
6d0274f11547a0f11200bb82bf598a5a253e12cfLennart Poettering svg("<text class=\"t2\" x=\"20\" y=\"140\">Idle time: ");
6d0274f11547a0f11200bb82bf598a5a253e12cfLennart Poettering svg("<text class=\"sec\" x=\"20\" y=\"155\">Graph data: %.03f samples/sec, recorded %i total, dropped %i samples, %i processes, %i filtered</text>\n",
a281d9c7851b16c4c9195d042901540ee9ced799Thomas Hindoe Paaboel Andersenstatic void svg_graph_box(int height)
e5609878d8802e2469c433be418bcbcf55fbe63bLennart Poettering /* outside box, fill */
a281d9c7851b16c4c9195d042901540ee9ced799Thomas Hindoe Paaboel Andersen svg("<rect class=\"box\" x=\"%.03f\" y=\"0\" width=\"%.03f\" height=\"%.03f\" />\n",
a281d9c7851b16c4c9195d042901540ee9ced799Thomas Hindoe Paaboel Andersen time_to_graph(sampletime[samples-1] - graph_start),
6d0274f11547a0f11200bb82bf598a5a253e12cfLennart Poettering for (d = graph_start; d <= sampletime[samples-1];
a281d9c7851b16c4c9195d042901540ee9ced799Thomas Hindoe Paaboel Andersen d += (scale_x < 2.0 ? 60.0 : scale_x < 10.0 ? 1.0 : 0.1)) {
a281d9c7851b16c4c9195d042901540ee9ced799Thomas Hindoe Paaboel Andersen /* lines for each second */
e5609878d8802e2469c433be418bcbcf55fbe63bLennart Poettering if (i % 50 == 0)
6d0274f11547a0f11200bb82bf598a5a253e12cfLennart Poettering svg(" <line class=\"sec5\" x1=\"%.03f\" y1=\"0\" x2=\"%.03f\" y2=\"%.03f\" />\n",
6d0274f11547a0f11200bb82bf598a5a253e12cfLennart Poettering else if (i % 10 == 0)
6d0274f11547a0f11200bb82bf598a5a253e12cfLennart Poettering svg(" <line class=\"sec1\" x1=\"%.03f\" y1=\"0\" x2=\"%.03f\" y2=\"%.03f\" />\n",
6d0274f11547a0f11200bb82bf598a5a253e12cfLennart Poettering svg(" <line class=\"sec01\" x1=\"%.03f\" y1=\"0\" x2=\"%.03f\" y2=\"%.03f\" />\n",
a281d9c7851b16c4c9195d042901540ee9ced799Thomas Hindoe Paaboel Andersen time_to_graph(d - graph_start),
a281d9c7851b16c4c9195d042901540ee9ced799Thomas Hindoe Paaboel Andersen svg(" <text class=\"sec\" x=\"%.03f\" y=\"%.03f\" >%.01fs</text>\n",
a281d9c7851b16c4c9195d042901540ee9ced799Thomas Hindoe Paaboel Andersen time_to_graph(d - graph_start),
a281d9c7851b16c4c9195d042901540ee9ced799Thomas Hindoe Paaboel Andersenstatic void svg_pss_graph(void)
6d0274f11547a0f11200bb82bf598a5a253e12cfLennart Poettering svg("\n\n<!-- Pss memory size graph -->\n");
6d0274f11547a0f11200bb82bf598a5a253e12cfLennart Poettering svg("\n <text class=\"t2\" x=\"5\" y=\"-15\">Memory allocation - Pss</text>\n");
e5609878d8802e2469c433be418bcbcf55fbe63bLennart Poettering /* vsize 1000 == 1000mb */
e5609878d8802e2469c433be418bcbcf55fbe63bLennart Poettering /* draw some hlines for usable memory sizes */
6d0274f11547a0f11200bb82bf598a5a253e12cfLennart Poettering for (i = 100000; i < 1000000; i += 100000) {
6d0274f11547a0f11200bb82bf598a5a253e12cfLennart Poettering svg(" <line class=\"sec01\" x1=\"%.03f\" y1=\"%.0f\" x2=\"%.03f\" y2=\"%.0f\"/>\n",
a281d9c7851b16c4c9195d042901540ee9ced799Thomas Hindoe Paaboel Andersen time_to_graph(sampletime[samples-1] - graph_start),
a281d9c7851b16c4c9195d042901540ee9ced799Thomas Hindoe Paaboel Andersen svg(" <text class=\"sec\" x=\"%.03f\" y=\"%.0f\">%dM</text>\n",
a281d9c7851b16c4c9195d042901540ee9ced799Thomas Hindoe Paaboel Andersen time_to_graph(sampletime[samples-1] - graph_start) + 5,
a281d9c7851b16c4c9195d042901540ee9ced799Thomas Hindoe Paaboel Andersen kb_to_graph(i), (1000000 - i) / 1000);
a281d9c7851b16c4c9195d042901540ee9ced799Thomas Hindoe Paaboel Andersen /* now plot the graph itself */
a281d9c7851b16c4c9195d042901540ee9ced799Thomas Hindoe Paaboel Andersen for (i = 1; i < samples ; i++) {
6d0274f11547a0f11200bb82bf598a5a253e12cfLennart Poettering /* put all the small pss blocks into the bottom */
6d0274f11547a0f11200bb82bf598a5a253e12cfLennart Poettering if (ps->sample[i].pss <= (100 * scale_y))
6d0274f11547a0f11200bb82bf598a5a253e12cfLennart Poettering svg(" <rect class=\"clrw\" style=\"fill: %s\" x=\"%.03f\" y=\"%.03f\" width=\"%.03f\" height=\"%.03f\" />\n",
6d0274f11547a0f11200bb82bf598a5a253e12cfLennart Poettering "rgb(64,64,64)",
6d0274f11547a0f11200bb82bf598a5a253e12cfLennart Poettering time_to_graph(sampletime[i - 1] - graph_start),
601185b43da638b1c74153deae01dbd518680889Zbigniew Jędrzejewski-Szmek time_to_graph(sampletime[i] - sampletime[i - 1]),
4f8f66cb4236783cd3cbee97fefc9aaa8469ac08Zbigniew Jędrzejewski-Szmek /* now plot the ones that are of significant size */
4f8f66cb4236783cd3cbee97fefc9aaa8469ac08Zbigniew Jędrzejewski-Szmek /* don't draw anything smaller than 2mb */
4f8f66cb4236783cd3cbee97fefc9aaa8469ac08Zbigniew Jędrzejewski-Szmek if (ps->sample[i].pss > (100 * scale_y)) {
07a062a79374406e8f6b5a1e2f80c80baf031567Jason St. John svg(" <rect class=\"clrw\" style=\"fill: %s\" x=\"%.03f\" y=\"%.03f\" width=\"%.03f\" height=\"%.03f\" />\n",
3906ab4adf0aa7b952e39100262a11acd55cd79bRonny Chevalier time_to_graph(sampletime[i - 1] - graph_start),
6d0274f11547a0f11200bb82bf598a5a253e12cfLennart Poettering time_to_graph(sampletime[i] - sampletime[i - 1]),
c978343015c787713651dff571acb5207367f5f2Lennart Poettering /* overlay all the text labels */
c978343015c787713651dff571acb5207367f5f2Lennart Poettering /* put all the small pss blocks into the bottom */
6d0274f11547a0f11200bb82bf598a5a253e12cfLennart Poettering if (ps->sample[i].pss <= (100 * scale_y))
601185b43da638b1c74153deae01dbd518680889Zbigniew Jędrzejewski-Szmek /* now plot the ones that are of significant size */
601185b43da638b1c74153deae01dbd518680889Zbigniew Jędrzejewski-Szmek /* don't draw anything smaller than 2mb */
6d0274f11547a0f11200bb82bf598a5a253e12cfLennart Poettering if (ps->sample[i].pss > (100 * scale_y)) {
6d0274f11547a0f11200bb82bf598a5a253e12cfLennart Poettering /* draw a label with the process / PID */
6d0274f11547a0f11200bb82bf598a5a253e12cfLennart Poettering if ((i == 1) || (ps->sample[i - 1].pss <= (100 * scale_y)))
6d0274f11547a0f11200bb82bf598a5a253e12cfLennart Poettering svg(" <text x=\"%.03f\" y=\"%.03f\">%s [%i]</text>\n",
6d0274f11547a0f11200bb82bf598a5a253e12cfLennart Poettering time_to_graph(sampletime[i] - graph_start),
a281d9c7851b16c4c9195d042901540ee9ced799Thomas Hindoe Paaboel Andersen kb_to_graph(1000000.0 - bottom - ((top - bottom) / 2)),
6d0274f11547a0f11200bb82bf598a5a253e12cfLennart Poettering /* debug output - full data dump */
6d0274f11547a0f11200bb82bf598a5a253e12cfLennart Poettering svg("\n\n<!-- PSS map - csv format -->\n");
c978343015c787713651dff571acb5207367f5f2Lennart Poettering svg("<!-- %s [%d] pss=", ps->name, ps->pid);
6d0274f11547a0f11200bb82bf598a5a253e12cfLennart Poettering for (i = 0; i < samples ; i++) {
6d0274f11547a0f11200bb82bf598a5a253e12cfLennart Poetteringstatic void svg_io_bi_bar(void)
6d0274f11547a0f11200bb82bf598a5a253e12cfLennart Poettering svg("<!-- IO utilization graph - In -->\n");
6d0274f11547a0f11200bb82bf598a5a253e12cfLennart Poettering svg("<text class=\"t2\" x=\"5\" y=\"-15\">IO utilization - read</text>\n");
6d0274f11547a0f11200bb82bf598a5a253e12cfLennart Poettering * calculate rounding range
6d0274f11547a0f11200bb82bf598a5a253e12cfLennart Poettering * We need to round IO data since IO block data is not updated on
6d0274f11547a0f11200bb82bf598a5a253e12cfLennart Poettering * each poll. Applying a smoothing function loses some burst data,
6d0274f11547a0f11200bb82bf598a5a253e12cfLennart Poettering * so keep the smoothing range short.
6d0274f11547a0f11200bb82bf598a5a253e12cfLennart Poettering /* surrounding box */
6d0274f11547a0f11200bb82bf598a5a253e12cfLennart Poettering /* find the max IO first */
6d0274f11547a0f11200bb82bf598a5a253e12cfLennart Poettering stop = min(i + (range / 2), samples - 1);
6d0274f11547a0f11200bb82bf598a5a253e12cfLennart Poettering tot = (double)(blockstat[stop].bi - blockstat[start].bi)
6d0274f11547a0f11200bb82bf598a5a253e12cfLennart Poettering tot = (double)(blockstat[stop].bo - blockstat[start].bo)
6d0274f11547a0f11200bb82bf598a5a253e12cfLennart Poettering tot = (double)(blockstat[stop].bi - blockstat[start].bi)
6d0274f11547a0f11200bb82bf598a5a253e12cfLennart Poettering svg("<rect class=\"bi\" x=\"%.03f\" y=\"%.03f\" width=\"%.03f\" height=\"%.03f\" />\n",
6d0274f11547a0f11200bb82bf598a5a253e12cfLennart Poettering time_to_graph(sampletime[i - 1] - graph_start),
6d0274f11547a0f11200bb82bf598a5a253e12cfLennart Poettering time_to_graph(sampletime[i] - sampletime[i - 1]),
6d0274f11547a0f11200bb82bf598a5a253e12cfLennart Poettering /* labels around highest value */
6d0274f11547a0f11200bb82bf598a5a253e12cfLennart Poettering svg(" <text class=\"sec\" x=\"%.03f\" y=\"%.03f\">%0.2fmb/sec</text>\n",
6d0274f11547a0f11200bb82bf598a5a253e12cfLennart Poettering time_to_graph(sampletime[i] - graph_start) + 5,
6d0274f11547a0f11200bb82bf598a5a253e12cfLennart Poettering ((scale_y * 5) - (pbi * (scale_y * 5))) + 15,
6d0274f11547a0f11200bb82bf598a5a253e12cfLennart Poettering max / 1024.0 / (interval / 1000000000.0));
6d0274f11547a0f11200bb82bf598a5a253e12cfLennart Poetteringstatic void svg_io_bo_bar(void)
6d0274f11547a0f11200bb82bf598a5a253e12cfLennart Poettering svg("<!-- IO utilization graph - out -->\n");
6d0274f11547a0f11200bb82bf598a5a253e12cfLennart Poettering svg("<text class=\"t2\" x=\"5\" y=\"-15\">IO utilization - write</text>\n");
249968612f16a71df909d6e73785c18a9ff36a65Lennart Poettering * calculate rounding range
6d0274f11547a0f11200bb82bf598a5a253e12cfLennart Poettering * We need to round IO data since IO block data is not updated on
a9cdc94f7ff40f22a3cf9472f612a80730a1b010Dave Reisner * each poll. Applying a smoothing function loses some burst data,
6d0274f11547a0f11200bb82bf598a5a253e12cfLennart Poettering * so keep the smoothing range short.
6d0274f11547a0f11200bb82bf598a5a253e12cfLennart Poettering /* surrounding box */
da927ba997d68401563b927f92e6e40e021a8e5cMichal Schmidt /* find the max IO first */
a281d9c7851b16c4c9195d042901540ee9ced799Thomas Hindoe Paaboel Andersen for (i = 1; i < samples; i++) {
a281d9c7851b16c4c9195d042901540ee9ced799Thomas Hindoe Paaboel Andersen start = max(i - ((range / 2) - 1), 0);
6d0274f11547a0f11200bb82bf598a5a253e12cfLennart Poettering stop = min(i + (range / 2), samples - 1);
84f6181c2ac99a0514ca5e0c8fc8c8e284caf789Lennart Poettering tot = (double)(blockstat[stop].bi - blockstat[start].bi)
max_here = i;
int start;
int stop;
double tot;
double pbo;
if (i == max_here) {
static void svg_cpu_bar(void)
double trt;
double ptrt;
for (c = 0; c < cpus; c++)
static void svg_wait_bar(void)
double twt;
double ptwt;
for (c = 0; c < cpus; c++)
static void svg_entropy_bar(void)
if (!ps)
return ps;
return NULL;
if (!filter)
int ret;
int usecs;
kcount = 0;
if (!count_only) {
kcount = 0;
while (!feof(f)) {
func[z] = 0;
if (count_only) {
kcount++;
func,
kcount++;
static void svg_ps_bars(void)
int pid;
double starttime;
if (!ps)
ps_to_graph(j),
ps_to_graph(j),
double crt;
double brt;
for (c = 0; c < cpus; c++)
idletime);
-scale_y,
idletime);
static void svg_top_ten_cpu(void)
static void svg_top_ten_pss(void)
void svg_do(void)
pcount++;
pfiltered++;
svg_header();
svg_cpu_bar();
svg_wait_bar();
if (kcount) {
svg_do_initcall(0);
svg_ps_bars();
svg_title();
if (entropy) {
if (pss) {