On Thu, Nov 07, 2024 at 08:31:45PM +0800, Hongbo Li wrote:
> 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/
Ok, this is closer, but instead of a raw shift I was thinking an enum
that describes the actual type: some of these are event counters, and
others are bytes. We shouldn't be printing the B suffix for event
counters, and a type enum would let us fix that too
> ---
> 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
>