Ich hatte Probleme, ein Leistungsproblem mit einer SMB / CIFS-Freigabe zu beheben, wenn kleine Schreibvorgänge ausgeführt wurden.
Lassen Sie mich zunächst mein aktuelles Netzwerk-Setup beschreiben:
Server
- Synology DS215j (mit aktivierter SMB3-Unterstützung)
Clients (derselbe Computer mit doppeltem Boot und kabelgebundenem Gig-E)
- 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
Ich teste derzeit die kleine Schreibleistung mit dem folgende Programm in C ++ geschrieben (auf GitHub hier ):
#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;
}
Linux-Mount-Konfiguration:
//192.168.1.10/nas-main on /mnt/nas-main type cifs (rw,noexec,nodev)
Programmlaufzeit unter Linux (Spitzenausgabe des Netzwerks bei ~ 100 Mbit / s):
$ time ./nas-write-test /mnt/nas-main/home/will/test.txt
real 0m0.965s
user 0m0.148s
sys 0m0.672s
PCAP-Snapshot, der das Aufteilen vieler Zeilen in ein einzelnes TCP-Paket zeigt:
Programmlaufzeit unter Windows, gemessen mit 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
PCAP-Snapshot unter Windows mit einer einzelnen Zeile pro SMB-Schreibanforderung:
Das gleiche Programm dauert unter Windows etwa 10 Minuten (~ 2,3 Mbit / s). Offensichtlich zeigt der Windows-PCAP eine sehr laute SMB-Konversation mit sehr geringer Nutzlasteffizienz.
Gibt es unter Windows Einstellungen, die die Leistung bei kleinen Schreibvorgängen verbessern können? Aus der Betrachtung von Paketerfassungen geht hervor, dass Windows die Schreibvorgänge nicht ordnungsgemäß puffert und die Daten sofort zeilenweise sendet. Unter Linux sind die Daten stark gepuffert und weisen daher eine weitaus bessere Leistung auf. Lassen Sie mich wissen, ob die PCAP-Dateien hilfreich sind, und ich kann einen Weg finden, sie hochzuladen.
Update 27.10.16:
Wie von @sehafoc erwähnt, habe ich die Samba- max protocol
Servereinstellung wie folgt auf SMB1 reduziert :
max protocol=NT1
Die obige Einstellung führte zu genau demselben Verhalten.
Ich habe auch die Variable von Samba entfernt, indem ich eine Freigabe auf einem anderen Windows 10-Computer erstellt habe, und sie zeigt auch das gleiche Verhalten wie der Samba-Server. Daher glaube ich, dass dies ein Schreib-Caching-Fehler bei Windows-Clients im Allgemeinen ist.
Update: 10/06/17:
Vollständige Linux-Paketerfassung (14 MB)
Vollständige Windows-Paketerfassung (375 MB)
Update: 12.10.17:
Ich habe auch eine NFS-Freigabe eingerichtet und Windows schreibt auch ohne Pufferung. Soweit ich das beurteilen kann, handelt es sich definitiv um ein zugrunde liegendes Windows-Client-Problem, das definitiv bedauerlich ist: - /
Jede Hilfe wäre dankbar!