From d9acfb71dbfb6e916b9752593158698b8021b28c Mon Sep 17 00:00:00 2001 From: Thomas Hindoe Paaboel Andersen Date: Wed, 15 May 2013 21:18:26 +0200 Subject: [PATCH] analyze: show unit file loading on plot This will add another color to the legend called "Loading unit files" Like the generators it will mark a part of the systemd bar indicating the time spent while loading unit files. --- src/analyze/systemd-analyze.c | 21 +++++++++++++++++++-- src/core/dbus-manager.c | 8 ++++++++ src/core/manager.c | 2 ++ src/core/manager.h | 2 ++ 4 files changed, 31 insertions(+), 2 deletions(-) diff --git a/src/analyze/systemd-analyze.c b/src/analyze/systemd-analyze.c index df3d30724..6d97256c7 100644 --- a/src/analyze/systemd-analyze.c +++ b/src/analyze/systemd-analyze.c @@ -80,6 +80,8 @@ struct boot_times { usec_t finish_time; usec_t generators_start_time; usec_t generators_finish_time; + usec_t unitsload_start_time; + usec_t unitsload_finish_time; }; struct unit_times { char *name; @@ -315,7 +317,17 @@ static int acquire_boot_times(DBusConnection *bus, struct boot_times **bt) { "/org/freedesktop/systemd1", "org.freedesktop.systemd1.Manager", "GeneratorsFinishTimestampMonotonic", - ×.generators_finish_time) < 0) + ×.generators_finish_time) < 0 || + bus_get_uint64_property(bus, + "/org/freedesktop/systemd1", + "org.freedesktop.systemd1.Manager", + "UnitsLoadStartTimestampMonotonic", + ×.unitsload_start_time) < 0 || + bus_get_uint64_property(bus, + "/org/freedesktop/systemd1", + "org.freedesktop.systemd1.Manager", + "UnitsLoadFinishTimestampMonotonic", + ×.unitsload_finish_time) < 0) return -EIO; if (times.finish_time <= 0) { @@ -472,7 +484,7 @@ static int analyze_plot(DBusConnection *bus) { svg("\n\n", 80.0 + width, 150.0 + (m * SCALE_Y) + - 4 * SCALE_Y /* legend */); + 5 * SCALE_Y /* legend */); /* write some basic info as a comment, including some help */ svg("\n" @@ -494,6 +506,7 @@ static int analyze_plot(DBusConnection *bus) { " rect.loader { fill: rgb(150,150,150); fill-opacity: 0.7; }\n" " rect.userspace { fill: rgb(150,150,150); fill-opacity: 0.7; }\n" " rect.generators { fill: rgb(102,204,255); fill-opacity: 0.7; }\n" + " rect.unitsload { fill: rgb( 82,184,255); fill-opacity: 0.7; }\n" " rect.box { fill: rgb(240,240,240); stroke: rgb(192,192,192); }\n" " line { stroke: rgb(64,64,64); stroke-width: 1; }\n" "// line.sec1 { }\n" @@ -535,6 +548,7 @@ static int analyze_plot(DBusConnection *bus) { } svg_bar("active", boot->userspace_time, boot->finish_time, y); svg_bar("generators", boot->generators_start_time, boot->generators_finish_time, y); + svg_bar("unitsload", boot->unitsload_start_time, boot->unitsload_finish_time, y); svg_text("left", boot->userspace_time, y, "systemd"); y++; @@ -572,6 +586,9 @@ static int analyze_plot(DBusConnection *bus) { svg_bar("generators", 0, 300000, y); svg_text("right", 400000, y, "Generators"); y++; + svg_bar("unitsload", 0, 300000, y); + svg_text("right", 400000, y, "Loading unit files"); + y++; svg("\n\n"); diff --git a/src/core/dbus-manager.c b/src/core/dbus-manager.c index 988c06aa4..25d38cc49 100644 --- a/src/core/dbus-manager.c +++ b/src/core/dbus-manager.c @@ -286,6 +286,10 @@ " \n" \ " \n" \ " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ " \n" \ " \n" \ " \n" \ @@ -595,6 +599,10 @@ static const BusProperty bus_manager_properties[] = { { "GeneratorsStartTimestampMonotonic", bus_property_append_uint64, "t", offsetof(Manager, generators_start_timestamp.monotonic) }, { "GeneratorsFinishTimestamp", bus_property_append_uint64, "t", offsetof(Manager, generators_finish_timestamp.realtime) }, { "GeneratorsFinishTimestampMonotonic", bus_property_append_uint64, "t", offsetof(Manager, generators_finish_timestamp.monotonic) }, + { "UnitsLoadStartTimestamp", bus_property_append_uint64, "t", offsetof(Manager, unitsload_start_timestamp.realtime) }, + { "UnitsLoadStartTimestampMonotonic", bus_property_append_uint64, "t", offsetof(Manager, unitsload_start_timestamp.monotonic) }, + { "UnitsLoadFinishTimestamp", bus_property_append_uint64, "t", offsetof(Manager, unitsload_finish_timestamp.realtime) }, + { "UnitsLoadFinishTimestampMonotonic", bus_property_append_uint64, "t", offsetof(Manager, unitsload_finish_timestamp.monotonic) }, { "LogLevel", bus_manager_append_log_level, "s", 0, false, bus_manager_set_log_level }, { "LogTarget", bus_manager_append_log_target, "s", 0, false, bus_manager_set_log_target }, { "NNames", bus_manager_append_n_names, "u", 0 }, diff --git a/src/core/manager.c b/src/core/manager.c index 73f4c102e..f16621ac2 100644 --- a/src/core/manager.c +++ b/src/core/manager.c @@ -847,7 +847,9 @@ int manager_startup(Manager *m, FILE *serialization, FDSet *fds) { m->n_reloading ++; /* First, enumerate what we can from all config files */ + dual_timestamp_get(&m->unitsload_start_timestamp); r = manager_enumerate(m); + dual_timestamp_get(&m->unitsload_finish_timestamp); /* Second, deserialize if there is something to deserialize */ if (serialization) { diff --git a/src/core/manager.h b/src/core/manager.h index 5d777e6ed..dcc4ebed9 100644 --- a/src/core/manager.h +++ b/src/core/manager.h @@ -152,6 +152,8 @@ struct Manager { dual_timestamp finish_timestamp; dual_timestamp generators_start_timestamp; dual_timestamp generators_finish_timestamp; + dual_timestamp unitsload_start_timestamp; + dual_timestamp unitsload_finish_timestamp; char *generator_unit_path; char *generator_unit_path_early; -- 2.30.2