Speicher muss nicht nur laufend größer werden, sondern auch schneller. In Zeiten von Virtualisierung und immer leistungsfähigeren Rechnern, die zeitnah auf ... (mehr)

Schnell am Scheduler vorbei

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

SCSI-Layer

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.

comments powered by Disqus
Einmal pro Woche aktuelle News, kostenlose Artikel und nützliche ADMIN-Tipps.
Ich habe die Datenschutzerklärung gelesen und bin einverstanden.

Konfigurationsmanagement

Ich konfiguriere meine Server

  • von Hand
  • mit eigenen Skripts
  • mit Puppet
  • mit Ansible
  • mit Saltstack
  • mit Chef
  • mit CFengine
  • mit dem Nix-System
  • mit Containern
  • mit anderer Konfigurationsmanagement-Software

Ausgabe /2023