For completeness here is also a screenshot of how the generators are shown in the plot. (The plot was generated on an old computer with a HDD)
On Wed, May 15, 2013 at 10:19 AM, Umut Tezduyar <u...@tezduyar.com> wrote: > Hi, > > I have updated the patches with Thomas's suggestion. Thanks. > > > On Tue, May 14, 2013 at 8:52 AM, Thomas H.P. Andersen <pho...@gmail.com> > wrote: >> >> On Wed, May 8, 2013 at 6:03 PM, Umut Tezduyar <u...@tezduyar.com> wrote: >> > --- >> > src/analyze/systemd-analyze.c | 42 ++++++++++++++++++++++++++++---- >> > src/core/dbus-manager.c | 8 ++++++ >> > src/core/manager.c | 2 + >> > src/core/manager.h | 2 + >> > 4 files changed, 48 insertions(+), 6 deletions(-) >> > >> > diff --git a/src/analyze/systemd-analyze.c >> > b/src/analyze/systemd-analyze.c >> > index bb86ec7..df3d307 100644 >> > --- a/src/analyze/systemd-analyze.c >> > +++ b/src/analyze/systemd-analyze.c >> > @@ -78,6 +78,8 @@ struct boot_times { >> > usec_t initrd_time; >> > usec_t userspace_time; >> > usec_t finish_time; >> > + usec_t generators_start_time; >> > + usec_t generators_finish_time; >> > }; >> > struct unit_times { >> > char *name; >> > @@ -303,7 +305,17 @@ static int acquire_boot_times(DBusConnection *bus, >> > struct boot_times **bt) { >> > "/org/freedesktop/systemd1", >> > "org.freedesktop.systemd1.Manager", >> > "FinishTimestampMonotonic", >> > - ×.finish_time) < 0) >> > + ×.finish_time) < 0 || >> > + bus_get_uint64_property(bus, >> > + "/org/freedesktop/systemd1", >> > + "org.freedesktop.systemd1.Manager", >> > + >> > "GeneratorsStartTimestampMonotonic", >> > + ×.generators_start_time) < 0 >> > || >> > + bus_get_uint64_property(bus, >> > + "/org/freedesktop/systemd1", >> > + "org.freedesktop.systemd1.Manager", >> > + >> > "GeneratorsFinishTimestampMonotonic", >> > + ×.generators_finish_time) < 0) >> > return -EIO; >> > >> > if (times.finish_time <= 0) { >> > @@ -459,7 +471,8 @@ static int analyze_plot(DBusConnection *bus) { >> > >> > svg("<svg width=\"%.0fpx\" height=\"%.0fpx\" version=\"1.1\" " >> > "xmlns=\"http://www.w3.org/2000/svg\">\n\n", >> > - 80.0 + width, 150.0 + (m * SCALE_Y)); >> > + 80.0 + width, 150.0 + (m * SCALE_Y) + >> > + 4 * SCALE_Y /* legend */); >> > >> > /* write some basic info as a comment, including some help */ >> > svg("<!-- This file is a systemd-analyze SVG file. It is best >> > rendered in a -->\n" >> > @@ -480,6 +493,7 @@ static int analyze_plot(DBusConnection *bus) { >> > " rect.firmware { fill: rgb(150,150,150); >> > fill-opacity: 0.7; }\n" >> > " 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.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" >> > @@ -495,8 +509,6 @@ static int analyze_plot(DBusConnection *bus) { >> > svg("<text x=\"20\" y=\"30\">%s %s (%s %s) %s</text>", >> > isempty(osname) ? "Linux" : osname, >> > name.nodename, name.release, name.version, name.machine); >> > - svg("<text x=\"20\" y=\"%.0f\">Legend: Red = Activating; Pink = >> > Active; Dark Pink = Deactivating</text>", >> > - 120.0 + (m *SCALE_Y)); >> > >> > svg("<g transform=\"translate(%.3f,100)\">\n", 20.0 + (SCALE_X >> > * boot->firmware_time)); >> > svg_graph_box(m, -boot->firmware_time, boot->finish_time); >> > @@ -521,8 +533,9 @@ static int analyze_plot(DBusConnection *bus) { >> > svg_text(true, boot->initrd_time, y, "initrd"); >> > y++; >> > } >> > - svg_bar("userspace", boot->userspace_time, boot->finish_time, >> > y); >> > - svg_text("left", boot->userspace_time, y, "userspace"); >> > + svg_bar("active", boot->userspace_time, boot->finish_time, y); >> > + svg_bar("generators", boot->generators_start_time, >> > boot->generators_finish_time, y); >> > + svg_text("left", boot->userspace_time, y, "systemd"); >> > y++; >> > >> > for (u = times; u < times + n; u++) { >> > @@ -544,6 +557,23 @@ static int analyze_plot(DBusConnection *bus) { >> > svg_text(b, u->ixt, y, "%s", u->name); >> > y++; >> > } >> > + >> > + /* Legend */ >> > + y++; >> > + svg_bar("activating", 0, 300000, y); >> > + svg_text("right", 400000, y, "Activating"); >> > + y++; >> > + svg_bar("active", 0, 300000, y); >> > + svg_text("right", 400000, y, "Active"); >> > + y++; >> > + svg_bar("deactivating", 0, 300000, y); >> > + svg_text("right", 400000, y, "Deactivating"); >> > + y++; >> > + svg_bar("generators", 0, 300000, y); >> > + svg_text("right", 400000, y, "Generators"); >> > + y++; >> > + >> > + >> It would be nice to see a full screenshot that includes the new legend >> area. >> >> > svg("</g>\n\n"); >> > >> > svg("</svg>"); >> > diff --git a/src/core/dbus-manager.c b/src/core/dbus-manager.c >> > index 56b02a1..c932437 100644 >> > --- a/src/core/dbus-manager.c >> > +++ b/src/core/dbus-manager.c >> > @@ -275,6 +275,10 @@ >> > " <property name=\"UserspaceTimestampMonotonic\" type=\"t\" >> > access=\"read\"/>\n" \ >> > " <property name=\"FinishTimestamp\" type=\"t\" >> > access=\"read\"/>\n" \ >> > " <property name=\"FinishTimestampMonotonic\" type=\"t\" >> > access=\"read\"/>\n" \ >> > + " <property name=\"GeneratorsStartTimestamp\" type=\"t\" >> > access=\"read\"/>\n" \ >> > + " <property name=\"GeneratorsStartTimestampMonotonic\" >> > type=\"t\" access=\"read\"/>\n" \ >> > + " <property name=\"GeneratorsFinishTimestamp\" type=\"t\" >> > access=\"read\"/>\n" \ >> > + " <property name=\"GeneratorsFinishTimestampMonotonic\" >> > type=\"t\" access=\"read\"/>\n" \ >> > " <property name=\"LogLevel\" type=\"s\" >> > access=\"readwrite\"/>\n" \ >> > " <property name=\"LogTarget\" type=\"s\" >> > access=\"readwrite\"/>\n" \ >> > " <property name=\"NNames\" type=\"u\" access=\"read\"/>\n" >> > \ >> > @@ -580,6 +584,10 @@ static const BusProperty bus_manager_properties[] = >> > { >> > { "UserspaceTimestampMonotonic", bus_property_append_uint64, >> > "t", offsetof(Manager, userspace_timestamp.monotonic) }, >> > { "FinishTimestamp", bus_property_append_uint64, >> > "t", offsetof(Manager, finish_timestamp.realtime) }, >> > { "FinishTimestampMonotonic", bus_property_append_uint64, >> > "t", offsetof(Manager, finish_timestamp.monotonic) }, >> > + { "GeneratorsStartTimestamp", >> > bus_property_append_uint64, "t", offsetof(Manager, >> > generators_start_timestamp.realtime) }, >> > + { "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) }, >> > { "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 c7f8f20..7b7ace6 100644 >> > --- a/src/core/manager.c >> > +++ b/src/core/manager.c >> > @@ -2525,7 +2525,9 @@ void manager_run_generators(Manager *m) { >> > argv[4] = NULL; >> > >> > RUN_WITH_UMASK(0022) { >> > + dual_timestamp_get(&m->generators_start_timestamp); >> > execute_directory(generator_path, d, (char**) argv); >> > + dual_timestamp_get(&m->generators_finish_timestamp); >> > } >> The timestamps can be overwritten later as this is also called from >> manager_reload. You cancheck with dual_timestamp_is_set to avoid that. >> >> Or simply move the timestamps out into manager_startup. This will make >> them also include the create/trim of the generator directories. This >> might make sense if we are trying to find the total time cost of the >> generators. >> >> > trim_generator_dir(m, &m->generator_unit_path); >> > diff --git a/src/core/manager.h b/src/core/manager.h >> > index bf83354..5d777e6 100644 >> > --- a/src/core/manager.h >> > +++ b/src/core/manager.h >> > @@ -150,6 +150,8 @@ struct Manager { >> > dual_timestamp initrd_timestamp; >> > dual_timestamp userspace_timestamp; >> > dual_timestamp finish_timestamp; >> > + dual_timestamp generators_start_timestamp; >> > + dual_timestamp generators_finish_timestamp; >> > >> > char *generator_unit_path; >> > char *generator_unit_path_early; >> > -- >> > 1.7.2.5 >> > >> > _______________________________________________ >> > systemd-devel mailing list >> > systemd-devel@lists.freedesktop.org >> > http://lists.freedesktop.org/mailman/listinfo/systemd-devel > >
<<attachment: sysd.png>>
_______________________________________________ systemd-devel mailing list systemd-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/systemd-devel