Ho avuto difficoltà a risolvere un problema di prestazioni con una condivisione SMB / CIFS durante l'esecuzione di piccole scritture.
Prima di tutto, lasciami descrivere la mia attuale configurazione di rete:
server
- Synology DS215j (con supporto SMB3 abilitato)
Client (stesso computer Gig-E cablato a doppio avvio)
- Ubuntu 14.04.5 LTS, Trusty Tahr
- Windows 8.1
smb.conf
[global]
printcap name=cups
winbind enum groups=yes
include=/var/tmp/nginx/smb.netbios.aliases.conf
socket options=TCP_NODELAY IPTOS_LOWDELAY SO_RCVBUF=65536 SO_SNDBUF=65536
security=user
local master=no
realm=*
passdb backend=smbpasswd
printing=cups
max protocol=SMB3
winbind enum users=yes
load printers=yes
workgroup=WORKGROUP
Attualmente sto testando le piccole prestazioni di scrittura con il seguente programma scritto in C ++ (su GitHub qui ):
#include <iostream>
#include <fstream>
#include <sstream>
using namespace std;
int main(int argc, char* argv[])
{
ofstream outFile(argv[1]);
for(int i = 0; i < 1000000; i++)
{
outFile << "Line #" << i << endl;
}
outFile.flush();
outFile.close();
return 0;
}
Configurazione di montaggio Linux:
//192.168.1.10/nas-main on /mnt/nas-main type cifs (rw,noexec,nodev)
Tempo di esecuzione del programma su Linux (picco dell'output di rete a ~ 100 Mbps):
$ time ./nas-write-test /mnt/nas-main/home/will/test.txt
real 0m0.965s
user 0m0.148s
sys 0m0.672s
Istantanea PCAP che mostra la suddivisione di più righe in un singolo pacchetto TCP:
Runtime del programma su Windows misurato da PowerShell:
> Measure-Command {start-process .\nas-write-test.exe -argumentlist "Z:\home\will\test-win.txt" -wait}
Days : 0
Hours : 0
Minutes : 9
Seconds : 29
Milliseconds : 316
Ticks : 5693166949
TotalDays : 0.00658931359837963
TotalHours : 0.158143526361111
TotalMinutes : 9.48861158166667
TotalSeconds : 569.3166949
TotalMilliseconds : 569316.6949
Istantanea PCAP su Windows che mostra una riga singola per richiesta di scrittura SMB:
Questo stesso programma richiede circa 10 minuti (~ 2.3 Mbps) su Windows. Ovviamente, il PCAP di Windows mostra una conversazione SMB molto rumorosa con efficienza di payload molto bassa.
Ci sono delle impostazioni su Windows che possono migliorare le prestazioni di scrittura di piccole dimensioni? Dall'acquisizione dei pacchetti sembra che Windows non memorizzi correttamente le scritture e invii immediatamente i dati una riga alla volta. Considerando che, su Linux, i dati sono fortemente bufferizzati e quindi hanno prestazioni di gran lunga superiori. Fammi sapere se i file PCAP potrebbero essere utili e posso trovare un modo per caricarli.
Aggiornamento 27/10/16:
Come menzionato da @sehafoc, ho ridotto l' max protocol
impostazione dei server Samba a SMB1 con il seguente:
max protocol=NT1
L'impostazione sopra ha portato allo stesso identico comportamento.
Ho anche rimosso la variabile di Samba creando una condivisione su un'altra macchina Windows 10, e presenta anche lo stesso comportamento del server Samba, quindi sto cominciando a credere che si tratti di un bug di memorizzazione nella cache con i client Windows in generale.
Aggiornamento: 10/06/17:
Acquisizione di pacchetti Linux completa (14 MB)
Acquisizione pacchetto completa di Windows (375 MB)
Aggiornamento: 10/10/17:
Ho anche installato una condivisione NFS e Windows scrive senza buffer anche per questo. Quindi, per quanto posso dire, è sicuramente un problema client di Windows sottostante, il che è decisamente sfortunato: - /
Qualsiasi aiuto sarebbe apprezzato!