2014-12-27 7 views
8

Wir schreiben eine hoch gleichzeitige Software in C++ für einige Hosts, die alle mit einem einzelnen ST9500620NS als Systemlaufwerk und einer Intel P3700 NVMe Gen3 PCIe SSD-Karte für Daten ausgestattet sind. Der Versuch, das System mehr zur Abstimmung unserer Software zu verstehen, grub ich um das System (zwei E5-2620 v2 @ 2.10GHz CPUs, 32 GB RAM, läuft CentOS 7.0) und war überrascht zu entdecken folgendes:Auswählen des richtigen Linux I/O-Schedulers für einen mit NVMe SSD ausgestatteten Host?

[[email protected] ~]# cat /sys/block/nvme0n1/queue/scheduler 
none 

Diese widerspricht allem, was ich über die Auswahl des richtigen Linux I/O-Schedulers gelernt habe, z. B. von the official doc on kernel.org.

Ich verstehe, dass NVMe ein neues Kind auf dem Block ist, so für jetzt werde ich nicht die vorhandenen Scheduler-Einstellung berühren. Aber ich fühle mich wirklich seltsam wegen der "None", die der Installateur eingebaut hat. Wenn jemand Hinweise darauf hat, wo ich weitere Informationen finden oder Ihre Erkenntnisse weitergeben kann, wäre ich Ihnen dankbar. Ich habe viele Stunden damit verbracht, zu googeln, ohne etwas Konkretes zu finden.

Antwort

7

"keine" (alias "noop") ist der richtige Scheduler für dieses Gerät zu verwenden.

E/A-Scheduler sind hauptsächlich für langsamere Speichergeräte mit begrenzter Warteschlangenfunktion (z. B. einzelne mechanische Festplatten) nützlich - der Zweck eines E/A-Schedulers besteht darin, E/A-Anforderungen neu anzuordnen, um wichtigere früher zu warten. Für ein Gerät mit einer sehr großen internen Warteschlange und einem sehr schnellen Dienst (wie eine PCIe-SSD!) Wird ein E/A-Scheduler Ihnen nichts nützen; Sie sind besser dran, wenn Sie alle Anfragen sofort an das Gerät senden.

+0

logisch, ich habe was du gesagt hast. Vielleicht hätte ich mich deutlicher machen sollen - ich habe diese Option nirgends "nirgendwo" gesehen. Muss ich in den Kernel-Code eindringen, um ihn zu finden, oder ist er irgendwo dokumentiert? – user183394

+0

In der Tat, ich wurde so neugierig, dass ich die gesamte 'linux-3.18.1.tar.xz' auf meine Maschine heruntergeladen habe,' unart' die Quelle 'zx'-ed tear ball und ging in' linux-3.18.1/block', hat ein 'grep -i none' gemacht und auch das' noop-iosched.c' überprüft. Nirgends sah ich diesen Optionsnamen 'none'. Jetzt bin ich noch mehr verwirrt, warum der Installer von CentOS Anaconda diesen scheinbar undokumentierten Namen verwendet hat. Hey, Red Hat Leute? – user183394

+0

Meine Loop-Back-Geräte zeigen 'cat/sys/block/loop */queue/scheduler' als' none' an. Sind Sie sicher, dass Ihr Gerät erkannt, verbunden, formatiert und/oder mit einem Dateisystemtyp (ext {3,4}, btrfs) gemountet ist. Aus diesem Artikel [Tuning-i/o-Scheduler für ssds] (http://dev.nuodb.com/techblog/tuning-linux-io-scheduler-ssds) sollten jedoch alle Standard-Scheduler und eine ausgewählte Scheduler angezeigt werden. Zumindest sollte es Ihnen eine Option geben, die einen anderen Scheduler für Testzwecke verwendet? – askb

9

Die von Sanne gegebene Antwort in den Kommentaren ist richtig:

„Der Grund dafür ist, dass NVMe den Scheduler umgeht Sie sind nicht die Verwendung.‚Noop‘Implementierung. Sie einen Scheduler nicht mit“

noop nicht dasselbe wie keine ist, führt immer noch NOOP Block-Vereinigungs (wenn man es mit nomerges deaktivieren)

Wenn Sie eine NVMe Gerät zu verwenden, oder wenn Sie „scsi_mod.use_blk_mq = Y“ zur Kompilierzeit ermöglichen oder Boot-Zeit, dann umgehen Sie die traditionelle Anfrage-Warteschlange und die damit verbundenen Scheduler.

Scheduler für blk-mq könnten in Zukunft entwickelt werden.