AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 1081766
Accepted
Jayson Reis
Jayson Reis
Asked: 2021-10-27 08:35:06 +0800 CST2021-10-27 08:35:06 +0800 CST 2021-10-27 08:35:06 +0800 CST

如何使用 mdadm + luks + lvm 提高 RAID 5 的速度

  • 772

我想我对当前的服务器设置有点迷失了。它是 HP Proliant dl160 gen 6,我放置了 4 个旋转磁盘,其设置具有 mdmadm + luks + lvm 和 btrfs(也许我走得太远了?),它读取的 IO 速度确实受到了影响50MB/s 和 2MB/s 左右的写入速度,我感觉我搞砸了。

我注意到的一件事是我在块设备(sbd)上而不是在分区(sdb1)上设置了 mdadm,这会影响什么吗?

在这里可以看到fio --name=randwrite --rw=randwrite --direct=1 --bs=16k --numjobs=128 --size=200M --runtime=60 --group_reporting机器上几乎没有用的时候fio的输出。

randwrite: (groupid=0, jobs=128): err= 0: pid=54290: Tue Oct 26 16:21:50 2021
  write: IOPS=137, BW=2193KiB/s (2246kB/s)(131MiB/61080msec); 0 zone resets
    clat (msec): min=180, max=2784, avg=924.48, stdev=318.02
     lat (msec): min=180, max=2784, avg=924.48, stdev=318.02
    clat percentiles (msec):
     |  1.00th=[  405],  5.00th=[  542], 10.00th=[  600], 20.00th=[  693],
     | 30.00th=[  760], 40.00th=[  818], 50.00th=[  860], 60.00th=[  927],
     | 70.00th=[ 1011], 80.00th=[ 1133], 90.00th=[ 1267], 95.00th=[ 1452],
     | 99.00th=[ 2165], 99.50th=[ 2232], 99.90th=[ 2635], 99.95th=[ 2769],
     | 99.99th=[ 2769]
   bw (  KiB/s): min= 3972, max= 4735, per=100.00%, avg=4097.79, stdev= 1.58, samples=8224
   iops        : min=  132, max=  295, avg=248.40, stdev= 0.26, samples=8224
  lat (msec)   : 250=0.04%, 500=2.82%, 750=25.96%, 1000=40.58%, 2000=28.67%
  lat (msec)   : >=2000=1.95%
  cpu          : usr=0.00%, sys=0.01%, ctx=18166, majf=0, minf=1412
  IO depths    : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
     submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     complete  : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     issued rwts: total=0,8372,0,0 short=0,0,0,0 dropped=0,0,0,0
     latency   : target=0, window=0, percentile=100.00%, depth=1

Run status group 0 (all jobs):
  WRITE: bw=2193KiB/s (2246kB/s), 2193KiB/s-2193KiB/s (2246kB/s-2246kB/s), io=131MiB (137MB), run=61080-61080msec

使用 dd 更新 1 次顺序写入

root@hp-proliant-dl160-g6-1:~# dd if=/dev/zero of=disk-test oflag=direct bs=512k count=100
100+0 records in 100+0 records out 52428800 bytes (52 MB, 50 MiB) copied, 5.81511 s, 9.0 MB/s

内核:5.4.0-89-generic

操作系统:Ubuntu 20.04.3

mdadm:4.1-5ubuntu1.2

lvm2:2.03.07-1ubuntu1

blkid 输出

/dev/mapper/dm_crypt-0: UUID="r7TBdk-1GZ4-zbUh-007u-BfuP-dtis-bTllYi" TYPE="LVM2_member"
/dev/sda2: UUID="64528d97-f05c-4f34-a238-f7b844b3bb58" UUID_SUB="263ae70e-d2b8-4dfe-bc6b-bbc2251a9f32" TYPE="btrfs" PARTUUID="494be592-3dad-4600-b954-e2912e410b8b"
/dev/sdb: UUID="478e8132-7783-1fb1-936a-358d06dbd871" UUID_SUB="4aeb4804-6380-5421-6aea-d090e6aea8a0" LABEL="ubuntu-server:0" TYPE="linux_raid_member"
/dev/sdc: UUID="478e8132-7783-1fb1-936a-358d06dbd871" UUID_SUB="9d5a4ddd-bb9e-bb40-9b21-90f4151a5875" LABEL="ubuntu-server:0" TYPE="linux_raid_member"
/dev/sdd: UUID="478e8132-7783-1fb1-936a-358d06dbd871" UUID_SUB="f08b5e6d-f971-c622-cd37-50af8ff4b308" LABEL="ubuntu-server:0" TYPE="linux_raid_member"
/dev/sde: UUID="478e8132-7783-1fb1-936a-358d06dbd871" UUID_SUB="362025d4-a4d2-8727-6853-e503c540c4f7" LABEL="ubuntu-server:0" TYPE="linux_raid_member"
/dev/md0: UUID="a5b5bf95-1ff1-47f9-b3f6-059356e3af41" TYPE="crypto_LUKS"
/dev/mapper/vg0-lv--0: UUID="6db4e233-5d97-46d2-ac11-1ce6c72f5352" TYPE="swap"
/dev/mapper/vg0-lv--1: UUID="4e1a5131-cb91-48c4-8266-5b165d9f5071" UUID_SUB="e5fc407e-57c2-43eb-9b66-b00207ea6d91" TYPE="btrfs"
/dev/loop0: TYPE="squashfs"
/dev/loop1: TYPE="squashfs"
/dev/loop2: TYPE="squashfs"
/dev/loop3: TYPE="squashfs"
/dev/loop4: TYPE="squashfs"
/dev/loop5: TYPE="squashfs"
/dev/loop6: TYPE="squashfs"
/dev/loop7: TYPE="squashfs"
/dev/loop8: TYPE="squashfs"
/dev/loop9: TYPE="squashfs"
/dev/loop10: TYPE="squashfs"
/dev/sda1: PARTUUID="fa30c3f5-6952-45f0-b844-9bfb46fa0224"

猫 /proc/mdstat

Personalities : [raid6] [raid5] [raid4] [linear] [multipath] [raid0] [raid1] [raid10]
md0 : active raid5 sdb[0] sdc[1] sdd[2] sde[4]
      5860147200 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/4] [UUUU]
      bitmap: 2/15 pages [8KB], 65536KB chunk

unused devices: <none>

lshw -c 磁盘

  *-disk
       description: SCSI Disk
       product: DT 101 G2
       vendor: Kingston
       physical id: 0.0.0
       bus info: scsi@0:0.0.0
       logical name: /dev/sda
       version: 1.00
       serial: xxxxxxxxxxxxxxxxxxxx
       size: 7643MiB (8015MB)
       capabilities: removable
       configuration: ansiversion=4 logicalsectorsize=512 sectorsize=512
     *-medium
          physical id: 0
          logical name: /dev/sda
          size: 7643MiB (8015MB)
          capabilities: gpt-1.00 partitioned partitioned:gpt
          configuration: guid=6c166e3e-27c9-4edf-9b0d-e21892cbce41
  *-disk
       description: ATA Disk
       product: ST2000DM008-2FR1
       physical id: 0.0.0
       bus info: scsi@1:0.0.0
       logical name: /dev/sdb
       version: 0001
       serial: xxxxxxxxxxxxxxxxxxxx
       size: 1863GiB (2TB)
       capabilities: removable
       configuration: ansiversion=5 logicalsectorsize=512 sectorsize=4096
     *-medium
          physical id: 0
          logical name: /dev/sdb
          size: 1863GiB (2TB)
  *-disk
       description: ATA Disk
       product: ST2000DM008-2FR1
       physical id: 0.0.0
       bus info: scsi@2:0.0.0
       logical name: /dev/sdc
       version: 0001
       serial: xxxxxxxxxxxxxxxxxxxx
       size: 1863GiB (2TB)
       capabilities: removable
       configuration: ansiversion=5 logicalsectorsize=512 sectorsize=4096
     *-medium
          physical id: 0
          logical name: /dev/sdc
          size: 1863GiB (2TB)
  *-disk
       description: ATA Disk
       product: WDC WD20EZBX-00A
       vendor: Western Digital
       physical id: 0.0.0
       bus info: scsi@3:0.0.0
       logical name: /dev/sdd
       version: 1A01
       serial: xxxxxxxxxxxxxxxxxxxx
       size: 1863GiB (2TB)
       capabilities: removable
       configuration: ansiversion=5 logicalsectorsize=512 sectorsize=4096
     *-medium
          physical id: 0
          logical name: /dev/sdd
          size: 1863GiB (2TB)
  *-disk
       description: ATA Disk
       product: WDC WD20EZBX-00A
       vendor: Western Digital
       physical id: 0.0.0
       bus info: scsi@4:0.0.0
       logical name: /dev/sde
       version: 1A01
       serial: xxxxxxxxxxxxxxxxxxxx
       size: 1863GiB (2TB)
       capabilities: removable
       configuration: ansiversion=5 logicalsectorsize=512 sectorsize=4096
     *-medium
          physical id: 0
          logical name: /dev/sde
          size: 1863GiB (2TB)

您在设置中看到任何可能有问题的地方吗?您认为添加带有 PCI 卡的 nvme 并将其用于缓存会有所帮助吗?

linux lvm mdadm btrfs
  • 2 2 个回答
  • 1051 Views

2 个回答

  • Voted
  1. Mike Andrews
    2021-10-28T05:10:25+08:002021-10-28T05:10:25+08:00

    简短版本:我认为您的问题很可能是您的基准测试使用的是比您的 RAID 块大小小得多的随机写入。

    您在使用系统时是否注意到性能问题?或者,仅仅是基准测试结果看起来很糟糕?对于具有 512K 大块的 RAID 5,该 16K 随机写入基准接近最坏情况。

    RAID 5 有一个奇偶校验块,必须与数据一起更新。如果您有一个内核可以分解为 512K 写入的顺序工作负载,那么您只需计算新的奇偶校验信息,然后将数据块和奇偶校验块写出来。一次写入转换为两次写入。

    但是对于远小于块大小的 16K 写入,您必须先读取旧数据和旧奇偶校验,然后计算新奇偶校验信息,然后写出新数据和奇偶校验。那就是读-读-写-写。一次写入转换为四个 I/O。对于随机写入,即使是地球上最好的 RAID 控制器也无法预测要缓存哪些块。

    如果您使用数组来存储大文件,那么您很幸运:您只是使用了错误的基准来评估其性能。如果您在基准测试中更改randwrite为简单write,以便写入是连续的,它应该会变得更好!

    但是,如果您的工作负载确实是由更随机、更小的写入组成,那么您将不得不对阵列进行一些更改。4 磁盘 RAID 10 为您提供更好的服务。但是,这仍然是旋转媒体。它不会震撼你的世界。我想 RAID 10 的性能应该是现在的 2 到 3 倍,比如 275 到 400 IOPS,在那个基准上可能是 4MiB/s 到 6MiB/s?

    至于使用 SSD 进行缓存,也许使用 bcache 之类的东西,您将消除冗余。考虑使用两个 SSD 的 RAID 1 进行缓存?考虑到这些驱动器的速度,你绝对不需要 NVMe。SATA就好了。

    (顺便说一句,不要担心分区与原始设备。这没有什么区别。就我个人而言,我不使用分区。)

    • 1
  2. Best Answer
    shodanshok
    2021-10-30T03:32:18+08:002021-10-30T03:32:18+08:00

    糟糕的记录表现源于不同的因素:

    • 机械磁盘在随机读/写 IO 方面非常糟糕。要发现它们有多糟糕,只需附加--sync=1到您的fio命令(简短的故事:它们非常糟糕,至少与适当的 BBU RAID 控制器或断电保护 SSD 相比);

    • 由于条带读取/修改/写入,RAID5 具有固有的写入损失。此外,出于安全原因,强烈建议在多 TB 机械磁盘上​​避免使用它。有4个磁盘,请认真考虑改用RAID10;

    • LUKS 提供基于软件的全盘加密,不可避免地会在读取和写入方面产生(重大)损失;

    • 使用 BTRFS,LVM 是完全没有必要的。虽然基于 LVM 的胖卷本身不会以任何有意义的方式损害性能,但您仍然会插入另一个 IO 层并将自己暴露于(更多)对齐问题;

    • 最后,BTRFS 本身并不是特别快。特别是您的慢速顺序读取可以跟踪到 BTRFS 可怕的碎片(由于它是 CoW并强制执行 4K 粒度 - 作为比较,为了从 ZFS 获得良好的性能,在使用机械磁盘时通常应该选择 64K-128K 记录)。

    为了进行基线性能比较,我强烈建议重做 IO 堆栈,测量每一步的随机和顺序读/写速度。换句话说:

    • 创建一个 RAID10 阵列并在原始阵列上运行dd(fio没有文件系统);

    • 如果确实需要全盘加密,请使用 LUKS 创建加密设备并在原始加密设备上重新运行dd+ fio(同样,没有文件系统)。与以前的结果进行比较,以了解其在性能方面的含义;

    • 尝试XFS和BTRFS(运行通常的dd+fio快速工作台)以了解两个不同文件系统的行为方式。如果 BTRFS 太慢,请尝试用lvmthin和 XFS 替换它(但请记住,在这种情况下,您将丢失用户数据校验和,为此您需要另一层 - dmintegrity - 本身对性能有很大影响)。

    如果这一切看起来一团糟,那么,确实如此。通过执行上述所有操作,您只是在降低存储性能:必须考虑实际的应用程序行为(而不是完全顺序dd或纯随机fio结果)、缓存命中率、IO 模式对齐等。但是,嘿-少总比没有好,所以让我们从一些基本的东西开始。

    • 1

相关问题

  • 多操作系统环境的首选电子邮件客户端

  • 你最喜欢的 Linux 发行版是什么?[关闭]

  • 更改 PHP 的默认配置设置?

  • 保护新的 Ubuntu 服务器 [关闭]

  • (软)Ubuntu 7.10 上的 RAID 6,我应该迁移到 8.10 吗?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve