2014-12-27 9 views
8

Stiamo scrivendo un software altamente concomitante in C++ per alcuni host, tutti dotati di un singolo ST9500620NS come unità di sistema e una scheda SSD PCIe Intel P3700 NVMe Gen3 per i dati. Cercando di capire il sistema più per accordare il nostro software, ho scavato attorno al sistema (due E5-2620 v2 @ CPU 2.10GHz, 32GB di RAM, in esecuzione CentOS 7.0) e sono rimasto sorpreso da individuare il seguente:Selezione del programmatore di I/O di Linux corretto per un host dotato di SSD NVMe?

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

Questo contraddice tutto ciò che ho imparato a selezionare il corretto scheduler di I/O di Linux, come ad esempio da the official doc on kernel.org.

Capisco che NVMe è un nuovo capretto sul blocco, quindi per ora non toccherà l'impostazione dello scheduler esistente. Ma mi sento davvero strano per il "nessuno" inserito dall'installatore. Se qualcuno che ha qualche suggerimento su dove posso trovare maggiori informazioni o condividere i risultati, sarei grato. Ho passato molte ore a cercare su Google senza trovare nulla di concreto finora.

risposta

7

"none" (aka "noop") è lo scheduler corretto da utilizzare per questo dispositivo.

Gli schedulatori I/O sono utili principalmente per dispositivi di memorizzazione più lenti con accodamento limitato (ad esempio, singoli dischi rigidi meccanici). Lo scopo di un programmatore I/O è di riordinare le richieste di I/O per ottenere servizi più importanti prima. Per un dispositivo con una coda interna molto grande e un servizio molto veloce (come un SSD PCIe!), Un programmatore di I/O non funzionerà in alcun modo; è meglio solo inviare tutte le richieste al dispositivo immediatamente.

+0

logicamente, ho ottenuto quello che hai detto. Forse avrei dovuto rendermi più chiaro - non ho visto questa opzione "nessuno" da nessuna parte. Devo scavare nel codice del kernel per trovarlo o è documentato da qualche parte? – user183394

+0

In effetti, ero così curioso di aver scaricato l'intero 'linux-3.18.1.tar.xz' sul mio computer,' untar' la taraca 'zx'-source sorgente, e sono andato in 'linux-3.18.1/block', ha fatto un 'grep -i none' e ha esaminato anche' noop-iosched.c'. Da nessuna parte ho visto questa opzione nome "nessuna". Ora sono ancora più sconcertato perché il programma di installazione di CentOS Anaconda abbia usato questo nome apparentemente non documentato. Ehi, gente di Red Hat? – user183394

+0

I miei dispositivi di loopback mostrano 'cat/sys/block/loop */queue/scheduler' come' none'. Sei sicuro che il tuo dispositivo sia riconosciuto, collegato, formattato correttamente e/o montato con qualche tipo di file system (ext {3,4}, btrfs). Da questo articolo [Tuning i/o schedulers per ssds] (http://dev.nuodb.com/techblog/tuning-linux-io-scheduler-ssds) tuttavia, dovrebbe mostrare tutti gli scheduler standard e uno selezionato. Almeno dovrebbe darti un'opzione usando un altro programmatore a scopo di test? – askb

9

La risposta data da Sanne nei commenti è corretta:

"La ragione è che NVMe bypassa lo scheduler Non stai utilizzando la. 'Noop' l'attuazione:. Non si sta usando un programmatore"

noop non è la stessa come nessuno, Noop esegui ancora blocco fusione (a meno che si disattiva con nomerges)

Se si utilizza un dispositivo nvme, o se si attiva "scsi_mod.use_blk_mq = Y" in fase di compilazione o tempo di avvio, quindi si ignora la coda di richiesta tradizionale e i suoi scheduler associati.

Gli scheduler per blk-mq potrebbero essere sviluppati in futuro.

Problemi correlati