Motivazione
Con una velocità di segnalazione di 480 MBit / s i dispositivi USB 2.0 dovrebbero essere in grado di trasmettere dati fino a 60 MB / s. Tuttavia, i dispositivi di oggi sembrano essere limitati a 30-42 MB / s durante la lettura di [ Wiki: USB ]. Questo è un overhead del 30 percento.
L'USB 2.0 è uno standard di fatto per i dispositivi esterni da oltre 10 anni. Una delle applicazioni più importanti per l'interfaccia USB sin dall'inizio è stata la memorizzazione portatile. Sfortunatamente USB 2.0 è stato rapidamente un collo di bottiglia che limita la velocità a queste applicazioni impegnative in termini di larghezza di banda, un HDD di oggi è in grado, ad esempio, di oltre 90 MB / s in lettura sequenziale. Considerando la lunga presenza sul mercato e la costante necessità di una maggiore larghezza di banda, dovremmo aspettarci che l'ecosistema USB 2.0 sia stato ottimizzato nel corso degli anni e abbia raggiunto prestazioni di lettura vicine al limite teorico.
Qual è la massima larghezza di banda teorica nel nostro caso? Ogni protocollo ha un overhead incluso USB e secondo lo standard USB 2.0 ufficiale è 53.248 MB / s [ 2 , Tabella 5-10]. Ciò significa che teoricamente i dispositivi USB 2.0 di oggi potrebbero essere il 25 percento più veloci.
Analisi
Per avvicinarsi alla radice di questo problema, la seguente analisi dimostrerà cosa sta succedendo sul bus durante la lettura di dati sequenziali da un dispositivo di archiviazione. Il protocollo è suddiviso strato per strato e siamo particolarmente interessati alla domanda sul perché 53.248 MB / s sia il numero massimo teorico per i dispositivi a monte di massa. Infine, parleremo dei limiti dell'analisi che potrebbero darci alcuni suggerimenti di costi generali aggiuntivi.
Gli appunti
In tutta questa domanda vengono utilizzati solo i prefissi decimali.
Un host USB 2.0 è in grado di gestire più dispositivi (tramite hub) e più endpoint per dispositivo. Gli endpoint possono operare in diverse modalità di trasferimento. Limiteremo la nostra analisi a un singolo dispositivo collegato direttamente all'host e in grado di inviare continuamente pacchetti completi su un endpoint di massa a monte in modalità ad alta velocità.
Framing
La comunicazione USB ad alta velocità è sincronizzata in una struttura a frame fisso. Ogni frame è lungo 125 us e inizia con un pacchetto Start-Of-Frame (SOF) ed è limitato da e sequenza End-Of-Frame (EOF). Ogni pacchetto inizia con SYNC e termina con e End-Of-Packet (EOF). Quelle sequenze sono state aggiunte ai diagrammi per chiarezza. EOP ha dimensioni variabili e dipende dai dati dei pacchetti, per SOF è sempre di 5 byte.
Apri l'immagine in una nuova scheda per vedere una versione più grande.
Le transazioni
USB è un protocollo guidato da master e ogni transazione viene avviata dall'host. La fascia oraria tra SOF ed EOF può essere utilizzata per le transazioni USB. Tuttavia, i tempi per SOF ed EOF sono molto rigidi e l'host avvia solo transazioni che possono essere completate completamente nel periodo di tempo libero.
La transazione a cui siamo interessati è una transazione IN in blocco di successo. La transazione inizia con un pacchetto tocken IN, quindi gli host attendono un pacchetto di dati DATA0 / DATA1 e confermano la trasmissione con un pacchetto di handshake ACK. L'EOP per tutti questi pacchetti è compreso tra 1 e 8 bit a seconda dei dati dei pacchetti, qui abbiamo ipotizzato il caso peggiore.
Tra ciascuno di questi tre pacchetti dobbiamo considerare i tempi di attesa. Questi sono tra l'ultimo bit del pacchetto IN dell'host e il primo bit del pacchetto DATA0 del dispositivo e tra l'ultimo bit del pacchetto DATA0 e il primo bit del pacchetto ACK. Non dobbiamo considerare ulteriori ritardi poiché l'host può iniziare a inviare il successivo IN subito dopo aver inviato un ACK. Il tempo di trasmissione del cavo è definito come massimo 18 ns.
Un trasferimento di massa può inviare fino a 512 byte per transazione IN. E l'host proverà a emettere quante più transazioni possibili tra i delimitatori di frame. Sebbene il trasferimento di massa abbia una bassa priorità, può richiedere tutto il tempo disponibile in uno slot quando non vi sono altre transazioni in sospeso.
Per garantire il corretto ripristino del clock, gli standard definiscono un riempimento di bit di chiamata di metodo. Quando il pacchetto richiederebbe una sequenza molto lunga della stessa uscita, viene aggiunto un fianco aggiuntivo. Ciò garantisce un fianco dopo un massimo di 6 bit. Nel peggiore dei casi, ciò aumenterebbe la dimensione totale del pacchetto di 7/6. L'EOP non è soggetto a ripieni di bit.
Apri l'immagine in una nuova scheda per vedere una versione più grande.
Calcoli della larghezza di banda
Una transazione IN in blocco ha un overhead di 24 byte e un payload di 512 byte. Questo è un totale di 536 byte. Il periodo di tempo tra è largo 7487 byte. Senza la necessità di ripieni di bit, c'è spazio per 13.968 pacchetti. Con 8000 Micro-frame al secondo possiamo leggere i dati con 13 * 512 * 8000 B / s = 53.248 MB / s
Per dati totalmente casuali ci aspettiamo che il bit stuffing sia necessario in una delle 2 ** 6 = 64 sequenze di 6 bit consecutivi. Questo è un aumento di (63 * 6 + 7) / (64 * 6). Moltiplicando tutti i byte soggetti a riempimento di bit per quei numeri si ottiene una lunghezza totale della transazione di (19 + 512) * (63 * 6 + 7) / (64 * 6) + 5 = 537,38 byte. Il risultato è 13.932 pacchetti per Micro-Frame.
C'è un altro caso speciale mancante da questi calcoli. Lo standard definisce un tempo di risposta massimo del dispositivo di 192 bit volte [ 2 , capitolo 7.1.19.2]. Questo deve essere considerato quando si decide se l'ultimo pacchetto si adatta ancora al frame nel caso in cui il dispositivo abbia bisogno del tempo di risposta completo. Potremmo spiegarlo usando una finestra di 7439 byte. La larghezza di banda risultante è identica.
Cos'è rimasto
Il rilevamento e il ripristino degli errori non sono stati coperti. Forse gli errori sono abbastanza frequenti o l'errore nel recupero richiede abbastanza tempo per avere un impatto sulle prestazioni medie.
Abbiamo assunto la reazione istantanea dell'host e del dispositivo dopo i pacchetti e le transazioni. Personalmente non vedo alcuna necessità di grandi compiti di elaborazione alla fine di pacchetti o transazioni su entrambi i lati e quindi non riesco a pensare a nessun motivo per cui l'host o il dispositivo non dovrebbero essere in grado di rispondere istantaneamente con implementazioni hardware sufficientemente ottimizzate. Soprattutto durante il normale funzionamento, la maggior parte del lavoro di contabilità e di rilevamento degli errori potrebbe essere svolto durante la transazione e i pacchetti e la transazione successivi potrebbero essere messi in coda.
Non sono stati presi in considerazione trasferimenti per altri endpoint o comunicazioni aggiuntive. Forse il protocollo standard per i dispositivi di archiviazione richiede una comunicazione continua sul canale laterale che consuma tempo prezioso nello slot.
Potrebbe esserci un sovraccarico di protocollo aggiuntivo per i dispositivi di archiviazione per il driver del dispositivo o il livello del file system. (payload del pacchetto == dati di archiviazione?)
Domanda
Perché le implementazioni odierne non sono in grado di eseguire lo streaming a 53 MB / s?
Dov'è il collo di bottiglia nelle implementazioni di oggi?
E un potenziale seguito: perché nessuno ha cercato di eliminare un simile collo di bottiglia?