diff --git a/volumes.c b/volumes.c
index 71a60cc..874f6da 100644
--- a/volumes.c
+++ b/volumes.c
@@ -4620,6 +4620,8 @@ static int __btrfs_alloc_chunk(struct btrfs_trans_handle *trans,
 	u64 num_bytes;
 	u64 raid_stripe_len = BTRFS_STRIPE_LEN;
 	int ndevs;
+	u64 fs_total_avail;
+	int opt_ndevs;
 	int i;
 	int j;
 	int index;
@@ -4679,6 +4681,7 @@ static int __btrfs_alloc_chunk(struct btrfs_trans_handle *trans,
 	 * about the available holes on each device.
 	 */
 	ndevs = 0;
+	fs_total_avail = 0;
 	while (cur != &fs_devices->alloc_list) {
 		struct btrfs_device *device;
 		u64 max_avail;
@@ -4729,6 +4732,7 @@ static int __btrfs_alloc_chunk(struct btrfs_trans_handle *trans,
 		devices_info[ndevs].total_avail = total_avail;
 		devices_info[ndevs].dev = device;
 		++ndevs;
+		fs_total_avail += total_avail;
 	}
 
 	/*
@@ -4737,6 +4741,14 @@ static int __btrfs_alloc_chunk(struct btrfs_trans_handle *trans,
 	sort(devices_info, ndevs, sizeof(struct btrfs_device_info),
 	     btrfs_cmp_device_info, NULL);
 
+	/*
+	 * do not allocate space on all devices
+	 * instead balance free space to maximise space utilization
+	 */
+	opt_ndevs = (fs_total_avail*2 + devs_increment*devices_info[0].total_avail)/(devices_info[0].total_avail*2);
+	ndevs = clamp_val(opt_ndevs, devs_min, ndevs);
+
+
 	/* round down to number of usable stripes */
 	ndevs -= ndevs % devs_increment;

