Raid

xfs on lvm on hardware RAID: 參數正確嗎?

  • April 2, 2021

我在硬體 RAID6 中有 10 個磁碟,每個磁碟 8 TB(因此,8 個數據磁碟 + 2 個奇偶校驗)。在回答了一個非常相似的問題之後,我希望能夠自動檢測所有必要的參數。但是,在最後創建 XFS 文件系統時,我得到了

# mkfs.xfs /dev/vgdata/lvscratch 
meta-data=/dev/vgdata/lvscratch  isize=256    agcount=40, agsize=268435455 blks
        =                       sectsz=4096  attr=2, projid32bit=1
        =                       crc=0        finobt=0
data     =                       bsize=4096   blocks=10737418200, imaxpct=5
        =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=0
log      =internal log           bsize=4096   blocks=521728, version=2
        =                       sectsz=4096  sunit=1 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

這看起來像沒有使用條帶化。由於我在不同網站上找到的不同術語(條帶大小,條帶大小,條帶塊,…),我想問一下我是否正確設置了手動參數。

RAID 6 的條帶大小為 256KB:

# ./storcli64 /c0/v1 show all | grep Strip
Strip Size = 256 KB

因此,條帶大小為 8*256KB = 2048KB = 2MB。它是否正確?根據這個(如果我理解正確的話),pvcreate必須使用條帶(或塊)大小作為參數dataalignment

# pvcreate --dataalignment 256K /dev/sdb
 Physical volume "/dev/sdb" successfully created

請注意,我使用了沒有分區的整個 RAID 設備。現在一個

# vgcreate vgdata /dev/sdb
 Volume group "vgdata" successfully created

預設 PE 大小為 4MB 應該沒問題,因為它是條帶大小 2MB 的倍數。正確的?

現在,vgroup 的一部分被分配給一個邏輯卷:

# lvcreate -L 40T vgdata -n lvscratch 
 Logical volume "lvscratch" created.

最後,創建了文件系統,但現在使用了正確的參數(條帶大小為 2MB,條頻寬度為 8):

# mkfs.xfs -d su=2048k,sw=8 /dev/vgdata/lvscratch 
meta-data=/dev/vgdata/lvscratch  isize=256    agcount=41, agsize=268434944 blks
        =                       sectsz=4096  attr=2, projid32bit=1
        =                       crc=0        finobt=0
data     =                       bsize=4096   blocks=10737418240, imaxpct=5
        =                       sunit=512    swidth=4096 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=0
log      =internal log           bsize=4096   blocks=521728, version=2
        =                       sectsz=4096  sunit=1 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

這種方法正確嗎?對於邏輯卷或卷組的擴展,有什麼需要注意的嗎?我想如果卷組將使用另一個 RAID6 系統進行擴展,則條帶大小應該等於目前的 RAID6。

編輯:我的困惑似乎主要是基於與條帶相關的術語的不同用法。我的 RAID 控制器 LSI 或 Avago 的製造商以下列方式定義術語

條紋寬度

條頻寬度是實施條帶化的驅動器組中涉及的驅動器數量。例如,具有磁碟條帶化的四磁碟驅動器組的條頻寬度為四。

條紋尺寸

條帶大小是 RAID 控制器跨多個驅動器寫入的交錯數據段的長度,不包括奇偶校驗驅動器。例如,考慮一個包含 64 KB 磁碟空間的條帶,並且在條帶中的每個磁碟上都有 16 KB 的數據。在這種情況下,條帶大小為 64 KB,條帶大小為 16 KB。

帶材尺寸

條帶大小是位於單個驅動器上的條帶部分。

維基百科(和IBM)似乎使用其他定義:

在操作繼續在下一個磁碟上之前寫入或從磁碟讀取的順序數據段通常稱為塊、跨度或條帶單元,而它們形成單個條帶操作的邏輯組稱為條帶或條帶。一個塊(條帶單元)中的數據量,通常以字節為單位,被稱為塊大小、跨度大小、條帶大小、條帶深度或條帶長度。陣列中數據磁碟的數量有時稱為條頻寬度,但也可能指條帶內的數據量。

一個步長中的數據量乘以陣列中數據磁碟的數量(即,條帶深度乘以條頻寬度,在幾何類比中將產生一個區域)有時稱為條帶大小或條頻寬度。當數據塊分佈在多個陣列(可能是系統中的所有驅動器)上時,就會發生寬條帶化。當數據塊分佈在單個陣列中的驅動器上時,就會出現窄條帶化。

即使在 Wikipedia 上面的文字中,條紋大小也有兩種不同的含義。但是,我現在想,在創建 xfs 文件系統時,必須將儲存在單個驅動器上的單個塊的大小作為參數提供給 su。這個,它應該mkfs.xfs -d su=256k,sw=8在上面的命令中。正確的?

XFS 手冊頁沒有使用“條帶大小”和“條帶大小”,而是分別使用術語“條帶單元”和“條頻寬度”。

這使得解碼mkfs.xfs(8)手冊頁中令人困惑的文本成為可能:

              sunit=value
                     This is used to specify the stripe unit for  a  RAID
                     device  or  a  logical  volume.  The value has to be
                     specified in 512-byte block units. Use the su subop‐
                     tion  to specify the stripe unit size in bytes. This
                     suboption ensures  that  data  allocations  will  be
                     stripe  unit aligned when the current end of file is
                     being extended and the  file  size  is  larger  than
                     512KiB.  Also inode allocations and the internal log
                     will be stripe unit aligned.

              su=value
                     This is an alternative to using sunit.  The su  sub‐
                     option is used to specify the stripe unit for a RAID
                     device or a striped logical volume. The value has to
                     be  specified  in  bytes,  (usually using the m or g
                     suffixes). This value must  be  a  multiple  of  the
                     filesystem block size.

因此,當您的陣列報告條帶大小為 256KiB 時,您可以指定su=256Ksunit=512(因為 512 512 字節塊等於 256KiB)。

              swidth=value
                     This  is used to specify the stripe width for a RAID
                     device or a striped logical volume. The value has to
                     be  specified  in  512-byte  block units. Use the sw
                     suboption to specify the stripe width size in bytes.
                     This  suboption  is  required  if  -d sunit has been
                     specified and it has to be  a  multiple  of  the  -d
                     sunit suboption.

              sw=value
                     suboption is an alternative to using swidth.  The sw
                     suboption is used to specify the stripe width for  a
                     RAID  device or striped logical volume. The value is
                     expressed as a multiplier of the stripe  unit,  usu‐
                     ally the same as the number of stripe members in the
                     logical volume configuration, or  data  disks  in  a
                     RAID device.

                     When  a  filesystem  is  created on a logical volume
                     device, mkfs.xfs will automatically query the  logi‐
                     cal volume for appropriate sunit and swidth values.

對於 10 個心軸(8 個數據,2 個奇偶校驗),您可以指定sw=8(數據心軸)或swidth=2M(條帶大小乘以數據心軸)。

注意, xfs_infomkfs.xfs解釋sunitswidth以 512B 扇區為單位指定;然而,不幸的是,這不是他們報告的單位。xfs_infomkfs.xfs以基本塊大小 ( ) 的倍數bsize而不是 512B 扇區報告它們。

TL;博士:

指定這些的最簡單方法通常是通過條帶尺寸和錠數,即su=條帶尺寸和sw=錠數。

引用自:https://serverfault.com/questions/789870