diff mbox series

[1/6] btrfs: report reclaim stats in sysfs

Message ID b685cc587cee3fcd6e67f969a2f58063e80e38d1.1712168477.git.boris@bur.io (mailing list archive)
State New
Headers show
Series btrfs: dynamic and periodic block_group reclaim | expand

Commit Message

Boris Burkov April 3, 2024, 7:38 p.m. UTC
When evaluating various reclaim strategies/thresholds against each
other, it is useful to collect data about the amount of reclaim
happening. Expose a count and byte count via sysfs per space_info.

Signed-off-by: Boris Burkov <boris@bur.io>
---
 fs/btrfs/block-group.c | 10 ++++++++++
 fs/btrfs/space-info.h  | 12 ++++++++++++
 fs/btrfs/sysfs.c       |  4 ++++
 3 files changed, 26 insertions(+)

Comments

Johannes Thumshirn April 9, 2024, 11:24 a.m. UTC | #1
On 03.04.24 21:37, Boris Burkov wrote:
> When evaluating various reclaim strategies/thresholds against each
> other, it is useful to collect data about the amount of reclaim
> happening. Expose a count and byte count via sysfs per space_info.
> 
> Signed-off-by: Boris Burkov <boris@bur.io>
> ---
>   fs/btrfs/block-group.c | 10 ++++++++++
>   fs/btrfs/space-info.h  | 12 ++++++++++++
>   fs/btrfs/sysfs.c       |  4 ++++
>   3 files changed, 26 insertions(+)
> 
> diff --git a/fs/btrfs/block-group.c b/fs/btrfs/block-group.c
> index 1e09aeea69c2..fd10e3b3f4f2 100644
> --- a/fs/btrfs/block-group.c
> +++ b/fs/btrfs/block-group.c
> @@ -1821,6 +1821,7 @@ void btrfs_reclaim_bgs_work(struct work_struct *work)
>   	list_sort(NULL, &fs_info->reclaim_bgs, reclaim_bgs_cmp);
>   	while (!list_empty(&fs_info->reclaim_bgs)) {
>   		u64 zone_unusable;
> +		u64 reclaimed;
>   		int ret = 0;
>   
>   		bg = list_first_entry(&fs_info->reclaim_bgs,
> @@ -1913,11 +1914,20 @@ void btrfs_reclaim_bgs_work(struct work_struct *work)
>   				div64_u64(bg->used * 100, bg->length),
>   				div64_u64(zone_unusable * 100, bg->length));
>   		trace_btrfs_reclaim_block_group(bg);
> +		reclaimed = bg->used;
>   		ret = btrfs_relocate_chunk(fs_info, bg->start);
>   		if (ret) {
>   			btrfs_dec_block_group_ro(bg);
>   			btrfs_err(fs_info, "error relocating chunk %llu",
>   				  bg->start);
> +			spin_lock(&space_info->lock);
> +			space_info->reclaim_count++;
> +			spin_unlock(&space_info->lock);
> +		} else {
> +			spin_lock(&space_info->lock);
> +			space_info->reclaim_count++;
> +			space_info->reclaim_bytes += reclaimed;
> +			spin_unlock(&space_info->lock);
>   		}
>   
>   next:

Using this you could save yourself an 'else':

+                 reclaimed = bg->used; 
 
 

                   ret = btrfs_relocate_chunk(fs_info, bg->start); 

                   if (ret) { 

                           btrfs_dec_block_group_ro(bg); 

                           btrfs_err(fs_info, "error relocating chunk 
%llu",
                                     bg->start); 
 
 

+                         reclaimed = 0; 
 
 

                   } 
 
 

+                 spin_lock(&space_info->lock); 
 
 

+                 space_info->reclaim_count++; 
 
 

+                 space_info->reclaim_bytes += reclaimed; 
 
 

+                 spin_unlock(&space_info->lock);

Otherwise:

Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
diff mbox series

Patch

diff --git a/fs/btrfs/block-group.c b/fs/btrfs/block-group.c
index 1e09aeea69c2..fd10e3b3f4f2 100644
--- a/fs/btrfs/block-group.c
+++ b/fs/btrfs/block-group.c
@@ -1821,6 +1821,7 @@  void btrfs_reclaim_bgs_work(struct work_struct *work)
 	list_sort(NULL, &fs_info->reclaim_bgs, reclaim_bgs_cmp);
 	while (!list_empty(&fs_info->reclaim_bgs)) {
 		u64 zone_unusable;
+		u64 reclaimed;
 		int ret = 0;
 
 		bg = list_first_entry(&fs_info->reclaim_bgs,
@@ -1913,11 +1914,20 @@  void btrfs_reclaim_bgs_work(struct work_struct *work)
 				div64_u64(bg->used * 100, bg->length),
 				div64_u64(zone_unusable * 100, bg->length));
 		trace_btrfs_reclaim_block_group(bg);
+		reclaimed = bg->used;
 		ret = btrfs_relocate_chunk(fs_info, bg->start);
 		if (ret) {
 			btrfs_dec_block_group_ro(bg);
 			btrfs_err(fs_info, "error relocating chunk %llu",
 				  bg->start);
+			spin_lock(&space_info->lock);
+			space_info->reclaim_count++;
+			spin_unlock(&space_info->lock);
+		} else {
+			spin_lock(&space_info->lock);
+			space_info->reclaim_count++;
+			space_info->reclaim_bytes += reclaimed;
+			spin_unlock(&space_info->lock);
 		}
 
 next:
diff --git a/fs/btrfs/space-info.h b/fs/btrfs/space-info.h
index a733458fd13b..b42db020eba6 100644
--- a/fs/btrfs/space-info.h
+++ b/fs/btrfs/space-info.h
@@ -165,6 +165,18 @@  struct btrfs_space_info {
 
 	struct kobject kobj;
 	struct kobject *block_group_kobjs[BTRFS_NR_RAID_TYPES];
+
+	/*
+	 * Monotonically increasing counter of block group reclaim attempts
+	 * Exposed in /sys/fs/<uuid>/allocation/<type>/reclaim_count
+	 */
+	u64 reclaim_count;
+
+	/*
+	 * Monotonically increasing counter of reclaimed bytes
+	 * Exposed in /sys/fs/<uuid>/allocation/<type>/reclaim_bytes
+	 */
+	u64 reclaim_bytes;
 };
 
 struct reserve_ticket {
diff --git a/fs/btrfs/sysfs.c b/fs/btrfs/sysfs.c
index c6387a8ddb94..0f3675c0f64f 100644
--- a/fs/btrfs/sysfs.c
+++ b/fs/btrfs/sysfs.c
@@ -894,6 +894,8 @@  SPACE_INFO_ATTR(bytes_readonly);
 SPACE_INFO_ATTR(bytes_zone_unusable);
 SPACE_INFO_ATTR(disk_used);
 SPACE_INFO_ATTR(disk_total);
+SPACE_INFO_ATTR(reclaim_count);
+SPACE_INFO_ATTR(reclaim_bytes);
 BTRFS_ATTR_RW(space_info, chunk_size, btrfs_chunk_size_show, btrfs_chunk_size_store);
 BTRFS_ATTR(space_info, size_classes, btrfs_size_classes_show);
 
@@ -949,6 +951,8 @@  static struct attribute *space_info_attrs[] = {
 	BTRFS_ATTR_PTR(space_info, bg_reclaim_threshold),
 	BTRFS_ATTR_PTR(space_info, chunk_size),
 	BTRFS_ATTR_PTR(space_info, size_classes),
+	BTRFS_ATTR_PTR(space_info, reclaim_count),
+	BTRFS_ATTR_PTR(space_info, reclaim_bytes),
 #ifdef CONFIG_BTRFS_DEBUG
 	BTRFS_ATTR_PTR(space_info, force_chunk_alloc),
 #endif