In bcachefs, io_read and io_write counter record the amount
of data which has been read and written. They increase in
unit of sector, so to display correctly, they need to be
shifted to the left by the size of a sector. Other counters
like io_move, move_extent_{read, write, finish} also have
this problem.
In order to support different unit, we add extra column to
record the unit of this counter in BCH_PERSISTENT_COUNTERS().
Fixes: 1c6fdbd8f246 ("bcachefs: Initial commit")
Signed-off-by: Hongbo Li <[email protected]>
---
When I read one 15.7M file, the io_read sysfs interface shows:
- Before this patch
- original:
since mount: 0 B
since filesystem creation: 5.11 KiB
- after read:
since mount: 31.4 KiB
since filesystem creation: 36.5 KiB
- After this patch:
- original:
since mount: 0 B
since filesystem creation: 18.3 MiB
- after read:
since mount: 15.7 MiB
since filesystem creation: 34.0 MiB
v2:
- Add extra column to represent the unit for counters.
v1:
https://lore.kernel.org/r/all/[email protected]/T/
---
fs/bcachefs/sb-counters_format.h | 160 +++++++++++++++----------------
fs/bcachefs/sysfs.c | 4 +-
2 files changed, 83 insertions(+), 81 deletions(-)
diff --git a/fs/bcachefs/sb-counters_format.h b/fs/bcachefs/sb-counters_format.h
index 62ea478215d0..da1f462b9f9c 100644
--- a/fs/bcachefs/sb-counters_format.h
+++ b/fs/bcachefs/sb-counters_format.h
@@ -2,86 +2,86 @@
#ifndef _BCACHEFS_SB_COUNTERS_FORMAT_H
#define _BCACHEFS_SB_COUNTERS_FORMAT_H
-#define BCH_PERSISTENT_COUNTERS() \
- x(io_read, 0) \
- x(io_write, 1) \
- x(io_move, 2) \
- x(bucket_invalidate, 3) \
- x(bucket_discard, 4) \
- x(bucket_alloc, 5) \
- x(bucket_alloc_fail, 6) \
- x(btree_cache_scan, 7) \
- x(btree_cache_reap, 8) \
- x(btree_cache_cannibalize, 9) \
- x(btree_cache_cannibalize_lock, 10) \
- x(btree_cache_cannibalize_lock_fail, 11) \
- x(btree_cache_cannibalize_unlock, 12) \
- x(btree_node_write, 13) \
- x(btree_node_read, 14) \
- x(btree_node_compact, 15) \
- x(btree_node_merge, 16) \
- x(btree_node_split, 17) \
- x(btree_node_rewrite, 18) \
- x(btree_node_alloc, 19) \
- x(btree_node_free, 20) \
- x(btree_node_set_root, 21) \
- x(btree_path_relock_fail, 22) \
- x(btree_path_upgrade_fail, 23) \
- x(btree_reserve_get_fail, 24) \
- x(journal_entry_full, 25) \
- x(journal_full, 26) \
- x(journal_reclaim_finish, 27) \
- x(journal_reclaim_start, 28) \
- x(journal_write, 29) \
- x(read_promote, 30) \
- x(read_bounce, 31) \
- x(read_split, 33) \
- x(read_retry, 32) \
- x(read_reuse_race, 34) \
- x(move_extent_read, 35) \
- x(move_extent_write, 36) \
- x(move_extent_finish, 37) \
- x(move_extent_fail, 38) \
- x(move_extent_start_fail, 39) \
- x(copygc, 40) \
- x(copygc_wait, 41) \
- x(gc_gens_end, 42) \
- x(gc_gens_start, 43) \
- x(trans_blocked_journal_reclaim, 44) \
- x(trans_restart_btree_node_reused, 45) \
- x(trans_restart_btree_node_split, 46) \
- x(trans_restart_fault_inject, 47) \
- x(trans_restart_iter_upgrade, 48) \
- x(trans_restart_journal_preres_get, 49) \
- x(trans_restart_journal_reclaim, 50) \
- x(trans_restart_journal_res_get, 51) \
- x(trans_restart_key_cache_key_realloced, 52) \
- x(trans_restart_key_cache_raced, 53) \
- x(trans_restart_mark_replicas, 54) \
- x(trans_restart_mem_realloced, 55) \
- x(trans_restart_memory_allocation_failure, 56) \
- x(trans_restart_relock, 57) \
- x(trans_restart_relock_after_fill, 58) \
- x(trans_restart_relock_key_cache_fill, 59) \
- x(trans_restart_relock_next_node, 60) \
- x(trans_restart_relock_parent_for_fill, 61) \
- x(trans_restart_relock_path, 62) \
- x(trans_restart_relock_path_intent, 63) \
- x(trans_restart_too_many_iters, 64) \
- x(trans_restart_traverse, 65) \
- x(trans_restart_upgrade, 66) \
- x(trans_restart_would_deadlock, 67) \
- x(trans_restart_would_deadlock_write, 68) \
- x(trans_restart_injected, 69) \
- x(trans_restart_key_cache_upgrade, 70) \
- x(trans_traverse_all, 71) \
- x(transaction_commit, 72) \
- x(write_super, 73) \
- x(trans_restart_would_deadlock_recursion_limit, 74) \
- x(trans_restart_write_buffer_flush, 75) \
- x(trans_restart_split_race, 76) \
- x(write_buffer_flush_slowpath, 77) \
- x(write_buffer_flush_sync, 78)
+#define BCH_PERSISTENT_COUNTERS() \
+ x(io_read, 0, 512) \
+ x(io_write, 1, 512) \
+ x(io_move, 2, 512) \
+ x(bucket_invalidate, 3, 1) \
+ x(bucket_discard, 4, 1) \
+ x(bucket_alloc, 5, 1) \
+ x(bucket_alloc_fail, 6, 1) \
+ x(btree_cache_scan, 7, 1) \
+ x(btree_cache_reap, 8, 1) \
+ x(btree_cache_cannibalize, 9, 1) \
+ x(btree_cache_cannibalize_lock, 10, 1) \
+ x(btree_cache_cannibalize_lock_fail, 11, 1) \
+ x(btree_cache_cannibalize_unlock, 12, 1) \
+ x(btree_node_write, 13, 1) \
+ x(btree_node_read, 14, 1) \
+ x(btree_node_compact, 15, 1) \
+ x(btree_node_merge, 16, 1) \
+ x(btree_node_split, 17, 1) \
+ x(btree_node_rewrite, 18, 1) \
+ x(btree_node_alloc, 19, 1) \
+ x(btree_node_free, 20, 1) \
+ x(btree_node_set_root, 21, 1) \
+ x(btree_path_relock_fail, 22, 1) \
+ x(btree_path_upgrade_fail, 23, 1) \
+ x(btree_reserve_get_fail, 24, 1) \
+ x(journal_entry_full, 25, 1) \
+ x(journal_full, 26, 1) \
+ x(journal_reclaim_finish, 27, 1) \
+ x(journal_reclaim_start, 28, 1) \
+ x(journal_write, 29, 1) \
+ x(read_promote, 30, 1) \
+ x(read_bounce, 31, 1) \
+ x(read_split, 33, 1) \
+ x(read_retry, 32, 1) \
+ x(read_reuse_race, 34, 1) \
+ x(move_extent_read, 35, 512) \
+ x(move_extent_write, 36, 512) \
+ x(move_extent_finish, 37, 512) \
+ x(move_extent_fail, 38, 1) \
+ x(move_extent_start_fail, 39, 1) \
+ x(copygc, 40, 1) \
+ x(copygc_wait, 41, 1) \
+ x(gc_gens_end, 42, 1) \
+ x(gc_gens_start, 43, 1) \
+ x(trans_blocked_journal_reclaim, 44, 1) \
+ x(trans_restart_btree_node_reused, 45, 1) \
+ x(trans_restart_btree_node_split, 46, 1) \
+ x(trans_restart_fault_inject, 47, 1) \
+ x(trans_restart_iter_upgrade, 48, 1) \
+ x(trans_restart_journal_preres_get, 49, 1) \
+ x(trans_restart_journal_reclaim, 50, 1) \
+ x(trans_restart_journal_res_get, 51, 1) \
+ x(trans_restart_key_cache_key_realloced, 52, 1) \
+ x(trans_restart_key_cache_raced, 53, 1) \
+ x(trans_restart_mark_replicas, 54, 1) \
+ x(trans_restart_mem_realloced, 55, 1) \
+ x(trans_restart_memory_allocation_failure, 56, 1) \
+ x(trans_restart_relock, 57, 1) \
+ x(trans_restart_relock_after_fill, 58, 1) \
+ x(trans_restart_relock_key_cache_fill, 59, 1) \
+ x(trans_restart_relock_next_node, 60, 1) \
+ x(trans_restart_relock_parent_for_fill, 61, 1) \
+ x(trans_restart_relock_path, 62, 1) \
+ x(trans_restart_relock_path_intent, 63, 1) \
+ x(trans_restart_too_many_iters, 64, 1) \
+ x(trans_restart_traverse, 65, 1) \
+ x(trans_restart_upgrade, 66, 1) \
+ x(trans_restart_would_deadlock, 67, 1) \
+ x(trans_restart_would_deadlock_write, 68, 1) \
+ x(trans_restart_injected, 69, 1) \
+ x(trans_restart_key_cache_upgrade, 70, 1) \
+ x(trans_traverse_all, 71, 1) \
+ x(transaction_commit, 72, 1) \
+ x(write_super, 73, 1) \
+ x(trans_restart_would_deadlock_recursion_limit, 74, 1) \
+ x(trans_restart_write_buffer_flush, 75, 1) \
+ x(trans_restart_split_race, 76, 1) \
+ x(write_buffer_flush_slowpath, 77, 1) \
+ x(write_buffer_flush_sync, 78, 1)
enum bch_persistent_counters {
#define x(t, n, ...) BCH_COUNTER_##t,
diff --git a/fs/bcachefs/sysfs.c b/fs/bcachefs/sysfs.c
index 97733c766948..8c52a7aed45d 100644
--- a/fs/bcachefs/sysfs.c
+++ b/fs/bcachefs/sysfs.c
@@ -509,10 +509,12 @@ SHOW(bch2_fs_counters)
printbuf_tabstop_push(out, 32);
- #define x(t, ...) \
+ #define x(t, n, u, ...) \
if (attr == &sysfs_##t) {
\
counter =
percpu_u64_get(&c->counters[BCH_COUNTER_##t]);\
counter_since_mount = counter -
c->counters_on_mount[BCH_COUNTER_##t];\
+ counter *= u;
\
+ counter_since_mount *= u;
\
prt_printf(out, "since mount:\t");
\
prt_human_readable_u64(out, counter_since_mount);
\
prt_newline(out);
\
--
2.34.1