J'ai eu du mal à résoudre un problème de performances avec un partage SMB / CIFS lors de l'exécution de petites écritures.
Tout d'abord, permettez-moi de décrire ma configuration réseau actuelle:
Serveur
- Synology DS215j (avec prise en charge SMB3 activée)
Clients (même ordinateur Gig-E câblé à double démarrage)
- 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
Je teste actuellement les petites performances d'écriture avec le programme suivant écrit en C ++ (sur GitHub ici ):
#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;
}
Configuration de montage Linux:
//192.168.1.10/nas-main on /mnt/nas-main type cifs (rw,noexec,nodev)
Exécution du programme sur Linux (sortie réseau maximale à ~ 100 Mbps):
$ time ./nas-write-test /mnt/nas-main/home/will/test.txt
real 0m0.965s
user 0m0.148s
sys 0m0.672s
Instantané PCAP montrant la segmentation de plusieurs lignes en un seul paquet TCP:
Exécution du programme sous Windows, mesurée par 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
Instantané PCAP sous Windows montrant une seule ligne par demande d'écriture SMB:
Ce même programme prend environ 10 minutes (~ 2,3 Mbps) sous Windows. De toute évidence, Windows PCAP affiche une conversation SMB très bruyante avec une efficacité de charge utile très faible.
Existe-t-il des paramètres sous Windows qui peuvent améliorer les performances d'écriture de petite taille? Il semble qu'en regardant les captures de paquets, Windows ne tamponne pas correctement les écritures et envoie immédiatement les données une ligne à la fois. Alors que sous Linux, les données sont fortement tamponnées et ont donc des performances bien supérieures. Faites-moi savoir si les fichiers PCAP seraient utiles et je peux trouver un moyen de les télécharger.
Mise à jour 27/10/16:
Comme mentionné par @sehafoc, j'ai réduit le max protocol
paramètre des serveurs Samba à SMB1 avec les éléments suivants:
max protocol=NT1
Le paramètre ci-dessus a entraîné exactement le même comportement.
J'ai également supprimé la variable de Samba en créant un partage sur une autre machine Windows 10, et elle présente également le même comportement que le serveur Samba, donc je commence à croire qu'il s'agit d'un bogue de mise en cache d'écriture avec les clients Windows en général.
Mise à jour: 10/06/17:
Capture de paquets Linux complète (14 Mo)
Capture de paquets Windows complète (375 Mo)
Mise à jour: 10/12/17:
J'ai également configuré un partage NFS et Windows écrit également sans tampon pour cela. Donc, c'est certainement un problème sous-jacent de client Windows pour autant que je sache, ce qui est vraiment regrettable: - /
Toute aide serait appréciée!