X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;f=gfio.c;h=d2fd94aa0dd5bdd3d1afcbef9699efaa18743e67;hb=ba35aa8dbd78cc59e2f29d3d746ad3be912a0541;hp=52389beffae70df40f074b2b81491850ff33f672;hpb=343cb4a98200757bdcb0c5203e9120bb777625a8;p=fio.git diff --git a/gfio.c b/gfio.c index 52389bef..d2fd94aa 100644 --- a/gfio.c +++ b/gfio.c @@ -34,6 +34,7 @@ static int gfio_server_running; static const char *gfio_graph_font; +static unsigned int gfio_graph_limit = 100; static void view_log(GtkWidget *w, gpointer data); @@ -68,7 +69,7 @@ struct probe_widget { }; struct eta_widget { - GtkWidget *name; + GtkWidget *names; GtkWidget *iotype; GtkWidget *ioengine; GtkWidget *iodepth; @@ -173,6 +174,21 @@ static void gfio_update_thread_status(struct gui_entry *ge, char *status_message static void gfio_update_thread_status_all(char *status_message, double perc); void report_error(GError *error); +static void iops_graph_y_axis_unit_change(struct graph *g, int power_of_ten) +{ + switch (power_of_ten) { + case 9: graph_y_title(g, "Billions of IOs / sec"); + break; + case 6: graph_y_title(g, "Millions of IOs / sec"); + break; + case 3: graph_y_title(g, "Thousands of IOs / sec"); + break; + case 0: + default: graph_y_title(g, "IOs / sec"); + break; + } +} + static struct graph *setup_iops_graph(void) { struct graph *g; @@ -185,10 +201,26 @@ static struct graph *setup_iops_graph(void) graph_add_label(g, "Write IOPS"); graph_set_color(g, "Read IOPS", 0.13, 0.54, 0.13); graph_set_color(g, "Write IOPS", 1.0, 0.0, 0.0); - line_graph_set_data_count_limit(g, 100); + line_graph_set_data_count_limit(g, gfio_graph_limit); + graph_y_axis_unit_change_notify(g, iops_graph_y_axis_unit_change); return g; } +static void bandwidth_graph_y_axis_unit_change(struct graph *g, int power_of_ten) +{ + switch (power_of_ten) { + case 9: graph_y_title(g, "Petabytes / sec"); + break; + case 6: graph_y_title(g, "Gigabytes / sec"); + break; + case 3: graph_y_title(g, "Megabytes / sec"); + break; + case 0: + default: graph_y_title(g, "Kilobytes / sec"); + break; + } +} + static struct graph *setup_bandwidth_graph(void) { struct graph *g; @@ -202,6 +234,7 @@ static struct graph *setup_bandwidth_graph(void) graph_set_color(g, "Read Bandwidth", 0.13, 0.54, 0.13); graph_set_color(g, "Write Bandwidth", 1.0, 0.0, 0.0); line_graph_set_data_count_limit(g, 100); + graph_y_axis_unit_change_notify(g, bandwidth_graph_y_axis_unit_change); return g; } @@ -217,7 +250,10 @@ static void clear_ge_ui_info(struct gui_entry *ge) gtk_label_set_text(GTK_LABEL(ge->probe.os), ""); gtk_label_set_text(GTK_LABEL(ge->probe.arch), ""); gtk_label_set_text(GTK_LABEL(ge->probe.fio_ver), ""); +#if 0 + /* should we empty it... */ gtk_entry_set_text(GTK_ENTRY(ge->eta.name), ""); +#endif gtk_entry_set_text(GTK_ENTRY(ge->eta.iotype), ""); gtk_entry_set_text(GTK_ENTRY(ge->eta.ioengine), ""); gtk_entry_set_text(GTK_ENTRY(ge->eta.iodepth), ""); @@ -229,6 +265,18 @@ static void clear_ge_ui_info(struct gui_entry *ge) gtk_entry_set_text(GTK_ENTRY(ge->eta.write_iops), ""); } +static GtkWidget *new_combo_entry_in_frame(GtkWidget *box, const char *label) +{ + GtkWidget *entry, *frame; + + frame = gtk_frame_new(label); + entry = gtk_combo_box_new_text(); + gtk_box_pack_start(GTK_BOX(box), frame, TRUE, TRUE, 3); + gtk_container_add(GTK_CONTAINER(frame), entry); + + return entry; +} + static GtkWidget *new_info_entry_in_frame(GtkWidget *box, const char *label) { GtkWidget *entry, *frame; @@ -876,6 +924,8 @@ static GtkWidget *get_results_window(struct gui_entry *ge) g_signal_connect(win, "destroy", G_CALLBACK(results_window_delete), ge); notebook = gtk_notebook_new(); + gtk_notebook_set_scrollable(GTK_NOTEBOOK(notebook), 1); + gtk_notebook_popup_enable(GTK_NOTEBOOK(notebook)); gtk_container_add(GTK_CONTAINER(win), notebook); ge->results_window = win; @@ -1249,6 +1299,8 @@ static void gfio_update_all_eta(struct jobs_eta *je) gtk_entry_set_text(GTK_ENTRY(ui->eta.cw_iops), "---"); #endif + entry_set_int_value(ui->eta.jobs, je->nr_running); + if (je->eta_sec != INT_MAX && je->nr_running) { char *iops_str[2]; char *rate_str[2]; @@ -1372,7 +1424,9 @@ static void gfio_add_job_op(struct fio_client *client, struct fio_net_cmd *cmd) gtk_label_set_text(GTK_LABEL(ge->page_label), (gchar *) o->name); - gtk_entry_set_text(GTK_ENTRY(ge->eta.name), (gchar *) o->name); + gtk_combo_box_append_text(GTK_COMBO_BOX(ge->eta.names), (gchar *) o->name); + gtk_combo_box_set_active(GTK_COMBO_BOX(ge->eta.names), 0); + gtk_entry_set_text(GTK_ENTRY(ge->eta.iotype), ddir_str(o->td_ddir)); gtk_entry_set_text(GTK_ENTRY(ge->eta.ioengine), (gchar *) o->ioengine); @@ -1442,6 +1496,7 @@ struct client_ops gfio_client_ops = { .add_job = gfio_add_job_op, .timed_out = gfio_client_timed_out, .stop = gfio_client_stop, + .eta_msec = FIO_CLIENT_DEF_ETA_MSEC, .stay_connected = 1, }; @@ -2000,9 +2055,29 @@ static void view_log(GtkWidget *w, gpointer data) gtk_widget_show_all(win); } +static void __update_graph_limits(struct gfio_graphs *g) +{ + line_graph_set_data_count_limit(g->iops_graph, gfio_graph_limit); + line_graph_set_data_count_limit(g->bandwidth_graph, gfio_graph_limit); +} + +static void update_graph_limits(void) +{ + struct flist_head *entry; + struct gui_entry *ge; + + __update_graph_limits(&main_ui.graphs); + + flist_for_each(entry, &main_ui.list) { + ge = flist_entry(entry, struct gui_entry, list); + __update_graph_limits(&ge->graphs); + } +} + static void preferences(GtkWidget *w, gpointer data) { GtkWidget *dialog, *frame, *box, **buttons, *vbox, *font; + GtkWidget *hbox, *spin, *entry, *spin_int; int i; dialog = gtk_dialog_new_with_buttons("Preferences", @@ -2012,9 +2087,40 @@ static void preferences(GtkWidget *w, gpointer data) GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, NULL); - frame = gtk_frame_new("Debug logging"); + frame = gtk_frame_new("Graphing"); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), frame, FALSE, FALSE, 5); + vbox = gtk_vbox_new(FALSE, 6); + gtk_container_add(GTK_CONTAINER(frame), vbox); + + hbox = gtk_hbox_new(FALSE, 5); + gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 5); + entry = gtk_label_new("Font face to use for graph labels"); + gtk_box_pack_start(GTK_BOX(hbox), entry, TRUE, TRUE, 5); + + font = gtk_font_button_new(); + gtk_box_pack_start(GTK_BOX(hbox), font, FALSE, FALSE, 5); + box = gtk_vbox_new(FALSE, 6); + gtk_box_pack_start(GTK_BOX(vbox), box, FALSE, FALSE, 5); + + hbox = gtk_hbox_new(FALSE, 5); + gtk_box_pack_start(GTK_BOX(box), hbox, TRUE, TRUE, 5); + entry = gtk_label_new("Maximum number of data points in graph (seconds)"); + gtk_box_pack_start(GTK_BOX(hbox), entry, FALSE, FALSE, 5); + + spin = create_spinbutton(hbox, 10, 1000000, 100); + + box = gtk_vbox_new(FALSE, 6); + gtk_box_pack_start(GTK_BOX(vbox), box, FALSE, FALSE, 5); + + hbox = gtk_hbox_new(FALSE, 5); + gtk_box_pack_start(GTK_BOX(box), hbox, TRUE, TRUE, 5); + entry = gtk_label_new("Client ETA request interval (msec)"); + gtk_box_pack_start(GTK_BOX(hbox), entry, FALSE, FALSE, 5); + + spin_int = create_spinbutton(hbox, 100, 100000, gfio_client_ops.eta_msec); + frame = gtk_frame_new("Debug logging"); + gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), frame, FALSE, FALSE, 5); vbox = gtk_vbox_new(FALSE, 6); gtk_container_add(GTK_CONTAINER(frame), vbox); @@ -2035,14 +2141,6 @@ static void preferences(GtkWidget *w, gpointer data) gtk_box_pack_start(GTK_BOX(box), buttons[i], FALSE, FALSE, 6); } - frame = gtk_frame_new("Graph font"); - gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), frame, FALSE, FALSE, 5); - vbox = gtk_vbox_new(FALSE, 6); - gtk_container_add(GTK_CONTAINER(frame), vbox); - - font = gtk_font_button_new(); - gtk_box_pack_start(GTK_BOX(vbox), font, FALSE, FALSE, 5); - gtk_widget_show_all(dialog); if (gtk_dialog_run(GTK_DIALOG(dialog)) != GTK_RESPONSE_ACCEPT) { @@ -2059,6 +2157,10 @@ static void preferences(GtkWidget *w, gpointer data) } gfio_graph_font = strdup(gtk_font_button_get_font_name(GTK_FONT_BUTTON(font))); + gfio_graph_limit = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(spin)); + update_graph_limits(); + gfio_client_ops.eta_msec = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(spin_int)); + gtk_widget_destroy(dialog); } @@ -2189,7 +2291,7 @@ static GtkWidget *new_client_page(struct gui_entry *ge) probe_box = gtk_hbox_new(FALSE, 3); gtk_box_pack_start(GTK_BOX(probe_frame), probe_box, FALSE, FALSE, 3); - ge->eta.name = new_info_entry_in_frame(probe_box, "Name"); + ge->eta.names = new_combo_entry_in_frame(probe_box, "Jobs"); ge->eta.iotype = new_info_entry_in_frame(probe_box, "IO"); ge->eta.ioengine = new_info_entry_in_frame(probe_box, "IO Engine"); ge->eta.iodepth = new_info_entry_in_frame(probe_box, "IO Depth"); @@ -2288,6 +2390,7 @@ static GtkWidget *new_main_page(struct gui *ui) probe_box = gtk_hbox_new(FALSE, 3); gtk_box_pack_start(GTK_BOX(probe_frame), probe_box, FALSE, FALSE, 3); + ui->eta.jobs = new_info_entry_in_frame(probe_box, "Running"); ui->eta.read_bw = new_info_entry_in_frame(probe_box, "Read BW"); ui->eta.read_iops = new_info_entry_in_frame(probe_box, "IOPS"); ui->eta.write_bw = new_info_entry_in_frame(probe_box, "Write BW"); @@ -2394,6 +2497,8 @@ static void init_ui(int *argc, char **argv[], struct gui *ui) ui->notebook = gtk_notebook_new(); g_signal_connect(ui->notebook, "switch-page", G_CALLBACK(notebook_switch_page), ui); + gtk_notebook_set_scrollable(GTK_NOTEBOOK(ui->notebook), 1); + gtk_notebook_popup_enable(GTK_NOTEBOOK(ui->notebook)); gtk_container_add(GTK_CONTAINER(ui->vbox), ui->notebook); vbox = new_main_page(ui);