典型的服务器只能容纳有限数量的硬盘。随着存储需求的增长,最终会遇到比典型家用机器上更先进的硬件。
添加存储空间的最常见的方法是通过专门设计用于存放硬盘的盒子。最常见的是SCSI机柜(有时称为背板——backplance)。将SCSI机柜连接到带有磁盘控制器卡的主机。
SCSI机柜中有各种硬件和功能。常见的有SAS或SATA端口倍增器,允许将四个以上的驱动器连接到磁盘控制器的每个端口。
可能会看到磁盘托架或托盘,可能是热插拔的。机柜有风扇、温度传感器、电源等。
机柜甚至可能有自己的CPU,运行专门设计由于容纳所有这些功能的自定义操作系统。风扇和电源故障可能导致该存储设备停机。
SCSI机柜具有与服务器操作系统通信的协议。SCSI机柜服务(SES)是用于监视和管理服务器存储子系统的现代协议。它是旧硬件中SCSI访问容错机柜(SCSI Accessed Fault-Tolerant Enclosure——SAF-TE)协议的继承者。
SES通常集成到热插拔托架的背板或SAS扩展器中。SES提供了一种监控和定位磁盘驱动器的标准方法,也可以用于监控风扇、灯和其他设备。
FreeBSD使用ses驱动程序支持SES。FreeBSD10.3引入了sesutil,允许管理员检查和控制系统上的ses设备。
sesutil有许多子函数。从sesutil map开始,它显示了所有机柜中的所有设备:
xxxxxxxxxx
# sesutil map
ses0:
Enclosure Name: LSI SAS2X36 0e12
Enclosure ID: 500304801786b87f
机柜的第一个条目是机柜设备名称(ses0)。如果有多个控制器,重新启动可能会更改设备节点,因此不要依赖它来识别特定的机柜。Enclosure Name基于硬件型号,但Enclosure ID对于此特定硬件是唯一的。
机柜中的每个受监控或受控硬件都有一个element(元素)。每个元素都被分配了一个数字。重新启动时,元素编号不会改变。以下是一个数组的第一个元素:
xxxxxxxxxx
Element 0, Type: Array Device Slot
Status: Unsupported (0x00 0x00 0x00 0x00)
Description: Drive Slots
Element0有一个类型为Array Device Slot,并描述了驱动器插槽。
这是所有单独驱动器插槽的父元素,如下所示:
xxxxxxxxxx
Element 1, Type: Array Device Slot
Status: OK (0x01 0x00 0x00 0x00)
Description: Slot 01
Device Names: da0,pass4
Element 2, Type: Array Device Slot
Status: OK (0x01 0x00 0x00 0x00)
Description: Slot 02
Device Names: da1,pass5
这里有几个实际的硬盘。可以看到FreeBSD设备名称和驱动器的位置。
据推测,机柜上会永久打印插槽号,以便于迅速定位故障磁盘。最好不要打印在可拆卸的驱动器托盘上。
其他硬件出现在驱动器托架之后。
xxxxxxxxxx
Element 26, Type: Temperature Sensors
Status: OK (0x01 0x00 0x39 0x00)
Description: Temperature
Extra status:
- Temperature: 37 C
第一个温度计显示外壳处于教科书规定的温度,这有许多话要说。
xxxxxxxxxx
Element 28, Type: Cooling
Status: OK (0x01 0x01 0xfe 0x21)
Description: Fan1
Extra status:
- Speed: 5100 rpm
冷却元件可能是风扇。风扇速度可以让你知道风扇仍在运行。不过,可能需要查看手册才能准确了解Fan1的位置。
xxxxxxxxxx
Element 34, Type: Voltage Sensor
Status: OK (0x01 0x00 0x01 0xf6)
Description: 5V
Extra status:
- Voltage: 5.02 V
电压传感器的Description为预期电压,Extra status则显示当前电压。
SAS扩展器变得稍微复杂一些。您将看到SAS扩展器的条目,然后是扩展器中的所有组件。SAS扩展器几乎没有什么问题,但有些组件确实提供了状态。
xxxxxxxxxx
Element 41, Type: SAS Expander
Status: Unsupported (0x00 0x00 0x00 0x00)
Description: SAS Expanders
Element 42, Type: SAS Expander
Status: OK (0x01 0x00 0x00 0x00)
Description: Primary Expander
Element 44, Type: SAS Connector
Status: OK (0x01 0x11 0xff 0x00)
Description: Upstream Connector (Primary)
Element 45, Type: SAS Connector
Status: OK (0x01 0x11 0xff 0x00)
Description: Downstream Connector 1 (Primary)
Element 46, Type: SAS Connector
Status: OK (0x01 0x11 0xff 0x00)
Description: Downstream Connector 2 (Primary)
甚至单个连接器也会显示出来:
xxxxxxxxxx
Element 47, Type: SAS Connector
Status: OK (0x01 0x20 0x00 0x00)
Description: Drive Connector 00
这比我们大多数人需要的要详细得多。但是,在开始大规模更换硬盘之前,检查SAS扩展器和控制器的状态可以为您节省很多痛苦。
您可以通过磁盘的连接方式来描述磁盘在机柜中的位置。要访问特定磁盘,操作系统必须转到某个存储模块,然后转到该存储模块中的特定托架。FreeBSD会根据此路径自动生成设备节点目录。这允许系统管理员识别特定硬件块下的设备。此设备路径是一系列键值对,用@符号分隔。例如,外壳500304801786b87d显示为enc@n500304801786b87d.每条路径有四个组件:机柜、设备类型、插槽,然后是元素描述,创建了如下路径。
xxxxxxxxxx
/dev/enc@n500304801786b87d/type@0/slot@a/elmdesc@Slot_10/
此设备节点表示机柜500304801786b87d。机柜标识符前的前导N表示这是一个网络寻址机构(Network Addressing Authority——NAA)标识符,这在很大程度上是退化的,因为这里的所有内容都是NAA标识符。十六进制数是寻址逻辑单元的SAS地址。这个数字的确定方式因供应商而异。 该类型是数字设备类型。磁盘是此驱动程序目前支持的唯一设备,但以后的FreeBSD版本可能会添加对其他设备的支持。 插槽是驱动器托架。插槽以十六进制编号:插槽a为10,b为11,依此类推。插槽10实际上是16。 最后一个组件是运行sesutil map时显示的元素描述。 此目录包含指向与此插槽关联的所有设备节点的符号链接。它甚至有标签子目录。
xxxxxxxxxx
#ls -l /dev/enc@n500304801786b87d/type@0/slot@a/elmdesc@Slot_10/
total 1
lrwxr-xr-x 1 root wheel 15 Oct 5 23:27 da9@ -> ../../../../da9
dr-xr-xr-x 2 root wheel 512 Oct 5 23:27 gpt/
lrwxr-xr-x 1 root wheel 18 Oct 5 23:27 pass13@ -> ../../../../pass13
如果机柜上的插槽15发出异常的嗡嗡声,您可以进入基于机柜的设备节点,确定哪些提供商住在那里。
机柜一般会有定位灯,使用sesutil locate命令可以激活定位灯。比如:
xxxxxxxxxx
# sesutil locate da2 on
灯会亮或闪烁,具体取决于制造商。
sesutil map命令可以查看哪个定位灯亮了:
xxxxxxxxxx
# sesutil map
…
Element 3, Type: Array Device Slot
Status: OK (0x01 0x00 0x02 0x00)
Description: Slot 03
Device Names: da2,pass6
Extra status:
- LED=locate
你可能需要在没有磁盘的托架中激活定位灯,例如,向技术人员显示在哪里安装新的硬盘。使用SES设备节点和元素编号,而不是设备节点。插槽号通常与元素号相同,需要小心。
此处我们激活机柜/dev/ses0上元素3的定位灯:
xxxxxxxxxx
# sesutil locate -u /dev/ses0 3 on
将以上命令中的on替换成off,可以关闭定位灯。
HBA——Host Bus Adapter主机总线控制器。
FreeBSD包含了几个用于管理非RAID硬盘驱动器控制器的工具,通常这类控制称为主机总线适配器或HBA。
对于较旧的控制器,可以使用mfiutil和mptutil。
FreeBSD10.3添加了mprutil和mpsutil。
mprutil用于LSI Fusion-MPS 3 HBAs,mpsutil用于LSI Fusion-MPS 2 HBAs。
这两个程序的行为完全相同,我们使用mpsutil进行演示。
首先,找到连接到系统的适配器:
xxxxxxxxxx
# mpsutil show adapters
Device Name Chip Name Board Name Firmware
/dev/mps0 LSISAS2308 13000000
/dev/mps1 LSISAS2308 13000000
现在看看所有连接的设备。默认情况下,这两个工具都访问第一个设备节点/dev/mps0或/dev/mpr0。使用-u选项和设备号访问其他HBA设备:
xxxxxxxxxx
# mpsutil show devices
B____T SAS Address Handle Parent Device Speed Enc Slot Wdt
500304801786b87f 0009 0001 SMP Target 6.0 0002 00 4
00 08 5000cca2325ddda9 000a 0009 SAS Target 6.0 0002 00 1
00 09 5000cca23257419d 000b 0009 SAS Target 6.0 0002 01 1
00 10 5000cca2325db3bd 000c 0009 SAS Target 6.0 0002 02 1
00 11 5000cca2325e028d 000d 0009 SAS Target 6.0 0002 03 1
每一行都是响应SCSI命令的设置。其中大部分是硬盘。SCSI总线上的任何东西都是目标,包括硬盘驱动器。真正深入了解这一点需要了解SAS和SCSI。
使用show encloss命令查看连接到HBA的机柜。这里我们列出了连接到/dev/mps1的机柜:
xxxxxxxxxx
# mpsutil -u 1 show enclosures
Slots Logical ID SEPHandle EncHandle Type
08 500605b009d018c0 0001 Direct Attached SGPIO
25 500304801786b87f 0022 0002 External SES-2
13 5003048001f7ab3f 0030 0003 External SES-2
这里显示了机柜中的插槽数量、设备的手柄(如果有的话)和机柜的类型。
Logical ID是SAS地址。可以将这些映射到sesutil或其他命令中显示SAS地址。
如果使用的是没有mpsutil的旧版FreeBSD,或者需要它不提供的功能,LSI/Avago提供了自己的专有工具sas2ircu。mpsutil缺少的大多数功能都涉及控制器的内置软件RAID。
sas2ircu还可以让你获取HBA固件版本等信息,可以从FreeBSD port中安装,位于sysutils/sas2ircu。
sas2ircu程序至少需要两个参数:控制器(设备节点)编号和命令。即使只有一个控制器,也必须指定控制器编号。
要查看连接到HBA的硬件,可使用display命令。以下示例查看连接到控制器0、/dev/mps0或/dev/mpr0的设备:
xxxxxxxxxx
# sas2ircu 0 display
你会得到一堆版权信息,以及这样的有用说明:
xxxxxxxxxx
Read configuration has been initiated for controller 0
或者,显示详细信息:
xxxxxxxxxx
----------------------------------
Controller information
----------------------------------
Controller type : SAS2308_2
BIOS version : 7.37.00.00
Firmware version : 19.00.00.00
Channel description : 1 Serial Attached SCSI
…
如果您必须进行故障排除或使用制造商的技术支持,BIOS和固件版本非常有用。一旦所有这些都过去了,我们就可以获得有关实际硬件的信息。每个硬盘都有一个这样的条目。
xPhysical device information
--------------------------------------------------
Initiator at ID #0
Device is a Hard disk
Enclosure # : 1
Slot # : 0
SAS Address : 4433221-1-0300-0000
State : Ready (RDY)
Size (in MB)/(in sectors) : 4769307/9767541167
Manufacturer : ATA
Model Number : TOSHIBA MD04ACA5
Firmware Revision : FP2A
Serial No : 55FGK5SUFS9A
GUID : N/A
Protocol : SATA
Drive Type : SATA_HDD
…
您可以看到序列号、驱动器类型、驱动器是否已准备好使用、大小等。 一旦你浏览了所有的硬盘,它就会泄露出关于机柜本身的详细信息。
xxxxxxxxxx
---------------------------------
Enclosure information
---------------------------------
Enclosure# : 1
Logical ID : 500605b0:09cfc820
Numslots : 8
StartSlot : 0
---------------------------------
这并不是关于您的机柜的全部内容——它不会告诉您哪个驱动器是导致这种燃烧气味的原因——但它提供了指导。
要打开或关闭特定驱动器托架上的LED,需要控制器号、机柜号和插槽号,从显示命令获取相关信息。
xxxxxxxxxx
# sas2ircu <controller #> locate <enclosure#:slot#> on
假设我们要激活上一节所示机柜上驱动器8上的LED。我们使用的是控制器0或/dev/mps0。
display命令显示每个设备的机柜号和插槽号。驱动器8位于插槽7中——通常插槽从0开始编号。因此,要闪烁/dev/mps0上的驱动器8的LED,应按以下操作运行:
xxxxxxxxxx
# sas2ircu 0 locate 1:7 on
做完操作之后记得关掉它。
具有高可用性要求和多磁盘的系统可能需要SAS多路径。
多路径的目标是提供CPU到每个磁盘的多条路径。其他路径可用于负载平衡或故障转移。
通常,多路径意味着将两个或多个控制器连接到包含磁盘的背板或存储架。
当每个磁盘都可以通过任何控制器访问时,一个控制器或电缆的故障不必中断服务。此外,它还可以允许使用所有控制器的组合带宽。
这个概念甚至可以扩展到提供完全的高可用性。如果JBOD机框中装满了磁盘,请将两个SAS端口之一连接到第一台服务器,另一个连接到第二台服务器。现在两台服务器都可以访问磁盘。使用CARP(一种心跳守护进程)或一些基于仲裁的高可用性服务,允许这两台服务器共享一个IP地址。
由于两台机器都可以访问所有数据,可以在机器之间优雅地进行故障转移服务。这使得可以在不关闭文件服务器的情况下完成一直推迟的操作系统升级。
需要格外注意的是,要确保两个系统不会试图同时挂载磁盘。这就是为什么zpool import命令会检查主机ID,并拒绝导入看起来正被其他系统使用的池。
多路径带来了一个有趣的问题。如果每个磁盘都有两条或多条返回CPU的路径,操作系统将通过每个控制器多次看到每个单独的磁盘。原本的36个磁盘可能看起来有72个。
GEOM多路径模块gmultipath采用这些多路径,并向操作系统提供单个逻辑存储设备。gmultipath会自动选择到达磁盘的最佳路径,因此上层存储层不必担心。
GEOM多路径目前支持三种模式:
还有一种模式称为logical block(逻辑块),尚在研究中,未被采用。逻辑块模式将磁盘分解为指定大小的块,并始终使用相同的路径访问该区域。这可以避免控制器上的缓存重复,因为两个控制器不会访问磁盘的同一区域。这也可以解决写顺序问题,并且有望提供比主动/主动模式更好的性能。
配置多路径的烦人部分是识别哪些设备节点(/dev/daX)代表同一硬件的不同视图。在向磁盘添加任何标签之前,必须解决此问题。方法之一是在SATA设备上使用camcontrol来获取序列号。
xxxxxxxxxx
# camcontrol inquiry da7 -S
1EHNLWRC
# camcontrol inquiry da43 -S
1EHNLWRC
建议编制一份设备及其序列号的列表,以便快速找到匹配的设备。
或者可以使用scsutil来匹配插槽号。以下例子中的多路径系统中包含两个外壳,第一个有24个插槽,第二个有12个插槽。服务器有两个磁盘控制器。
第一个控制器的第一个端口插入前机柜,名为/dev/ses0;第二个端口插入后机柜,名为/dev/ses1。
第二个控制器的第一个端口插入前机柜,名为/dev/ses2;第二个端口插入后机柜,名为/dev/sec3。
有两个附件。FreeBSD的/dev/ses0和/dev/ses2都指向前面的机柜,而/dev/ses1和/dev/ses3都指向后面。我们从两个角度看前面阵列的元素8:
xxxxxxxxxx
# sesutil map -u /dev/ses0
…
Element 8, Type: Array Device Slot
Status: OK (0x01 0x00 0x00 0x00)
Description: Slot 08
Device Names: da7,pass11
# sesutil map -u /dev/ses2
…
Element 8, Type: Array Device Slot
Status: OK (0x01 0x00 0x00 0x00)
Description: Slot 08
Device Names: da43,pass49
这是同一块磁盘。它有多个设备节点。磁盘da7和da43是同一个硬件。
任何时候匹配多路径时,都要做笔记。
gmultipath需要内核模块。在/boot/loader.conf中加入以下行:
xxxxxxxxxx
geom_multipath_load="YES"
FreeBSD GEOM多路径模块有两种配置模式:手动和自动。强烈建议使用自动模式。它将标签写入磁盘的最后一个扇区,然后通过每条路径读取该标签,以确定哪些设备节点只是同一磁盘的额外路径。使用gmultipath标签自动配置多路径。
我们建议使用sesutil(8)获取连接到其中一个机柜的驱动器设备节点列表。然后使用camcontrol(8)获取每个驱动器的序列号。将存储模块(正面为f)和插槽号与磁盘序列号组合在一起,在磁盘上创建标签。
xxxxxxxxxx
# gmultipath label f01-1EHNM9MC /dev/da0
您将对机柜中的每个驱动器运行一次此操作,使用插槽号和序列号在每个磁盘上创建唯一的标签。
xxxxxxxxxx
# gmultipath label f08-1EHNLWRC /dev/da7
一旦标签存在,gmultipath(8)在品尝其他磁盘时就会找到标签。当它找到带有gmultipath标签f01-1EHNM9MC的磁盘时,它会说“A-ha!这与磁盘/dev/da0相同”并接管。
现在您已经将/dev/da0和/dev/da37映射到同一设备,请不要使用这些设备节点。这些设备节点表示通过单个路径访问磁盘。请改用多路径设备节点。gmultipath(8)内核模块实际上阻止您单独访问这些设备节点。
多路径设备节点出现在/dev/Multipath中。每个磁盘都以您分配的标签命名。在这些标签上构建ZFS阵列,即使拔下电缆,您也可以访问磁盘。
如果您真的非常想访问多路径设备的多个设备节点,请将sysctl kern.geom.multipath.exclusive设置为0。但我们告诉你不要。
也许你喜欢用艰难的方式做事。如果您有一个方便的图表,显示哪些设备节点代表相同的物理设备,则可以使用该图表手动创建多路径节点。使用gmultipath create手动配置多路径设备。提供标签和两个磁盘设备。在这里,我们使用设备节点/dev/da7和/dev/da43创建多路径设备multi1。
xxxxxxxxxx
# gmultipath create multi1 /dev/da7 /dev/da43
要销毁手动创建的多路径设备,请使用gmultipath destroy和标签名称。
xxxxxxxxxx
# gmultipath destroy multi1
不过,我们确实建议自动配置。并在磁盘的位置和序列号后为其贴上标签。
重启后,FreeBSD的GEOM堆栈会查找磁盘、识别标签,并将磁盘分组在一起。使用gmultipath status查看状态:
xxxxxxxxxx
# gmultipath status
Name Status Components
multipath/f00-1EHNM9MC OPTIMAL da0 (ACTIVE)
da36 (PASSIVE)
multipath/f01-1EHJZMBC OPTIMAL da1 (ACTIVE)
da37 (PASSIVE)
…
multipath/f07-1EHNLWRC OPTIMAL da7 (ACTIVE)
da43 (PASSIVE)
在每条路径之后,您将看到一条注释,指示每个设备节点是活动的还是被动的。
gmultipath默认将磁盘标记为active/passive(-p)。可以添加-a触发active/active模式,或-p切换到active/read模式。
您还可以使用这些标志更改现有多路径设备的模式。使用gmultipath configure、所需模式的标志和驱动器的gmultipath标签。在这里,我们将标记为f07-1EHNLWRC的磁盘切换到活动/读取模式:
xxxxxxxxxx
# gmultipath configure -R f07-1EHNLWRC
Did it work?
# gmultipath status
…
multipath/f07-1EHNLWRC OPTIMAL da7 (ACTIVE)
da43 (READ)
在active/passive和active/read配置中,也可以使用rotate命令切换哪个设备为活动:
xxxxxxxxxx
# gmultipath rotate f07-1EHNLWRC
# gmultipath status
…
multipath/f07-1EHNLWRC OPTIMAL da7 (READ)
da43 (ACTIVE)
甚至是SSD也可以轮换。
固态磁盘与常规旋转驱动器有很大不同,需要与传统磁盘完全不同的调优。首先,它们甚至不是磁盘。
SSD没有活动部件,不存在寻道、磁头定位等操作。
为了使多个内存单元保持忙碌,操作系统必须为驱动器提供一个待完成的工作队列。
对于机械硬盘,工作队列太深了不好。而SSD这类高IOP设备,ZFS VDEV队列深度可以调整到足够高,以防止设备处于空闲状态。
SSD使用FTL(Flash Translation Layer——闪存转换层)将磁盘上的模拟位置映射到包含存储数据的特定闪存单元。
虽然SSD声称具有机械硬盘使用逻辑块地址(Logical Block Addresses——LBA),但SSD上的LBA与现实的关系甚至不如机械硬盘上的LBA。
由于闪存单元会磨损,几乎所有SSD都包含比它们标称的更多的存储空间。驱动器将数据分散在单元周围,以便使得磨损更均匀。一旦所有空间都被占用,垃圾收集器就会运行。垃圾收集器会找到不再被引用的单元格,或者操作系统已使用TRIM(SATA)或UNMAP(SCSI)命令标记为未使用的单元格,并清除它们以供进一步使用。
当你将SSD或其他支持TRIM的设备添加到ZFS池中时,FreeBSD默认会对整个分区或设备进行TRIM,使其在已知状态下启动。这可能会导致驱动器可用前延迟数十分钟甚至数小时。如果设备是新的,或者不想在它们添加到池中时对其进行修剪,请在设备添加到池之前将sysctl vfs.zfs.vdev.trim_on_init设置为0。
NVMe——Non-Volatile Memory Express,非易失性存储器express,旨在进一步提高固态存储速度。
它用于闪存驱动器,以及其他非易失性存储器。
NVMe本身是一种物理接口规范,是SATA或SCSI/SAS的替代品。一般是走PCI-e总线。
SSD中最慢、最复杂、最容易出错的部分是FTL。NVMe通过放弃这种笨拙的伪装来提高相同硬件的性能,并且采用更合适闪存的协议。
NVMe设备和SSD之间最大的区别之一是NVMe设备有多个队列,通常每个CPU有一个读取队列和一个写入队列。NVMe没有试图让单个队列充满足够的工作来占用多个闪存单元,而是由多少个队列。NVMe队列可以保持相对较浅,以允许高优先级任务取代其他工作。在CPU之间分散负载有助于确保更高的性能。
虽然大多数HDD和SSD都与AHCI接口,每个AHCI设备最多有64个命令的单个命令队列,但NVMe接口允许65536个队列,每个队列包含65536个命令。因此,NVMe接口需要更少的锁定,同时提供更大的并行性和性能。
FreeBSD从9.2开始支持NVMe。设备节点通常是/dev/nvme0、/dev/nvme1等。
NVMe设备本机支持命名空间,允许它们被划分为逻辑单元,与分区相似但不同。nvme使用字符ns来标识设备节点中的命名空间。与计算中的大多数其他内容不同,NVMe规范从1而不是0开始对命名空间进行编号。因此,节点形如/dev/nvme0ns1、/dev/nvme0ns2等。
只有一些较新的企业级NVMe设备支持管理命名空间,大多数当前设备都有一个覆盖整个设备的名称空间。
使用nvmecontrol管理NVMe设备。使用nvmecontrol devlist命令查看所有连接到系统的NVMe硬件:
xxxxxxxxxx
# nvmecontrol devlist
nvme0: INTEL SSDPEDMD800G4
nvme0ns1 (763097MB)
这台主机有一个NVMe,单独的命名空间。
使用nvmecontrol identify命令查看设备的具体信息:
xxxxxxxxxx
# nvmecontrol identify nvme0
Controller Capabilities/Features
================================
Vendor ID: 8086
Subsystem Vendor ID: 8086
Serial Number: CVFT4030004A800CGN
Model Number: INTEL SSDPEDMD800G4
Firmware Version: 8DV10151
…
这一过程持续了相当长的时间,确定了NVMe支持(或不支持)的所有功能。
identify命令还可以工作在命名空间上:
xxxxxxxxxx
# nvmecontrol identify nvme0ns1
Size (in LBAs): 1562824368 (1490M)
Capacity (in LBAs): 1562824368 (1490M)
Utilization (in LBAs): 1562824368 (1490M)
Thin Provisioning: Not Supported
Number of LBA Formats: 7
Current LBA Format: LBA Format #00
LBA Format #00: Data Size: 512 Metadata Size: 0
LBA Format #01: Data Size: 512 Metadata Size: 8
LBA Format #02: Data Size: 512 Metadata Size: 16
LBA Format #03: Data Size: 4096 Metadata Size: 0
LBA Format #04: Data Size: 4096 Metadata Size: 8
LBA Format #05: Data Size: 4096 Metadata Size: 64
LBA Format #06: Data Size: 4096 Metadata Size: 128
LBA格式允许指定扇区大小,包括用于加密或元数据的可选额外空间。
然而,FreeBSD还不允许使用不同的扇区大小重新格式化驱动器。
nvmecontrol套件还包括一个性能测试工具:nvmecontrol perftest。
虽然你可能想测试驱动器的性能,但它可以展示多个工作队列的优点。
本例使用性能测试来测量读取速度,每个线程持续30秒。每个测试都使用越来越大的块。最后一列现实每个线程数的实际吞吐量,单位为兆字节每秒。
从512字节块开始。
xxxxxxxxxx
# for threads in 1 2 4 8 16 32 64; do nvmecontrol perftest -n $threads -o read -s 512 -t 30 nvme0ns1;done
Threads: 1 Size: 512 READ Time: 30 IO/s: 215377 MB/s: 105
Threads: 2 Size: 512 READ Time: 30 IO/s: 309203 MB/s: 150
Threads: 4 Size: 512 READ Time: 30 IO/s: 509559 MB/s: 248
Threads: 8 Size: 512 READ Time: 30 IO/s: 534976 MB/s: 261
Threads: 16 Size: 512 READ Time: 30 IO/s: 535131 MB/s: 261
Threads: 32 Size: 512 READ Time: 30 IO/s: 534682 MB/s: 261
Threads: 64 Size: 512 READ Time: 30 IO/s: 533701 MB/s: 260
使用一个线程,可以读取105MB/s。使用8个或更多线程,可以达到260MB/s。这可能是此设备上此块大小的最大吞吐量。
下面是使用4KB读取的相同测试:
xxxxxxxxxx
# for threads in 1 2 4 8 16 32 64; do nvmecontrol perftest -n $threads -o read -s 4096 -t 30 nvme0ns1;done
Threads: 1 Size: 4096 READ Time: 30 IO/s: 171261 MB/s: 668
Threads: 2 Size: 4096 READ Time: 30 IO/s: 308112 MB/s: 1203
Threads: 4 Size: 4096 READ Time: 30 IO/s: 424894 MB/s: 1659
Threads: 8 Size: 4096 READ Time: 30 IO/s: 521704 MB/s: 2037
Threads: 16 Size: 4096 READ Time: 30 IO/s: 543984 MB/s: 2124
Threads: 32 Size: 4096 READ Time: 30 IO/s: 543376 MB/s: 2122
Threads: 64 Size: 4096 READ Time: 30 IO/s: 542464 MB/s: 2119
即使在一个线程中,我们也会用512字节的块来破坏可能的性能。8个线程的速度约为2000 MB/s,而16个或更多线程的速度则约为2120 MB/s。通过更多的测试,您可以发现大约9个或10个线程可以在这个块大小下最大限度地提高性能。
下面是不常见的128KB的块:
xxxxxxxxxx
Threads: 1 Size: 131072 READ Time: 30 IO/s: 21770 MB/s: 2721
Threads: 2 Size: 131072 READ Time: 30 IO/s: 25780 MB/s: 3222
Threads: 4 Size: 131072 READ Time: 30 IO/s: 25780 MB/s: 3222
Threads: 8 Size: 131072 READ Time: 30 IO/s: 25758 MB/s: 3219
Threads: 16 Size: 131072 READ Time: 30 IO/s: 25706 MB/s: 3213
Threads: 32 Size: 131072 READ Time: 30 IO/s: 25718 MB/s: 3214
Threads: 64 Size: 131072 READ Time: 30 IO/s: 25710 MB/s: 3213
两个线程最大限度地提高了这些大块的吞吐量。
仅仅3200 MB/s听起来可能不快——它是3.2 GB/s。但SATA以位而不是字节来衡量性能。一旦你摆脱了开销,SATA 3的6 GB/s的最大速度约为550 MB/s。
一旦NVMe设备有了命名空间,nvd(4)驱动程序就会发挥作用。这是一个实际上是GEOM提供者的设备,可用于使用ZFS存储数据。您将看到/dev/nvd0、/dev/nvd1等设备节点。
如果您计划将NVMe设备用作引导驱动器,则必须对引导/dev/nvd设备进行分区,可能使用GPT。如果不是从设备启动,则可以跳过分区表,直接在设备节点上写入文件系统。
传统的BIOS和CSM模块只理解传统磁盘和看起来像它们的东西。NVMe设备的全部意义在于它们拒绝撒谎,也不模仿传统的硬盘。
从NVMe设备启动需要使用UEFI启动。FreeBSD在FreeBSD 10.3中通过EFI获得了在ZFS上引导root的能力。
FreeBSD包含zfsd(8)。这个特定于FreeBSD的守护进程提供了Solaris服务管理工具(Service Management Facility——SMF)提供的一些功能。
zfsd接收关于内核无法自行处理的故障和通知,并解决这些故障。
守护进程会监听devctl事件,如I/O错误或磁盘连接和删除事件,然后通过激活和停用热备盘或联机和脱机池中的单个设备来响应它们。
zfsd不需要任何配置。它根据池的配置做出所有决定。
如果收到VDEV成员磁盘的设备删除通知,zfsd会立即激活池中的热备盘并开始重新调整大小。
当新的GEOM设备出现时,zfsd首先检查ZFS标签。如果磁盘有一个标签,表明它以前是池的成员,则会重新连接。一旦完成重新定位,任何临时替换该设备的热备件都将被停用并返回可用备件列表。
如果新到达的设备没有ZFS标签,但其物理路径与VDEV缺失成员的物理路径匹配,并且池中设置了自动替换池属性,则使用新设备替换缺失的设备。在较新的FreeBSD版本中,物理路径可能为空,也可能是SES路径,如/dev/enc@n500304801786b87d/type@0/slot@1/elmdesc@Slot_01/gpt/f01-1EHJZMBC。
重置完成后,zfsd将停用任何临时替换该设备的热备盘。停用的设备将返回可用备件列表。
如果VDEV性能下降或出现故障,zfsd会尝试通过激活热备盘来解决问题。
如果单个设备在60秒内产生超过50个I/O或校验和错误,zfsd会将该设备标记为降级并激活热备盘。ZFS继续使用降级的设备,而池则恢复。一旦池完成重定位,zfsd就会从池中删除故障设备。
如果向池中添加或返回了新的热备盘,如果需要更换另一个设备,zfsd会激活该热备盘。
当resilver操作完成时,zfsd会尝试停用不再需要的任何热备盘,以便在发生进一步故障时可以替换它们。
zfsd还监听“物理路径更改”事件,当设置了新到达磁盘的路径时,会收到通知。这可能会比磁盘插入事件本身到达时稍晚发生。
当更新物理路径并设置池的自动替换属性(autoreplace)时,zfsd会尝试用相同的物理路径替换任何丢失的磁盘。
当您换出故障磁盘,并且CAM子系统注意到新磁盘位于同一插槽中,具有相同的路径时,zfsd会自动启动替换操作并将池恢复到健康状态。
将磁盘从一个插槽移动到另一个插槽的工作原理与移除磁盘并重新插入磁盘完全相同。内核将缺失的磁盘标记为已移除。当您将磁盘放回时,内核会看到磁盘上的ZFS标签,识别它属于哪个池,并自动通过zpool在线重新激活它。池元数据将使用物理路径进行更新。
现在我们已经讨论了如何使用高级硬件,让我们来看看各种ZFS缓存的高级用途。