Multi-Queue Block I/O Queueing (blk-mq) ist ein neues Framework für den Linux Block Layer. Er wurde mit dem Linux Kernel 3.13 eingeführt und im Linux Kernel 3.16 vervollständigt. Blk-mq ermöglicht für High-Performance Flash-Devices (zum Beispiel PCIe-SSDs) über 15 Millionen IOPS auf 8-Socket-Servern, aber auch Single- und Dual-Socket-Server profitieren vom neuen Subsystem [1]. Ein Gerät wird dann über blk-mq angesteuert, wenn sein Gerätetreiber auf blk-mq basiert.
Blk-mq stellt Gerätetreibern die Grundfunktionen zur Verteilung der I/O-Anfragen auf mehrere Warteschlangen bereit. Die Aufgaben verteilen sich mit blk-mq auf mehrere Threads und damit auf mehrere CPU-Kerne. Blk-mq-kompatible Treiber teilen ihrerseits dem blk-mq-Modul mit, wie viele parallele Hardware Queues ein Gerät unterstützt.
Blk-mq-basierende Gerätetreiber umgehen die bisherigen Linux-I/O-Scheduler. In der Vergangenheit haben das bereits einige Treiber ohne blk-mq gemacht (iomemory-vsl, nvme, mtip32xx), diese mussten als BIO-basierte Treiber aber viele generische Funktionen selbst bereitstellen. Derartige Treiber sind eher auf Rückzug und werden nach und nach umprogrammiert, um den einfacheren Weg über blk-mq zu gehen.
Treiber mit blk-mq-Unterstützung |
|||
|
|||
Treiber |
Devicename |
unterstützte Geräte |
blk-mq seit Kernel Version |
null_blk |
/dev/nullb* |
keine (Test-Treiber) |
3.13 |
virtio-blk |
/dev/vd* |
virtueller Gast-Treiber (etwa unter KVM) |
3.13 |
mtip32xx |
/dev/rssd* |
Micron RealSSD PCIe |
3.16 |
scsi (scsi-mq) |
/dev/sd* |
zum Beispiel SATA- und SAS-HDDs und -SSDs, RAID-Controller, FC-HBAs, ... |
3.17 |
NVMe |
/dev/nvme* |
NVMe SSDs, z.B. Intel SSD DC P3600 DC P3700 Series |
3.19 |
rbd |
/dev/rdb* |
RADOS Block Device (Ceph) |
4.0 |
ubi/block |
/dev/ubiblock* |
RADOS Block Device (Ceph) |
4.0 |
loop |
/dev/loop* |
Loopback-Device |
4.0 |
Vom Block-Layer geht es beim Ansteuern von einigen Speichergeräten direkt in den jeweiligen Hardware-Treiber, zum Beispiel für neue NVMe Flash-Speicher in den NMVe-Treiber, der seit Kernel Version 3.19 blk-mq verwendet. Für alle Speichergeräte, die über eine Gerätedatei wie »/dev/sd*
«
, »/dev/sr*
«
oder »/dev/st*
«
angesprochen werden, führt der Weg jedoch zuerst in den SCSI Mid-Layer. Mit diesem werden nicht nur SCSI- beziehungsweise SAS-Geräte angesprochen, sondern auch SATA-Speicher, RAID-Controller oder FC-HBAs.
Dank scsi-mq lassen sich ab Linux Kernel 3.17 solche Geräte über blk-mq ansprechen. Dieser Weg ist derzeit standardmäßig jedoch noch deaktiviert. Christoph Hellwig, der maßgebliche Entwickler von scsi-mq, hofft jedoch in künftigen Linux Versionen scsi-mq standardmäßig zu aktivieren, um später den alten Codepfad vollständig zu entfernen [2].
Bei den SCSI Low Level-Treibern handelt es sich am unteren Ende des Storage-Stack tatsächlich um jene Treiber, welche die jeweiligen Hardware-Komponenten ansprechen. Sie reichen von den allgemeinen Libata-Treibern zur Ansteuerung von (S)ATA-Komponenten über RAID-Controller-Treiber wie megaraid_sas (Avago MegaRAID / vormals LSI) oder aacraid (Adaptec), (FC)-HBA Treiber wie qla2xxx (Qlogic) bis hin zu den paravirtualisier-ten Treibern virtio_scsi und vmw_pvscsi. Damit diese Treiber künftig mehrere parallele Hardware Queues via blk-mq/scsi-mq bereitstellen können, muss jeder einzelne Treiber entsprechend angepasst werden.