diff options
author | Theodore Ts'o <tytso@mit.edu> | 2013-02-06 22:30:23 -0500 |
---|---|---|
committer | Theodore Ts'o <tytso@mit.edu> | 2013-02-06 22:30:23 -0500 |
commit | 9fff24aa2c5c504aadead1ff9599e813604c2e53 (patch) | |
tree | 24bbb1691ec816aed648a895882526ce361ec92f | |
parent | 40ae3487628235e5f1eb27542cca0cdb6e5dbe16 (diff) |
jbd2: track request delay statistics
Track the delay between when we first request that the commit begin
and when it actually begins, so we can see how much of a gap exists.
In theory, this should just be the remaining scheduling quantuum of
the thread which requested the commit (assuming it was not a
synchronous operation which triggered the commit request) plus
scheduling overhead; however, it's possible that real time processes
might get in the way of letting the kjournald thread from executing.
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
-rw-r--r-- | fs/jbd2/commit.c | 8 | ||||
-rw-r--r-- | fs/jbd2/journal.c | 12 | ||||
-rw-r--r-- | fs/jbd2/transaction.c | 1 | ||||
-rw-r--r-- | include/linux/jbd2.h | 7 | ||||
-rw-r--r-- | include/trace/events/jbd2.h | 8 |
5 files changed, 31 insertions, 5 deletions
diff --git a/fs/jbd2/commit.c b/fs/jbd2/commit.c index 3091d42992f0..750c70148eff 100644 --- a/fs/jbd2/commit.c +++ b/fs/jbd2/commit.c | |||
@@ -435,7 +435,12 @@ void jbd2_journal_commit_transaction(journal_t *journal) | |||
435 | 435 | ||
436 | trace_jbd2_commit_locking(journal, commit_transaction); | 436 | trace_jbd2_commit_locking(journal, commit_transaction); |
437 | stats.run.rs_wait = commit_transaction->t_max_wait; | 437 | stats.run.rs_wait = commit_transaction->t_max_wait; |
438 | stats.run.rs_request_delay = 0; | ||
438 | stats.run.rs_locked = jiffies; | 439 | stats.run.rs_locked = jiffies; |
440 | if (commit_transaction->t_requested) | ||
441 | stats.run.rs_request_delay = | ||
442 | jbd2_time_diff(commit_transaction->t_requested, | ||
443 | stats.run.rs_locked); | ||
439 | stats.run.rs_running = jbd2_time_diff(commit_transaction->t_start, | 444 | stats.run.rs_running = jbd2_time_diff(commit_transaction->t_start, |
440 | stats.run.rs_locked); | 445 | stats.run.rs_locked); |
441 | 446 | ||
@@ -1116,7 +1121,10 @@ restart_loop: | |||
1116 | */ | 1121 | */ |
1117 | spin_lock(&journal->j_history_lock); | 1122 | spin_lock(&journal->j_history_lock); |
1118 | journal->j_stats.ts_tid++; | 1123 | journal->j_stats.ts_tid++; |
1124 | if (commit_transaction->t_requested) | ||
1125 | journal->j_stats.ts_requested++; | ||
1119 | journal->j_stats.run.rs_wait += stats.run.rs_wait; | 1126 | journal->j_stats.run.rs_wait += stats.run.rs_wait; |
1127 | journal->j_stats.run.rs_request_delay += stats.run.rs_request_delay; | ||
1120 | journal->j_stats.run.rs_running += stats.run.rs_running; | 1128 | journal->j_stats.run.rs_running += stats.run.rs_running; |
1121 | journal->j_stats.run.rs_locked += stats.run.rs_locked; | 1129 | journal->j_stats.run.rs_locked += stats.run.rs_locked; |
1122 | journal->j_stats.run.rs_flushing += stats.run.rs_flushing; | 1130 | journal->j_stats.run.rs_flushing += stats.run.rs_flushing; |
diff --git a/fs/jbd2/journal.c b/fs/jbd2/journal.c index 1a80e3146a59..4ba2e81e35ac 100644 --- a/fs/jbd2/journal.c +++ b/fs/jbd2/journal.c | |||
@@ -533,6 +533,7 @@ int __jbd2_log_start_commit(journal_t *journal, tid_t target) | |||
533 | jbd_debug(1, "JBD2: requesting commit %d/%d\n", | 533 | jbd_debug(1, "JBD2: requesting commit %d/%d\n", |
534 | journal->j_commit_request, | 534 | journal->j_commit_request, |
535 | journal->j_commit_sequence); | 535 | journal->j_commit_sequence); |
536 | journal->j_running_transaction->t_requested = jiffies; | ||
536 | wake_up(&journal->j_wait_commit); | 537 | wake_up(&journal->j_wait_commit); |
537 | return 1; | 538 | return 1; |
538 | } else if (!tid_geq(journal->j_commit_request, target)) | 539 | } else if (!tid_geq(journal->j_commit_request, target)) |
@@ -898,13 +899,18 @@ static int jbd2_seq_info_show(struct seq_file *seq, void *v) | |||
898 | 899 | ||
899 | if (v != SEQ_START_TOKEN) | 900 | if (v != SEQ_START_TOKEN) |
900 | return 0; | 901 | return 0; |
901 | seq_printf(seq, "%lu transaction, each up to %u blocks\n", | 902 | seq_printf(seq, "%lu transactions (%lu requested), " |
902 | s->stats->ts_tid, | 903 | "each up to %u blocks\n", |
903 | s->journal->j_max_transaction_buffers); | 904 | s->stats->ts_tid, s->stats->ts_requested, |
905 | s->journal->j_max_transaction_buffers); | ||
904 | if (s->stats->ts_tid == 0) | 906 | if (s->stats->ts_tid == 0) |
905 | return 0; | 907 | return 0; |
906 | seq_printf(seq, "average: \n %ums waiting for transaction\n", | 908 | seq_printf(seq, "average: \n %ums waiting for transaction\n", |
907 | jiffies_to_msecs(s->stats->run.rs_wait / s->stats->ts_tid)); | 909 | jiffies_to_msecs(s->stats->run.rs_wait / s->stats->ts_tid)); |
910 | seq_printf(seq, " %ums request delay\n", | ||
911 | (s->stats->ts_requested == 0) ? 0 : | ||
912 | jiffies_to_msecs(s->stats->run.rs_request_delay / | ||
913 | s->stats->ts_requested)); | ||
908 | seq_printf(seq, " %ums running transaction\n", | 914 | seq_printf(seq, " %ums running transaction\n", |
909 | jiffies_to_msecs(s->stats->run.rs_running / s->stats->ts_tid)); | 915 | jiffies_to_msecs(s->stats->run.rs_running / s->stats->ts_tid)); |
910 | seq_printf(seq, " %ums transaction was being locked\n", | 916 | seq_printf(seq, " %ums transaction was being locked\n", |
diff --git a/fs/jbd2/transaction.c b/fs/jbd2/transaction.c index df9f29760efa..735609e2d636 100644 --- a/fs/jbd2/transaction.c +++ b/fs/jbd2/transaction.c | |||
@@ -100,6 +100,7 @@ jbd2_get_transaction(journal_t *journal, transaction_t *transaction) | |||
100 | journal->j_running_transaction = transaction; | 100 | journal->j_running_transaction = transaction; |
101 | transaction->t_max_wait = 0; | 101 | transaction->t_max_wait = 0; |
102 | transaction->t_start = jiffies; | 102 | transaction->t_start = jiffies; |
103 | transaction->t_requested = 0; | ||
103 | 104 | ||
104 | return transaction; | 105 | return transaction; |
105 | } | 106 | } |
diff --git a/include/linux/jbd2.h b/include/linux/jbd2.h index e30b66346942..e0aafc46064f 100644 --- a/include/linux/jbd2.h +++ b/include/linux/jbd2.h | |||
@@ -581,6 +581,11 @@ struct transaction_s | |||
581 | unsigned long t_start; | 581 | unsigned long t_start; |
582 | 582 | ||
583 | /* | 583 | /* |
584 | * When commit was requested | ||
585 | */ | ||
586 | unsigned long t_requested; | ||
587 | |||
588 | /* | ||
584 | * Checkpointing stats [j_checkpoint_sem] | 589 | * Checkpointing stats [j_checkpoint_sem] |
585 | */ | 590 | */ |
586 | struct transaction_chp_stats_s t_chp_stats; | 591 | struct transaction_chp_stats_s t_chp_stats; |
@@ -637,6 +642,7 @@ struct transaction_s | |||
637 | 642 | ||
638 | struct transaction_run_stats_s { | 643 | struct transaction_run_stats_s { |
639 | unsigned long rs_wait; | 644 | unsigned long rs_wait; |
645 | unsigned long rs_request_delay; | ||
640 | unsigned long rs_running; | 646 | unsigned long rs_running; |
641 | unsigned long rs_locked; | 647 | unsigned long rs_locked; |
642 | unsigned long rs_flushing; | 648 | unsigned long rs_flushing; |
@@ -649,6 +655,7 @@ struct transaction_run_stats_s { | |||
649 | 655 | ||
650 | struct transaction_stats_s { | 656 | struct transaction_stats_s { |
651 | unsigned long ts_tid; | 657 | unsigned long ts_tid; |
658 | unsigned long ts_requested; | ||
652 | struct transaction_run_stats_s run; | 659 | struct transaction_run_stats_s run; |
653 | }; | 660 | }; |
654 | 661 | ||
diff --git a/include/trace/events/jbd2.h b/include/trace/events/jbd2.h index 127993dbf322..5419f57beb1f 100644 --- a/include/trace/events/jbd2.h +++ b/include/trace/events/jbd2.h | |||
@@ -142,6 +142,7 @@ TRACE_EVENT(jbd2_run_stats, | |||
142 | __field( dev_t, dev ) | 142 | __field( dev_t, dev ) |
143 | __field( unsigned long, tid ) | 143 | __field( unsigned long, tid ) |
144 | __field( unsigned long, wait ) | 144 | __field( unsigned long, wait ) |
145 | __field( unsigned long, request_delay ) | ||
145 | __field( unsigned long, running ) | 146 | __field( unsigned long, running ) |
146 | __field( unsigned long, locked ) | 147 | __field( unsigned long, locked ) |
147 | __field( unsigned long, flushing ) | 148 | __field( unsigned long, flushing ) |
@@ -155,6 +156,7 @@ TRACE_EVENT(jbd2_run_stats, | |||
155 | __entry->dev = dev; | 156 | __entry->dev = dev; |
156 | __entry->tid = tid; | 157 | __entry->tid = tid; |
157 | __entry->wait = stats->rs_wait; | 158 | __entry->wait = stats->rs_wait; |
159 | __entry->request_delay = stats->rs_request_delay; | ||
158 | __entry->running = stats->rs_running; | 160 | __entry->running = stats->rs_running; |
159 | __entry->locked = stats->rs_locked; | 161 | __entry->locked = stats->rs_locked; |
160 | __entry->flushing = stats->rs_flushing; | 162 | __entry->flushing = stats->rs_flushing; |
@@ -164,10 +166,12 @@ TRACE_EVENT(jbd2_run_stats, | |||
164 | __entry->blocks_logged = stats->rs_blocks_logged; | 166 | __entry->blocks_logged = stats->rs_blocks_logged; |
165 | ), | 167 | ), |
166 | 168 | ||
167 | TP_printk("dev %d,%d tid %lu wait %u running %u locked %u flushing %u " | 169 | TP_printk("dev %d,%d tid %lu wait %u request_delay %u running %u " |
168 | "logging %u handle_count %u blocks %u blocks_logged %u", | 170 | "locked %u flushing %u logging %u handle_count %u " |
171 | "blocks %u blocks_logged %u", | ||
169 | MAJOR(__entry->dev), MINOR(__entry->dev), __entry->tid, | 172 | MAJOR(__entry->dev), MINOR(__entry->dev), __entry->tid, |
170 | jiffies_to_msecs(__entry->wait), | 173 | jiffies_to_msecs(__entry->wait), |
174 | jiffies_to_msecs(__entry->request_delay), | ||
171 | jiffies_to_msecs(__entry->running), | 175 | jiffies_to_msecs(__entry->running), |
172 | jiffies_to_msecs(__entry->locked), | 176 | jiffies_to_msecs(__entry->locked), |
173 | jiffies_to_msecs(__entry->flushing), | 177 | jiffies_to_msecs(__entry->flushing), |