Trasferimento file pesanti: raddoppiate la velocità di Samba/SMB con NVMe over TCP

Il trasferimento di file pesanti in rete locale può essere ottimizzato scegliendo il protocollo più adatto. SMB, pur essendo ampiamente utilizzato grazie alla compatibilità con Windows e Linux, presenta limiti di efficienza. NFS offre prestazioni migliori negli ambienti Unix/Linux, mentre NVMe over TCP rappresenta la soluzione più avanzata.

Mar 25, 2025 - 19:08
 0
Trasferimento file pesanti: raddoppiate la velocità di Samba/SMB con NVMe over TCP

Immaginate di dover trasferire file pesanti attraverso la rete locale, ad esempio da singoli PC e workstation a dispositivi per lo storage dei dati, come server di backup e NAS. La scelta più scontata consiste nell’utilizzo di Samba, un software che consente la condivisione di file e stampanti tra sistemi operativi, come Linux e Windows, utilizzando il protocollo SMB (Server Message Block). SMB è stato originariamente sviluppato da IBM negli anni ’80. Successivamente, Microsoft ha esteso e migliorato SMB, rendendolo il protocollo principale per la condivisione di file su reti Windows. Il protocollo può sfruttare collegamenti di rete Multigigabit, ma le sue prestazioni dipendono da diversi fattori, tra cui la versione del protocollo, l’ottimizzazione della rete e la configurazione dei sistemi.

Da Samba/SMB a NFS e NVMe over TCP per trasferire dati alla massima velocità

Nel corso degli anni, soluzioni alternative a SMB sono nate principalmente per rispondere a esigenze di sicurezza, prestazioni e flessibilità. Microsoft ha infatti cercato di migliorare significativamente le prestazioni di SMB e i risultati si sono visti. Nel 2022, l’ingegnere Ned Pyle – dedicatosi all’ottimizzazione di SMB – ha ad esempio presentato la compressione dati via SMB per velocizzare i trasferimenti dei file pesanti.

Gli amministratori IT hanno oggi un buon margine di manovra per migliorare il comportamento di SMB, soprattutto nella gestione di carichi di lavoro intensivi. Tuttavia, SMB risulta meno efficiente rispetto a soluzioni progettate per la scalabilità. Inoltre, Anche se SMB è supportato da Samba su Linux, le soluzioni alternative possono offrire una maggiore facilità di integrazione tra sistemi operativi differenti e ambienti cloud.

Network File System (NFS)

Il Network File System (NFS) è un protocollo di condivisione file che consente di accedere a file e risorse su un’altra macchina attraverso una rete. Sviluppato da Sun Microsystems negli anni ’80, NFS è ampiamente utilizzato in ambienti Unix e Linux per facilitare la condivisione di file tra sistemi differenti.

NFS generalmente offre prestazioni superiori in ambienti Unix/Linux, grazie a un overhead più basso rispetto a SMB e un design che sfrutta appieno le risorse dei sistemi. È particolarmente efficace per applicazioni che richiedono accessi frequenti e simultanei ai file.

SMB tende ad avere un overhead maggiore, dovuto alla sua complessità e alla necessità di gestire una varietà più ampia di operazioni. Tuttavia, con versioni più moderne come SMB 3.0, le prestazioni sono migliorate, grazie all’introduzione di funzionalità come il Multichannel. È adatto in ambienti misti, grazie al fatto che SMB è supportato di default in Windows e Linux può beneficiare dell’implementazione Samba.

Di contro, NFS è ideale per gli ambienti Unix/Linux in cui la velocità e la semplicità sono cruciali. Windows offre comunque la possibilità di attivare e usare NFS grazie a un’implementazione sviluppata da Microsoft (basta premere Windows+R, digitare optionalfeatures quindi cercare Servizi per NFS).

Attenzione però perché l’implementazione Microsoft di NFS ha sofferto di diverse vulnerabilità in passato: assicuratevi quindi di applicare tutte le patch di sicurezza ad oggi disponibili.

NVMe over Fabrics (NVMe-oF): l’evoluzione dello storage di rete ad alte prestazioni

L’introduzione di NVMe over Fabrics (NVMe-oF) rappresenta un’evoluzione significativa rispetto ai tradizionali protocolli di storage di rete come NFS e SMB. Grazie alla sua architettura avanzata, NVMe-oF consente di sfruttare al massimo le prestazioni native delle unità SSD PCIe NVMe, riducendo al minimo la latenza e ottimizzando l’utilizzo delle risorse di calcolo.

NVMe-oF nasce in via ufficiale nel 2016 con la pubblicazione della prima specifica da parte di NVM Express, organizzazione che sviluppa e gestisce lo standard NVMe. L’obiettivo principale era estendere i vantaggi delle unità NVMe oltre i limiti fisici del bus PCIe, permettendo l’accesso remoto agli SSD NVMe con una latenza minima rispetto ai protocolli di storage tradizionali.

Il ruolo del protocollo NVMe over TCP

NVMe over TCP è una delle modalità di trasporto di NVMe-oF e utilizza la rete TCP/IP per trasmettere i comandi NVMe tra il sistema host e il dispositivo di storage. Il trasferimento dei file pesanti, compatibilmente con la larghezza di banda disponibile, può quindi avvenire sia in rete locale che tra sistemi remoti.

È più accessibile rispetto ad altre implementazioni perché non richiede hardware specializzato (come schede di rete RDMA o Fibre Channel), funzionando con qualsiasi infrastruttura Ethernet esistente.

NVMe over RDMA e Fibre Channel tendono a offrire latenza più bassa rispetto a NVMe over TCP, grazie alla loro capacità di trasferire dati in modo più diretto ed efficiente tra i nodi di rete. Dal canto suo, NVMe over TCP è contraddistinto da una latenza leggermente più elevata a causa della gestione della rete TCP, ma rimane altamente performante e più semplice da implementare.

Trasferire i file pesanti in un lampo con NVMe over TCP

Il bello di NVMe over TCP è che permette di trasferire file alla massima velocità raddoppiando le prestazioni del protocollo SMB. La progettazione del protocollo consente una gestione più efficiente dei dati, riducendo la complessità e migliorando l’affidabilità. Inoltre, la possibilità di effettuare operazioni di I/O in parallelo massimizza l’efficienza delle CPU multi-core e consente a più client di accedere contemporaneamente ai dati con prestazioni elevate.

NVMe over TCP non richiede alcun cambiamento nelle applicazioni o nei sistemi operativi dei server che accedono ai dati, semplificando il deployment. L’uso di unità PCIe NVMe performanti sia lato cliente che lato server è fortemente consigliato per ottenere i massimi benefici in termini di prestazioni e latenza. Non è comunque strettamente necessario usare unità NVMe, tenendo ben presente che potrebbero presentarsi colli di bottiglia servendosi di unità di memorizzazione che non riescono a tenere il passo del collegamento di rete Multigigabit e dei supporti più veloci.

Tabella di confronto tra NVMe over TCP, SMB e NFS

Parametro NVMe over TCP SMB NFS
IOPS (4K RW) 450K 120K 140K
Latenza media 0,3 ms 1,1 ms 0,9 ms
Utilizzo CPU 8% per 100K IOPS 12% per 100K IOPS 9% per 100K IOPS
Costo implementazione Basso Medio Medio

Come raddoppiare le prestazioni di Samba/SMB nel trasferimento di file pesanti

NVMe è progettato per ottimizzare le prestazioni su bus PCIe, ma estendendolo su TCP mantiene molte delle sue caratteristiche di efficienza. Ciò include la capacità di gestire molte code parallele (fino a 65.535) e comandi per coda (fino a 64.000), riducendo l’overhead della CPU e migliorando il throughput.

Partendo da questi presupposti, NVMe over TCP riesce a massimizzare l’utilizzo della banda di rete disponibile, riducendo al minimo le perdite di pacchetti e ottimizzando il flusso dei dati. È quindi destinato a diventare un punto di riferimento per la gestione di trasferimenti dati pesanti su reti Multigigabit.

A marzo 2024 avevamo presentato gli appunti condivisi dall’ingegner Vasudeva Kamath che aveva spiegato come clonare dischi alla massima velocità con NVMe over TCP, attraverso la rete. In quel caso aveva utilizzato una distribuzione Linux live e il comando dd per creare l’immagine di un PC su un altro sistema.

Lo script per configurare NVMe over TCP lato server

Prendete invece adesso lo script “Method 1” disponibile nella pagina Getting Started with NVMe Over Fabrics with TCP (SSD Central). Nella parte superiore dello stesso ci sono alcune variabili, da impostare secondo le proprie esigenze:

  • IP_ADDRESS="192.168.0.179" Indirizzo IP dell’host che espone il dispositivo NVMe.
  • NVME_DEVICE="/dev/nvme1n1" Percorso del dispositivo NVMe da esportare.
  • SUBSYSTEM_NAME="testnqn" Nome del sottosistema NVMe.
  • PORT_NUMBER="4420" Porta TCP usata per la connessione.
  • TRTYPE="tcp" Protocollo di trasporto (TCP).
  • ADRFAM="ipv4" Tipo di indirizzo (IPv4).

Lo script va eseguito sul server ossia sul sistema che memorizzerà in locale i dati trasferiti da altre macchine. Per iniziare, è necessario sostituire 192.168.0.179 con l’indirizzo IP del server (il sistema sul quale lo script è eseguito). Al posto di /dev/nvme1n1, va indicato l’identificativo dell’unità da condividere (può essere trovato con il comando Linux lsblk).

In corrispondenza di SUBSYSTEM_NAME si può assegnare un nome arbitrario alla condivisione NVMe.

Prima di eseguire lo script sul sistema Linux, è necessario renderlo avviabile con il comando chmod +x nomescript.sh.

Installazione di nvme-cli e collegamento dell’unità via NVMe over TCP

Dopo aver configurato il server e messo a fattor comune l’unità NVMe, si può passare al client. In questo caso, a seconda della distribuzione Linux in uso si può fare riferimento al corrispondente package manager per installare il pacchetto chiamato nvme-cli.

I passaggi per l’installazione di nvme-cli, ovviamente, variano a seconda della distribuzione. Su Debian, Ubuntu e derivate, si può procedere con il comando:

sudo apt install nvme-cli -y

L’istruzione riportata di seguito provvede invece ad abilitare il supporto per il protocollo NVMe over TCP:

sudo modprobe nvme_tcp

A questo punto si può eseguire il comando seguente che va alla ricerca dell’unità condivisa via NVMe over TCP:

sudo nvme discover -t tcp -n testnqn -a 192.168.0.179 -s 4420

I parametri di connessione sono quelli impostati nello script: è essenziale specificare nome della condivisione e indirizzo IP del server corretti.

Per procedere con il collegamento dell’unità in questione, basta impartire il comando che segue:

sudo nvme connect -t tcp -n testnqn -a 192.168.0.179 -s 4420

Tutto qui! Utilizzando il comando lsblk lato client è possibile trovare l’unità remota disponibile lato server e utilizzabile, come più si preferisce, per il trasferimento file alla massima velocità.

Nel caso in cui si volesse disconnettere l’unità NVMe remota, basta impartire il comando sudo nvme disconnect-all.

Verifica delle prestazioni con NVMe over TCP

Posto che a seconda della distribuzione Linux in uso, si possono verificare le prestazioni in fase di trasferimento dati usando gli strumenti grafici o testuali della distro stessa, il comando seguente esegue un controllo con lo strumento FIO (Flexible I/O Tester):

sudo fio --filename=/dev/nvme1n1 --rw=read --direct=1 --bs=128k --ioengine=io_uring --runtime=20 --numjobs=1 --time_based --group_reporting --name=seq_read --iodepth=16

Il comando effettua un test di lettura sequenziale specificando l’accesso diretto ai dati e bypassando la cache del sistema operativo. La verifica dura in questo caso 20 secondi e gestire un blocco da 128 KB per ogni singola operazione di lettura. È inoltre mantenuta una profondità di coda pari a 16: il comando FIO gestisce cioè fino a 16 richieste I/O in parallelo.

NVMe over Fabrics in arrivo anche in Windows

Con Windows Server 2025, Microsoft ha più volte parlato dell’introduzione per il supporto NVMe over Fabrics nel suo sistema operativo.

Poiché NVMe over Fabrics include NVMe over TCP, significa evidentemente che il protocollo sarà gestito da tutte le versioni di Windows. Non soltanto Windows Server ma anche Windows 11.

Informazioni sulle specifiche di NVMe over TCP: NVM Express