我使用hdparm -t在PV(sda3和sdb2)和LV(工作)上测量。 实际上,PVs更快。
这真的只是lvm的方式,还是我做错了什么?
# lvs -a -o +devices LV VG Attr LSize Origin Snap% Move Log Copy% Convert Devices root foobar -wi-ao 165.00G /dev/sda3(10752) swap foobar -wi-ao 2.00G /dev/sda3(10240) work foobar mwi-ao 148.52G work_mlog 100.00 work_mimage_0(0),work_mimage_1(0) [work_mimage_0] foobar iwi-ao 148.52G /dev/sda3(52992) [work_mimage_1] foobar iwi-ao 148.52G /dev/sdb2(0) [work_mlog] foobar lwi-ao 4.00M /dev/sdb1(0)
将数据通过额外的虚拟块设备接口(在内核中)需要额外的额外开销。 通常是线路噪声(不超过3%左右)。
如果你想提高多个驱动器的性能,那么你需要看看md(metadisk)驱动程序… RAID 1(镜像)或RAID 10(镜像+条带化)。 在这种情况下,您的系统可能同时交错读取和写入多个驱动器(主轴)。 (请注意,某些硬件configuration不会从镜像中受益;例如,两个驱动器挂在普通的旧IDE / PATA电缆上;一个控制器/电缆是瓶颈)。
影响整体驱动器性能的两个主要因素是寻道时间和吞吐量……将驱动器头放在所请求的数据上需要多长时间,以及通过电缆传输数据的速度有多快。 通过两个I / O通道镜像显然可以提高读取吞吐量(可能几乎是任何给定时间间隔内传输的数据的两倍)。 对寻道时间的影响是戏剧性的,而且更具概率性……两个驱动器的头部可能会在它们各自的盘片的不同部分上。 读取请求可以来自任何一个驱动器,因此请求可以被路由到正好具有更接近所需区域的驱动器。 (就我所知,这实际上只是在Linux内核中通过一个粗略的启发来完成的…驱动程序不知道驱动器几何的细节,而只是将请求视为“线性模块arrays”表中的偏移量)。
更重要的是镜像RAIDconfiguration可以同时处理多个读取请求。
请注意,RAID镜像对写入没有好处。 每个写操作都必须在多个驱动器上完成…因此,它将被传输到集合中的每个I / O通道上,并且在集合中遇到最差的查找时间(而不是从最佳位置获取读取)。
请注意,可以在Linux中一起使用LVM和md RAIDfunction。 通常情况下,您需要使用md *驱动程序作为较低的虚拟块层(将物理磁盘聚合到RAID集中),然后使用LVM(使每个顶级md *(1,5或6)设备进入LVM PV —物理卷)。 大多数情况下,我会说RAID 0(striping)对于LVM没有任何意义。 (LVM可以将多个驱动器聚合成更大的虚拟卷,就像RAID 0一样,但是它的实现更加灵活)。
这可能是由于许多原因。 我知道某些文件系统具有“写入时复制”function,包括Ext3,ZFS,WAFL,VERITAS(NetBackup)和btrfs。 然而,虽然COW(写时复制)可以减慢你的系统,但它不应该是一个容易通知的事情。
此外,如果您启用了快照(使用任何用于创buildLV的控制器),这也会降低速度。
根据卷中物理盘区的大小,可能会降低速度(也就是说,每个物理盘的总容量可能不同)。 或者,也许正在构成LVM的单个物理磁盘之一正在发生变化。
尝试在磁盘上自己做一些诊断,看看是否有任何返回坏扇区/切片。 你是自动增长这个逻辑卷还是这是一个固定大小的卷?
这可能就是您的LVM镜像设置的方式。 控制器或物理磁盘可能有些事情正在进行。 你还必须记住控制器的速度,因为数据通过驱动器的path是通过控制器 – 使用较新的硬盘驱动器的旧控制器不会加快速度(取决于旧的控制器,我有一个年代久远,几乎总是胜过一些新的)。
我在某个时候遇到的一个问题是,对于LVM卷,最大预读的默认值被设置为一些愚蠢的低。 IIRC已经固定,但我想这不会伤害检查。 例如
blockdev –getra / dev / foo / bar
查看设备的预读设置,以及 – N将其设置为N个扇区。 而且您可能希望在底层设备或LVM卷上设置不错的预读,而不是两者。
此外,为了“适当”的基准,使用像iozone,fio,bonnie ++而不是hdparm。 hdparm直接访问驱动器,我不确定它在虚拟设备(如LVM LV)上运行时会执行什么操作。