bcache: add journal statistic
authorTang Junhui <tang.junhui@zte.com.cn>
Wed, 7 Feb 2018 19:41:39 +0000 (11:41 -0800)
committerJens Axboe <axboe@kernel.dk>
Wed, 7 Feb 2018 19:50:01 +0000 (12:50 -0700)
Sometimes, Journal takes up a lot of CPU, we need statistics
to know what's the journal is doing. So this patch provide
some journal statistics:
1) reclaim: how many times the journal try to reclaim resource,
   usually the journal bucket or/and the pin are exhausted.
2) flush_write: how many times the journal try to flush btree node
   to cache device, usually the journal bucket are exhausted.
3) retry_flush_write: how many times the journal retry to flush
   the next btree node, usually the previous tree node have been
   flushed by other thread.
we show these statistic by sysfs interface. Through these statistics
We can totally see the status of journal module when the CPU is too
high.

Signed-off-by: Tang Junhui <tang.junhui@zte.com.cn>
Reviewed-by: Michael Lyle <mlyle@lyle.org>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
drivers/md/bcache/bcache.h
drivers/md/bcache/journal.c
drivers/md/bcache/sysfs.c

index 5e2d4e80198e596e426f05a7a902b3eff54bb3ac..b98d7705acb67b43463406b2d3d74f753bfac268 100644 (file)
@@ -658,6 +658,10 @@ struct cache_set {
        atomic_long_t           writeback_keys_done;
        atomic_long_t           writeback_keys_failed;
 
+       atomic_long_t           reclaim;
+       atomic_long_t           flush_write;
+       atomic_long_t           retry_flush_write;
+
        enum                    {
                ON_ERROR_UNREGISTER,
                ON_ERROR_PANIC,
index a87165c1d8e5262d01962eb706b60ff9fd02cb78..f5296007a9d506c4bd41ae30ae058c673637b2f1 100644 (file)
@@ -377,6 +377,8 @@ static void btree_flush_write(struct cache_set *c)
         */
        struct btree *b, *best;
        unsigned i;
+
+       atomic_long_inc(&c->flush_write);
 retry:
        best = NULL;
 
@@ -397,6 +399,7 @@ retry:
                if (!btree_current_write(b)->journal) {
                        mutex_unlock(&b->write_lock);
                        /* We raced */
+                       atomic_long_inc(&c->retry_flush_write);
                        goto retry;
                }
 
@@ -476,6 +479,8 @@ static void journal_reclaim(struct cache_set *c)
        unsigned iter, n = 0;
        atomic_t p;
 
+       atomic_long_inc(&c->reclaim);
+
        while (!atomic_read(&fifo_front(&c->journal.pin)))
                fifo_pop(&c->journal.pin, p);
 
index b4184092c7279fa2fe1246f6a3e70650c850d6a1..46e7a6b3e7c7d7d4e8e7106a20f915b408f1b7d1 100644 (file)
@@ -65,6 +65,9 @@ read_attribute(bset_tree_stats);
 
 read_attribute(state);
 read_attribute(cache_read_races);
+read_attribute(reclaim);
+read_attribute(flush_write);
+read_attribute(retry_flush_write);
 read_attribute(writeback_keys_done);
 read_attribute(writeback_keys_failed);
 read_attribute(io_errors);
@@ -545,6 +548,15 @@ SHOW(__bch_cache_set)
        sysfs_print(cache_read_races,
                    atomic_long_read(&c->cache_read_races));
 
+       sysfs_print(reclaim,
+                   atomic_long_read(&c->reclaim));
+
+       sysfs_print(flush_write,
+                   atomic_long_read(&c->flush_write));
+
+       sysfs_print(retry_flush_write,
+                   atomic_long_read(&c->retry_flush_write));
+
        sysfs_print(writeback_keys_done,
                    atomic_long_read(&c->writeback_keys_done));
        sysfs_print(writeback_keys_failed,
@@ -731,6 +743,9 @@ static struct attribute *bch_cache_set_internal_files[] = {
 
        &sysfs_bset_tree_stats,
        &sysfs_cache_read_races,
+       &sysfs_reclaim,
+       &sysfs_flush_write,
+       &sysfs_retry_flush_write,
        &sysfs_writeback_keys_done,
        &sysfs_writeback_keys_failed,