一台典型的服务器只能容纳这么多硬盘。随着存储需求的增长,您最终会遇到比典型家用机器上更先进的硬件。本章涵盖了足够的基础知识,以确保您知道存储供应商试图向您推销什么,以及如何利用这些附加功能。
第六章:高级硬件SCSI 机柜服务检查你的机柜机柜路径保持亮灯控制主机总线适配器适配器详细信息显示机柜sas2ircu查看设备sas2ircu 定位灯SAS 多路径为什么要用多路径?多路径模式识别磁盘配置多路径多路径设备节点手动多路径配置查看多路径变更多路径模式SSDsNVMe查看NVMe 设备NVMe 性能NVMe GEOM 提供者和引导zfsd
Enclosure——机柜
添加存储空间的最常见的方法是通过专门设计用于存放硬盘的盒子。最常见的是SCSI机柜(有时称为背板——backplance)。将SCSI机柜连接到带有磁盘控制器卡的主机。
SCSI机柜中有各种硬件和功能。常见的有SAS或SATA端口倍增器,允许将四个以上的驱动器连接到磁盘控制器的每个端口。您可能会看到磁盘托架或托盘,可能是热插拔的。机柜有风扇、温度传感器、电源等。机柜甚至可能有自己的CPU,运行专门设计用于容纳所有这些功能的自定义操作系统。风扇和电源故障可能会导致您的存储设备停机。
SCSI机柜具有与服务器操作系统通信的协议。SCSI机柜服务(SCSI Enclosure Services,SES)是用于监视和管理服务器存储子系统的现代协议。它是旧硬件中SCSI访问容错机柜(SCSI Accessed Fault-Tolerant Enclosure,SAF-TE)协议的继承者。
SES通常集成到热插拔托架的背板或SAS扩展器中。SES提供了一种监控和定位磁盘驱动器的标准方法,也可以用于监控风扇、灯和其他设备。
FreeBSD使用 ses(4) 驱动程序支持SES。FreeBSD10.3引入了 sesutil(8) ,允许管理员检查和控制系统上的 ses(4) 设备。
sesutil(8) 有许多子函数。从 sesutil map 开始,它显示了所有机柜中的所有设备:
xxxxxxxxxx# sesutil mapses0: Enclosure Name: LSI SAS2X36 0e12 Enclosure ID: 500304801786b87f机柜的第一个条目是机柜设备名称(ses0)。如果有多个控制器,重新启动可能会更改设备节点,因此不要依赖它来识别特定的机柜。Enclosure Name基于硬件型号,但Enclosure ID对于此特定硬件是唯一的。
机柜中的每个受监控或受控硬件都有一个 element(元素)。每个元素都被分配了一个数字。重新启动时,元素编号不会改变。以下是一个数组的第一个元素:
xxxxxxxxxxElement 0, Type: Array Device Slot Status: Unsupported (0x00 0x00 0x00 0x00) Description: Drive SlotsElement 0 有一个类型为 Array Device Slot ,并描述了驱动器插槽。这是所有单独驱动器插槽的父元素,如下所示:
xxxxxxxxxxElement 1, Type: Array Device Slot Status: OK (0x01 0x00 0x00 0x00) Description: Slot 01 Device Names: da0,pass4Element 2, Type: Array Device Slot Status: OK (0x01 0x00 0x00 0x00) Description: Slot 02 Device Names: da1,pass5这里有几个实际的硬盘。可以看到FreeBSD设备名称和驱动器的位置。据推测,机柜上会永久打印插槽号,以便于迅速定位故障磁盘。最好不要打印在可拆卸的驱动器托盘上。当FreeBSD抱怨磁盘da1坏了时,你可以告诉现场技术人员直接去插槽02。
其他硬件出现在驱动器托架之后。
xxxxxxxxxxElement 26, Type: Temperature Sensors Status: OK (0x01 0x00 0x39 0x00) Description: Temperature Extra status: - Temperature: 37 C第一个温度计显示外壳处于教科书规定的温度,这有许多话要说。
xxxxxxxxxxElement 28, Type: Cooling Status: OK (0x01 0x01 0xfe 0x21) Description: Fan1 Extra status: - Speed: 5100 rpm冷却元件可能是风扇,尽管现在可能有人已经制造了一个过冷的SCSI机箱。风扇速度可以让你知道风扇仍在运行。不过,您可能需要查看手册才能准确了解Fan1的位置。
xxxxxxxxxxElement 34, Type: Voltage Sensor Status: OK (0x01 0x00 0x01 0xf6) Description: 5V Extra status: - Voltage: 5.02 V电压传感器将每个传感器的预期电压列为 Description ,然后提供实际电压作为额外状态。
SAS扩展器变得稍微复杂一些。您将看到SAS扩展器的条目,然后是扩展器中的所有组件。SAS扩展器几乎没有什么问题,但有些组件确实提供了状态。
xxxxxxxxxxElement 41, Type: SAS Expander Status: Unsupported (0x00 0x00 0x00 0x00) Description: SAS ExpandersElement 42, Type: SAS Expander Status: OK (0x01 0x00 0x00 0x00) Description: Primary ExpanderElement 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)甚至单个连接器也会显示出来:
xxxxxxxxxxElement 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地址。这个数字的确定方式因供应商而异。
type 是数字设备类型。磁盘是此驱动程序目前支持的唯一设备,但以后的FreeBSD版本可能会添加对其他设备的支持。
slot 是驱动器托架。插槽以十六进制编号:插槽a为10,b为11,依此类推。插槽10实际上是16。
最后一个组件是 element description,运行 sesutil map 时显示。
此目录包含指向与此插槽关联的所有设备节点的符号链接。它甚至有标签子目录。
xxxxxxxxxx#ls -l /dev/enc@n500304801786b87d/type@0/slot@a/elmdesc@Slot_10/total 1lrwxr-xr-x 1 root wheel 15 Oct 5 23:27 da9@ -> ../../../../da9dr-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 激活槽位的定位灯。在这里,我们激活机架驱动da2上的灯。
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(8) 和 mptutil(8) 。FreeBSD 10.3增加了 mprutil(8) 和 mpsutil(8) 。
mprutil(8) 用于LSI Fusion MPS-3 HBAmpsutil(8) 用于LSI Fusion-MPS 2 HBA(当Avago购买LSI时,您可能还会看到这些带有Avago品牌的卡。)
这两个程序的行为完全相同,因此我们将使用 mpsutil(8) 进行演示。
首先,找到连接到系统的适配器:
xxxxxxxxxx# mpsutil show adaptersDevice Name Chip Name Board Name Firmware/dev/mps0 LSISAS2308 13000000/dev/mps1 LSISAS2308 13000000现在看看所有连接的设备。默认情况下,这两个工具都访问第一个设备节点 /dev/mps0 或 /dev/mpr0 。使用 -u 选项和设备号访问其他HBA设备:
xxxxxxxxxx# mpsutil show devicesB____T SAS Address Handle Parent Device Speed Enc Slot Wdt 500304801786b87f 0009 0001 SMP Target 6.0 0002 00 400 08 5000cca2325ddda9 000a 0009 SAS Target 6.0 0002 00 100 09 5000cca23257419d 000b 0009 SAS Target 6.0 0002 01 100 10 5000cca2325db3bd 000c 0009 SAS Target 6.0 0002 02 100 11 5000cca2325e028d 000d 0009 SAS Target 6.0 0002 03 1...这里的每一行都是响应SCSI命令的设备。其中大多数是硬盘。SCSI总线上的任何东西都是目标,包括硬盘驱动器。真正深入了解这一点需要了解SAS和SCSI,但我们可以在没有深入了解的情况下收集有用的信息。
前两列显示设备的SCSI式地址。
第三列给出了设备的SAS地址。就像以太网卡一样,每个SAS设备都有一个唯一的物理地址。
Handle 列表示设备的名称。Parent 列显示此设备连接到的设备。
此例的第一行,Handle是0009,第二行的Handle是000a,但其Parent列为0009。第二行的设备连接到第一行的设备。
Device 列显示了这是什么类型的设备。SAS Target是SAS硬盘驱动器的一种花俏的说法。SMP(串行连接管理协议——Serial Attached Management Protocol)目标是一个SAS交换机或扩展器。
Speed 列显示连接速度,单位为每秒千兆字节(GB/s)。
Enc 列显示机柜号。
Slot 列显示插槽或驱动器托架。
Wdt 列显示了此设备上最大端口连接数。
使用 show enclosures 命令查看连接到HBA的机柜。这里我们列出了连接到 /dev/mps1 的机柜:
xxxxxxxxxx# mpsutil -u 1 show enclosuresSlots 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(8) 或其他命令中显示SAS地址。
如果使用的是没有 mpsutil 的旧版FreeBSD,或者需要它不提供的功能,LSI/Avago提供了自己的专有工具 sas2ircu(8) 。mpsutil(8) 缺少的大多数功能都涉及控制器的内置软件RAID。sas2ircu(8) 还可以让你获取HBA固件版本等信息,可以从FreeBSD port中安装,位于 sysutils/sas2ircu 。
sas2ircu(8) 程序至少需要两个参数:控制器(设备节点)编号和命令。即使只有一个控制器,也必须指定控制器编号。
要查看连接到HBA的硬件,可使用display命令。以下示例查看连接到控制器0、/dev/mps0 或 /dev/mpr0 的设备:
xxxxxxxxxx# sas2ircu 0 display你会得到一堆版权信息,以及这样的有用说明:
xxxxxxxxxxRead 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 #0Device 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 。显示命令显示每个设备的机柜号和插槽号。驱动器 8 位于插槽 7 中——通常插槽从 0 开始编号。因此,要闪烁 /dev/mps0 上的驱动器 8 的LED,应按以下操作运行:
xxxxxxxxxx# sas2ircu 0 locate 1:7 on做完操作之后记得关掉它。
具有高可用性要求和多磁盘的系统可能需要SAS多路径(SAS Multipath)。多路径的目标是提供CPU到每个磁盘的多条路径。其他路径可用于负载平衡或故障转移。通常,多路径意味着将两个或多个控制器连接到包含磁盘的背板或存储架。
当每个磁盘都可以通过任何控制器访问时,一个控制器或电缆的故障不必中断服务。此外,它还可以允许使用所有控制器的组合带宽。
这个概念甚至可以扩展到提供完全的高可用性。如果JBOD机框中装满了磁盘,请将两个SAS端口之一连接到第一台服务器,另一个连接到第二台服务器。现在两台服务器都可以访问磁盘。使用CARP(一种心跳守护进程)或一些基于仲裁的高可用性服务,允许这两台服务器共享一个IP地址。
由于两台机器都可以访问所有数据,可以在机器之间优雅地进行故障转移服务。这使得可以在不关闭文件服务器的情况下完成一直推迟的操作系统升级。
需要格外注意的是,要确保两个系统不会试图同时挂载磁盘。这就是为什么 zpool import 命令会检查主机ID,并拒绝导入看起来正被其他系统使用的池。
多路径带来了一个有趣的问题。如果每个磁盘都有两条或多条返回CPU的路径,操作系统将通过每个控制器多次看到每个单独的磁盘。原本的36个磁盘可能看起来有72个。
GEOM多路径模块 gmultipath(8) 采用这些多路径,并向操作系统提供单个逻辑存储设备。gmultipath(8) 会自动选择到达磁盘的最佳路径,因此上层存储层不必担心。
GEOM多路径目前支持三种模式:
active/passive——主动/被动模式。 同一时刻仅使用一个路径。当一条路径失效时,系统会在下一条路径上重新发出命令。
使用 -P 指定active/passive模式。
active/active——主动/主动模式。 同时使用所有路径来增加可用带宽。使用所有路径有时实际上会损坏性能。此模式不知道文件系统或应用程序级别发生了什么;它只是将指令发布到不同的控制器上。相互依赖的命令可能必须等待另一个控制器的响应才能继续。
使用 -A 指定active/active模式。
active/read——主动/读取模式。 使用所有路径进行读取,但通过主路径进行所有写入。这种混合方法解决了使用active/active模式可能引入的一些写顺序问题。此模式可以通过提供更多的控制器来帮助SSD饱和(saturate an SSD)。在常规磁盘上,随机I/O性能实际上可能比active/passive更差。
使用 -R 指定acrive/read模式。
还有一种模式称为 logical block(逻辑块),尚在研究中,未被采用。逻辑块模式将磁盘分解为指定大小的块,并始终使用相同的路径访问该区域。这可以避免控制器上的缓存重复,因为两个控制器不会访问磁盘的同一区域。这也可以解决写顺序问题,并且有望提供比 active/active 模式更好的性能。
配置多路径的烦人部分是识别哪些设备节点(/dev/daX)代表同一硬件的不同视图(views)。在向磁盘添加任何标签之前,必须解决此问题。方法之一是在SATA设备上使用 camcontrol(8) 来获取序列号。
xxxxxxxxxx# camcontrol inquiry da7 -S1EHNLWRC# camcontrol inquiry da43 -S1EHNLWRC建议编制一份设备及其序列号的列表,以便快速找到匹配的设备。
或者可以使用 sesutil(8) 来匹配插槽号。以下例子中的多路径系统中包含两个外壳,第一个有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(8) 需要一个内核模块。在启动时使用 /boot/loader.conf 中加入以下行:
xxxxxxxxxxgeom_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 Componentsmultipath/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模式,或 -R 切换到active/read模式。
您还可以使用这些标志更改现有多路径设备的模式。使用 gmultipath configure 、所需模式的标志和驱动器的gmultipath标签。在这里,我们将标记为f07-1EHNLWRC的磁盘切换到活动/读取模式:
xxxxxxxxxx# gmultipath configure -R f07-1EHNLWRCDid 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也可以轮换。享受吧!
下面谈谈SSDs...
固态磁盘(SSDs)与常规旋转驱动器有很大不同,需要与传统磁盘完全不同的调优。首先,它们甚至不是磁盘。
要使旋转硬盘驱动器读取驻留在磁盘上不同位置的两个扇区,读取头必须将自身定位在正确的位置,然后等待旋转盘片旋转到正确的位置、读取扇区,然后将自身重新定位到第二扇区,再次等待盘片旋转至正确的偏移量,然后读取第二个扇区。这种等待称为寻道时间(seek time)。
SSD没有活动部件。从驱动器的两个不同部分读取数据时,驱动器的寻道时间为零。大多数SSD之所以具有相对较高的读写速度,是因为它们同时对多个单元进行读写。为了使多个内存单元保持繁忙,操作系统必须为驱动器提供一个要完成的工作队列。
对于正常的旋转驱动器,具有“深度”队列是不好的。它意味着请求数据和写入或返回数据之间的时间量更高,因为它必须等待队列中前面的工作完成。通过具有较低的队列深度,更重要的工作项可以首先到达队列的前面,从而在第5行中耐心等待的不太重要的工作之前进行剪切。然而,为了最大限度地利用SSD,队列深度必须足够高,以确保每个单元都分配了工作。如果没有很好的完整队列,就无法获得机箱上吹嘘的性能数字。
为了充分利用SSD等高IOPS设备,ZFS VDEV队列深度可调可能需要增加。这有助于在队列中保持足够的工作,以防止设备空闲。请参阅第8章的“I/O队列”部分。
与旋转磁盘不同,旋转磁盘具有驻留在盘片上固定位置的扇区,SSD是一组固定的闪存单元。SSD使用FTL(Flash Translation Layer,闪存转换层)将磁盘上的模拟位置映射到包含存储数据的特定闪存单元。虽然SSD声称具有旋转磁盘使用的逻辑块地址,但FTL提供了这些LBA。SSD上的LBA与现实的关系甚至比旋转磁盘上的还要少。
由于闪存单元磨损,几乎所有SSD包含的存储空间都比它们在机箱上声称的要多。驱动器将数据分布在单元周围,以便更均匀地磨损它们。一旦所有空间都被占用,就会运行垃圾收集器。垃圾收集器查找不再引用的单元,或操作系统已使用TRIM(SATA)或UNMAP(SCSI)命令标记为未使用的单元,并清除它们以供进一步使用。
当您将支持TRIM的SSD或其他设备添加到ZFS池时,FreeBSD默认会修剪(TRIMs)整个分区或设备,以便它以已知状态启动。这可能会导致驱动器可用之前的几十分钟甚至几个小时的延迟。如果您的设备是新设备,或者您不想在将它们添加到池中时修剪它们,请在将设备添加到池之前将sysctl vfs.zfs.vdev.trim_on_init 设置为 0 。
TRIM——修剪。
SSD修剪是一个过程,有助于随着时间的推移继续保持固态硬盘的性能。Trim的工作原理是定期擦除不再使用的数据块。TRIM后的数据并不总是直接删除,因为需要一个复杂的过程来确定何时删除。而定期TRMI,不仅可以释放硬盘空间,还可以帮助SSD性能更好,寿命更长。
NVMe——Non-Volatile Memory Express,非易失性存储器express是一种较新的技术,旨在进一步提高固态存储速度。它用于闪存驱动器,以及其他非易失性存储器。如英特尔的3D Xpoint。NVMe本身是一种物理接口规范,是SATA或SCSI/SAS的替代品。您会发现通过PCI-e总线连接的NVMe电缆和适配器。
SSD中最慢、最复杂和最容易出错的部分是FTL。假装像20世纪80年代的旋转磁盘一样愚蠢是一项艰巨的工作。NVMe通过放弃这种笨拙的伪装,而采用更适合闪存的协议,提高了在相同硬件上的性能。
NVMe设备和SSD之间最大的区别之一是:NVMe设备有多个队列,通常每个CPU有一个读取队列和一个写入队列。NVMe没有试图使单个队列中的工作足够多,以占用多个闪存单元,而是有多个队列。NVMe队列可以保持相对较浅的深度,以允许高优先级任务取代其他工作。跨CPU分配负载有助于确保更高的性能。
虽然大多数HDD和SSD都与AHCI接口,每个AHCI设备最多有64个命令的单个命令队列,但NVMe接口允许65536个队列,每个队列包含65536个命令。因此,NVMe接口需要更少的锁定,同时提供更大的并行性和性能,从而提高性能。
FreeBSD从9.2开始支持 nvme(4) 。就像硬盘驱动器设备节点一样,您可以期望第一个 nvme(4) 设备是 /dev/nvme0 、/dev/nvme1 ,依此类推。
NVMe设备本机支持命名空间,允许它们被划分为逻辑单元,与分区相似但不同。nvme(4) 使用字符 ns 来标识设备节点中的命名空间。与计算中的大多数其他内容不同,NVM express 规范从1 而不是 0 开始对命名空间进行编号。因此,节点形如 /dev/nvme0ns1 、 /dev/nvme0ns2 等。
只有一些较新的企业级NVMe设备支持管理命名空间,大多数当前设备都有一个覆盖整个设备的名称空间。
使用 nvmecontrol(8) 管理NVMe设备。使用 nvmecontrol devlist 命令查看所有连接到系统的NVMe硬件:
xxxxxxxxxx# nvmecontrol devlist nvme0: INTEL SSDPEDMD800G4 nvme0ns1 (763097MB)这台主机有一个NVMe,单独的命名空间。
使用 nvmecontrol identify 命令查看设备的具体信息:
xxxxxxxxxx# nvmecontrol identify nvme0Controller Capabilities/Features================================Vendor ID: 8086Subsystem Vendor ID: 8086Serial Number: CVFT4030004A800CGNModel Number: INTEL SSDPEDMD800G4Firmware Version: 8DV10151…这一过程持续了相当长的时间,确定了NVMe支持(或不支持)的所有功能。
identify 命令还可以工作在命名空间上:
xxxxxxxxxx# nvmecontrol identify nvme0ns1Size (in LBAs): 1562824368 (1490M)Capacity (in LBAs): 1562824368 (1490M)Utilization (in LBAs): 1562824368 (1490M)Thin Provisioning: Not SupportedNumber of LBA Formats: 7Current LBA Format: LBA Format #00LBA Format #00: Data Size: 512 Metadata Size: 0LBA Format #01: Data Size: 512 Metadata Size: 8LBA Format #02: Data Size: 512 Metadata Size: 16LBA Format #03: Data Size: 4096 Metadata Size: 0LBA Format #04: Data Size: 4096 Metadata Size: 8LBA Format #05: Data Size: 4096 Metadata Size: 64LBA Format #06: Data Size: 4096 Metadata Size: 128LBA格式允许指定扇区大小,包括用于加密或元数据的可选额外空间。然而,FreeBSD还不允许使用不同的扇区大小重新格式化驱动器。
nvmecontrol(8) 套件还包括一个性能测试工具: 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;doneThreads: 1 Size: 512 READ Time: 30 IO/s: 215377 MB/s: 105Threads: 2 Size: 512 READ Time: 30 IO/s: 309203 MB/s: 150Threads: 4 Size: 512 READ Time: 30 IO/s: 509559 MB/s: 248Threads: 8 Size: 512 READ Time: 30 IO/s: 534976 MB/s: 261Threads: 16 Size: 512 READ Time: 30 IO/s: 535131 MB/s: 261Threads: 32 Size: 512 READ Time: 30 IO/s: 534682 MB/s: 261Threads: 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;doneThreads: 1 Size: 4096 READ Time: 30 IO/s: 171261 MB/s: 668Threads: 2 Size: 4096 READ Time: 30 IO/s: 308112 MB/s: 1203Threads: 4 Size: 4096 READ Time: 30 IO/s: 424894 MB/s: 1659Threads: 8 Size: 4096 READ Time: 30 IO/s: 521704 MB/s: 2037Threads: 16 Size: 4096 READ Time: 30 IO/s: 543984 MB/s: 2124Threads: 32 Size: 4096 READ Time: 30 IO/s: 543376 MB/s: 2122Threads: 64 Size: 4096 READ Time: 30 IO/s: 542464 MB/s: 2119即使在一个线程中,我们也会用512字节的块来破坏可能的性能。8个线程的速度约为2000 MB/s,而16个或更多线程的速度则约为2120 MB/s。通过更多的测试,您可以发现大约9个或10个线程可以在这个块大小下最大限度地提高性能。
下面是不常见的128KB的块:
xxxxxxxxxxThreads: 1 Size: 131072 READ Time: 30 IO/s: 21770 MB/s: 2721Threads: 2 Size: 131072 READ Time: 30 IO/s: 25780 MB/s: 3222Threads: 4 Size: 131072 READ Time: 30 IO/s: 25780 MB/s: 3222Threads: 8 Size: 131072 READ Time: 30 IO/s: 25758 MB/s: 3219Threads: 16 Size: 131072 READ Time: 30 IO/s: 25706 MB/s: 3213Threads: 32 Size: 131072 READ Time: 30 IO/s: 25718 MB/s: 3214Threads: 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 11.0预计于2016年7月发布,将包括 zfsd(8) 的第一个版本。该守护程序特定于FreeBSD,提供了Solaris服务管理工具(Service Management Facility,SMF)提供的一些功能。zfsd(8) 接收内核无法自行处理的错误的通知,并解决它们。
守护程序侦听 devctl(4) 事件,如I/O错误或磁盘连接和删除事件,然后通过激活和停用热备盘,或使池中的单个设备联机和脱机来响应这些事件。
zfsd(8) 不需要任何配置。它根据池配置做出所有决策。在 zfsd 的第一个版本中,只有 autoreplace 池属性具有一些效果。
如果接收到作为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 会在需要更换其他设备时激活该备盘。
当恢复器操作完成时,zfsd 会尝试停用不再需要的任何热备盘,以便在发生进一步的故障时可以用它们来替换。
zfsd(8) 还侦听“物理路径更改(physical path change)”事件,在设置新到达的磁盘的路径时得到通知。这可能发生在磁盘插入事件本身到达之后。更新物理路径并设置池的 autoreplace 属性时,zfsd 会尝试用相同的物理路径替换任何丢失的磁盘。
当换出故障磁盘时,CAM子系统注意到新磁盘位于相同的插槽中,具有相同的路径,zfsd 会自动启动 replace 操作,并将池恢复到健康状态。
将磁盘从一个插槽移动到另一个插槽的工作方式与删除磁盘并重新插入磁盘的工作方式完全相同。内核将不存在的磁盘标记为已删除。当您将磁盘放回时,内核会看到磁盘上的ZFS标签,标识它属于哪个池,并使用 zpool online 命令自动重新激活它。池元数据将随物理路径更新。
现在我们已经讨论了如何使用高级硬件,让我们看看各种ZFS缓存的高级使用。