About Kernel Documentation Linux Kernel Contact Linux Resources Linux Blog

Documentation / device-mapper / unstriped.txt


Based on kernel version 4.16.1. Page generated on 2018-04-09 11:52 EST.

1	Introduction
2	============
3	
4	The device-mapper "unstriped" target provides a transparent mechanism to
5	unstripe a device-mapper "striped" target to access the underlying disks
6	without having to touch the true backing block-device.  It can also be
7	used to unstripe a hardware RAID-0 to access backing disks.
8	
9	Parameters:
10	<number of stripes> <chunk size> <stripe #> <dev_path> <offset>
11	
12	<number of stripes>
13	        The number of stripes in the RAID 0.
14	
15	<chunk size>
16		The amount of 512B sectors in the chunk striping.
17	
18	<dev_path>
19		The block device you wish to unstripe.
20	
21	<stripe #>
22	        The stripe number within the device that corresponds to physical
23	        drive you wish to unstripe.  This must be 0 indexed.
24	
25	
26	Why use this module?
27	====================
28	
29	An example of undoing an existing dm-stripe
30	-------------------------------------------
31	
32	This small bash script will setup 4 loop devices and use the existing
33	striped target to combine the 4 devices into one.  It then will use
34	the unstriped target ontop of the striped device to access the
35	individual backing loop devices.  We write data to the newly exposed
36	unstriped devices and verify the data written matches the correct
37	underlying device on the striped array.
38	
39	#!/bin/bash
40	
41	MEMBER_SIZE=$((128 * 1024 * 1024))
42	NUM=4
43	SEQ_END=$((${NUM}-1))
44	CHUNK=256
45	BS=4096
46	
47	RAID_SIZE=$((${MEMBER_SIZE}*${NUM}/512))
48	DM_PARMS="0 ${RAID_SIZE} striped ${NUM} ${CHUNK}"
49	COUNT=$((${MEMBER_SIZE} / ${BS}))
50	
51	for i in $(seq 0 ${SEQ_END}); do
52	  dd if=/dev/zero of=member-${i} bs=${MEMBER_SIZE} count=1 oflag=direct
53	  losetup /dev/loop${i} member-${i}
54	  DM_PARMS+=" /dev/loop${i} 0"
55	done
56	
57	echo $DM_PARMS | dmsetup create raid0
58	for i in $(seq 0 ${SEQ_END}); do
59	  echo "0 1 unstriped ${NUM} ${CHUNK} ${i} /dev/mapper/raid0 0" | dmsetup create set-${i}
60	done;
61	
62	for i in $(seq 0 ${SEQ_END}); do
63	  dd if=/dev/urandom of=/dev/mapper/set-${i} bs=${BS} count=${COUNT} oflag=direct
64	  diff /dev/mapper/set-${i} member-${i}
65	done;
66	
67	for i in $(seq 0 ${SEQ_END}); do
68	  dmsetup remove set-${i}
69	done
70	
71	dmsetup remove raid0
72	
73	for i in $(seq 0 ${SEQ_END}); do
74	  losetup -d /dev/loop${i}
75	  rm -f member-${i}
76	done
77	
78	Another example
79	---------------
80	
81	Intel NVMe drives contain two cores on the physical device.
82	Each core of the drive has segregated access to its LBA range.
83	The current LBA model has a RAID 0 128k chunk on each core, resulting
84	in a 256k stripe across the two cores:
85	
86	   Core 0:       Core 1:
87	  __________    __________
88	  | LBA 512|    | LBA 768|
89	  | LBA 0  |    | LBA 256|
90	  ----------    ----------
91	
92	The purpose of this unstriping is to provide better QoS in noisy
93	neighbor environments. When two partitions are created on the
94	aggregate drive without this unstriping, reads on one partition
95	can affect writes on another partition.  This is because the partitions
96	are striped across the two cores.  When we unstripe this hardware RAID 0
97	and make partitions on each new exposed device the two partitions are now
98	physically separated.
99	
100	With the dm-unstriped target we're able to segregate an fio script that
101	has read and write jobs that are independent of each other.  Compared to
102	when we run the test on a combined drive with partitions, we were able
103	to get a 92% reduction in read latency using this device mapper target.
104	
105	
106	Example dmsetup usage
107	=====================
108	
109	unstriped ontop of Intel NVMe device that has 2 cores
110	-----------------------------------------------------
111	dmsetup create nvmset0 --table '0 512 unstriped 2 256 0 /dev/nvme0n1 0'
112	dmsetup create nvmset1 --table '0 512 unstriped 2 256 1 /dev/nvme0n1 0'
113	
114	There will now be two devices that expose Intel NVMe core 0 and 1
115	respectively:
116	/dev/mapper/nvmset0
117	/dev/mapper/nvmset1
118	
119	unstriped ontop of striped with 4 drives using 128K chunk size
120	--------------------------------------------------------------
121	dmsetup create raid_disk0 --table '0 512 unstriped 4 256 0 /dev/mapper/striped 0'
122	dmsetup create raid_disk1 --table '0 512 unstriped 4 256 1 /dev/mapper/striped 0'
123	dmsetup create raid_disk2 --table '0 512 unstriped 4 256 2 /dev/mapper/striped 0'
124	dmsetup create raid_disk3 --table '0 512 unstriped 4 256 3 /dev/mapper/striped 0'
Hide Line Numbers


About Kernel Documentation Linux Kernel Contact Linux Resources Linux Blog