aboutsummaryrefslogtreecommitdiffstats
path: root/fs/jbd2/commit.c
diff options
context:
space:
mode:
authorJohann Lombardi <johann.lombardi@bull.net>2008-01-28 23:58:27 -0500
committerTheodore Ts'o <tytso@mit.edu>2008-01-28 23:58:27 -0500
commit8e85fb3f305b24b79c6d9cb7a56d22b062335ad3 (patch)
tree9b037c1b1649bce1338911fd8ca3980229c1548a /fs/jbd2/commit.c
parent4df3d265bf8f3762e1d77f554ee279c39dedb020 (diff)
jbd2: jbd2 stats through procfs
The patch below updates the jbd stats patch to 2.6.20/jbd2. The initial patch was posted by Alex Tomas in December 2005 (http://marc.info/?l=linux-ext4&m=113538565128617&w=2). It provides statistics via procfs such as transaction lifetime and size. Sometimes, investigating performance problems, i find useful to have stats from jbd about transaction's lifetime, size, etc. here is a patch for review and inclusion probably. for example, stats after creation of 3M files in htree directory: [root@bob ~]# cat /proc/fs/jbd/sda/history R/C tid wait run lock flush log hndls block inlog ctime write drop close R 261 8260 2720 0 0 750 9892 8170 8187 C 259 750 0 4885 1 R 262 20 2200 10 0 770 9836 8170 8187 R 263 30 2200 10 0 3070 9812 8170 8187 R 264 0 5000 10 0 1340 0 0 0 C 261 8240 3212 4957 0 R 265 8260 1470 0 0 4640 9854 8170 8187 R 266 0 5000 10 0 1460 0 0 0 C 262 8210 2989 4868 0 R 267 8230 1490 10 0 4440 9875 8171 8188 R 268 0 5000 10 0 1260 0 0 0 C 263 7710 2937 4908 0 R 269 7730 1470 10 0 3330 9841 8170 8187 R 270 0 5000 10 0 830 0 0 0 C 265 8140 3234 4898 0 C 267 720 0 4849 1 R 271 8630 2740 20 0 740 9819 8170 8187 C 269 800 0 4214 1 R 272 40 2170 10 0 830 9716 8170 8187 R 273 40 2280 0 0 3530 9799 8170 8187 R 274 0 5000 10 0 990 0 0 0 where, R - line for transaction's life from T_RUNNING to T_FINISHED C - line for transaction's checkpointing tid - transaction's id wait - for how long we were waiting for new transaction to start (the longest period journal_start() took in this transaction) run - real transaction's lifetime (from T_RUNNING to T_LOCKED lock - how long we were waiting for all handles to close (time the transaction was in T_LOCKED) flush - how long it took to flush all data (data=ordered) log - how long it took to write the transaction to the log hndls - how many handles got to the transaction block - how many blocks got to the transaction inlog - how many blocks are written to the log (block + descriptors) ctime - how long it took to checkpoint the transaction write - how many blocks have been written during checkpointing drop - how many blocks have been dropped during checkpointing close - how many running transactions have been closed to checkpoint this one all times are in msec. [root@bob ~]# cat /proc/fs/jbd/sda/info 280 transaction, each upto 8192 blocks average: 1633ms waiting for transaction 3616ms running transaction 5ms transaction was being locked 1ms flushing data (in ordered mode) 1799ms logging transaction 11781 handles per transaction 5629 blocks per transaction 5641 logged blocks per transaction Signed-off-by: Johann Lombardi <johann.lombardi@bull.net> Signed-off-by: Mariusz Kozlowski <m.kozlowski@tuxland.pl> Signed-off-by: Mingming Cao <cmm@us.ibm.com> Signed-off-by: Eric Sandeen <sandeen@redhat.com>
Diffstat (limited to 'fs/jbd2/commit.c')
-rw-r--r--fs/jbd2/commit.c49
1 files changed, 49 insertions, 0 deletions
diff --git a/fs/jbd2/commit.c b/fs/jbd2/commit.c
index 39b5cee3dd8a..8749a86f4175 100644
--- a/fs/jbd2/commit.c
+++ b/fs/jbd2/commit.c
@@ -20,6 +20,7 @@
20#include <linux/slab.h> 20#include <linux/slab.h>
21#include <linux/mm.h> 21#include <linux/mm.h>
22#include <linux/pagemap.h> 22#include <linux/pagemap.h>
23#include <linux/jiffies.h>
23 24
24/* 25/*
25 * Default IO end handler for temporary BJ_IO buffer_heads. 26 * Default IO end handler for temporary BJ_IO buffer_heads.
@@ -290,6 +291,7 @@ static inline void write_tag_block(int tag_bytes, journal_block_tag_t *tag,
290 */ 291 */
291void jbd2_journal_commit_transaction(journal_t *journal) 292void jbd2_journal_commit_transaction(journal_t *journal)
292{ 293{
294 struct transaction_stats_s stats;
293 transaction_t *commit_transaction; 295 transaction_t *commit_transaction;
294 struct journal_head *jh, *new_jh, *descriptor; 296 struct journal_head *jh, *new_jh, *descriptor;
295 struct buffer_head **wbuf = journal->j_wbuf; 297 struct buffer_head **wbuf = journal->j_wbuf;
@@ -337,6 +339,11 @@ void jbd2_journal_commit_transaction(journal_t *journal)
337 spin_lock(&journal->j_state_lock); 339 spin_lock(&journal->j_state_lock);
338 commit_transaction->t_state = T_LOCKED; 340 commit_transaction->t_state = T_LOCKED;
339 341
342 stats.u.run.rs_wait = commit_transaction->t_max_wait;
343 stats.u.run.rs_locked = jiffies;
344 stats.u.run.rs_running = jbd2_time_diff(commit_transaction->t_start,
345 stats.u.run.rs_locked);
346
340 spin_lock(&commit_transaction->t_handle_lock); 347 spin_lock(&commit_transaction->t_handle_lock);
341 while (commit_transaction->t_updates) { 348 while (commit_transaction->t_updates) {
342 DEFINE_WAIT(wait); 349 DEFINE_WAIT(wait);
@@ -407,6 +414,10 @@ void jbd2_journal_commit_transaction(journal_t *journal)
407 */ 414 */
408 jbd2_journal_switch_revoke_table(journal); 415 jbd2_journal_switch_revoke_table(journal);
409 416
417 stats.u.run.rs_flushing = jiffies;
418 stats.u.run.rs_locked = jbd2_time_diff(stats.u.run.rs_locked,
419 stats.u.run.rs_flushing);
420
410 commit_transaction->t_state = T_FLUSH; 421 commit_transaction->t_state = T_FLUSH;
411 journal->j_committing_transaction = commit_transaction; 422 journal->j_committing_transaction = commit_transaction;
412 journal->j_running_transaction = NULL; 423 journal->j_running_transaction = NULL;
@@ -498,6 +509,12 @@ void jbd2_journal_commit_transaction(journal_t *journal)
498 */ 509 */
499 commit_transaction->t_state = T_COMMIT; 510 commit_transaction->t_state = T_COMMIT;
500 511
512 stats.u.run.rs_logging = jiffies;
513 stats.u.run.rs_flushing = jbd2_time_diff(stats.u.run.rs_flushing,
514 stats.u.run.rs_logging);
515 stats.u.run.rs_blocks = commit_transaction->t_outstanding_credits;
516 stats.u.run.rs_blocks_logged = 0;
517
501 descriptor = NULL; 518 descriptor = NULL;
502 bufs = 0; 519 bufs = 0;
503 while (commit_transaction->t_buffers) { 520 while (commit_transaction->t_buffers) {
@@ -646,6 +663,7 @@ start_journal_io:
646 submit_bh(WRITE, bh); 663 submit_bh(WRITE, bh);
647 } 664 }
648 cond_resched(); 665 cond_resched();
666 stats.u.run.rs_blocks_logged += bufs;
649 667
650 /* Force a new descriptor to be generated next 668 /* Force a new descriptor to be generated next
651 time round the loop. */ 669 time round the loop. */
@@ -816,6 +834,7 @@ restart_loop:
816 cp_transaction = jh->b_cp_transaction; 834 cp_transaction = jh->b_cp_transaction;
817 if (cp_transaction) { 835 if (cp_transaction) {
818 JBUFFER_TRACE(jh, "remove from old cp transaction"); 836 JBUFFER_TRACE(jh, "remove from old cp transaction");
837 cp_transaction->t_chp_stats.cs_dropped++;
819 __jbd2_journal_remove_checkpoint(jh); 838 __jbd2_journal_remove_checkpoint(jh);
820 } 839 }
821 840
@@ -890,6 +909,36 @@ restart_loop:
890 909
891 J_ASSERT(commit_transaction->t_state == T_COMMIT); 910 J_ASSERT(commit_transaction->t_state == T_COMMIT);
892 911
912 commit_transaction->t_start = jiffies;
913 stats.u.run.rs_logging = jbd2_time_diff(stats.u.run.rs_logging,
914 commit_transaction->t_start);
915
916 /*
917 * File the transaction for history
918 */
919 stats.ts_type = JBD2_STATS_RUN;
920 stats.ts_tid = commit_transaction->t_tid;
921 stats.u.run.rs_handle_count = commit_transaction->t_handle_count;
922 spin_lock(&journal->j_history_lock);
923 memcpy(journal->j_history + journal->j_history_cur, &stats,
924 sizeof(stats));
925 if (++journal->j_history_cur == journal->j_history_max)
926 journal->j_history_cur = 0;
927
928 /*
929 * Calculate overall stats
930 */
931 journal->j_stats.ts_tid++;
932 journal->j_stats.u.run.rs_wait += stats.u.run.rs_wait;
933 journal->j_stats.u.run.rs_running += stats.u.run.rs_running;
934 journal->j_stats.u.run.rs_locked += stats.u.run.rs_locked;
935 journal->j_stats.u.run.rs_flushing += stats.u.run.rs_flushing;
936 journal->j_stats.u.run.rs_logging += stats.u.run.rs_logging;
937 journal->j_stats.u.run.rs_handle_count += stats.u.run.rs_handle_count;
938 journal->j_stats.u.run.rs_blocks += stats.u.run.rs_blocks;
939 journal->j_stats.u.run.rs_blocks_logged += stats.u.run.rs_blocks_logged;
940 spin_unlock(&journal->j_history_lock);
941
893 commit_transaction->t_state = T_FINISHED; 942 commit_transaction->t_state = T_FINISHED;
894 J_ASSERT(commit_transaction == journal->j_committing_transaction); 943 J_ASSERT(commit_transaction == journal->j_committing_transaction);
895 journal->j_commit_sequence = commit_transaction->t_tid; 944 journal->j_commit_sequence = commit_transaction->t_tid;