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!
Ich habe nicht genug Ruf, um einen Kommentar zu hinterlassen (was meiner Meinung nach angesichts des Grads der Überprüfung dieser Antwort besser wäre).
Ich stelle fest, dass eine große Abweichung in Ihrem Trace auf Linux- und Windows-Ebene darin besteht, dass Sie SMB1 unter Linux und SMB2 unter Windows verwenden. Möglicherweise ist der Batch-Oplock-Mechanismus in SMB1-Samba besser als in der exklusiven SMB2-Lease-Implementierung. In beiden Fällen sollte dies ein gewisses Maß an clientseitigem Caching ermöglichen.
1) Versuchen Sie möglicherweise, in Samba eine niedrigere maximale Protokollstufe festzulegen, um Windows mit SMB1 auszuprobieren. 2) Überprüfen Sie, ob exklusive Oplocks oder Leases entfernt wurden
Hoffe das hilft :)
quelle
Die Leistung von Remote-Dateivorgängen wie Lesen / Schreiben mithilfe des SMB-Protokolls kann durch die Größe der von Servern und Clients zugewiesenen Puffer beeinflusst werden. Die Puffergröße bestimmt die Anzahl der Roundtrips, die zum Senden einer festen Datenmenge erforderlich sind. Jedes Mal, wenn Anforderungen und Antworten zwischen Client und Server gesendet werden, entspricht die benötigte Zeit mindestens der Latenz zwischen beiden Seiten, was im Fall von Wide Area Network (WAN) sehr bedeutsam sein kann.
SMB-Puffer - Die MaxBufferSize kann über die folgende Registrierungseinstellung konfiguriert werden:
Datentyp:
REG_DWORD
Bereich: 1024 bis 65535 (Wählen Sie einen Wert gemäß Ihrer Anforderung über 5000)
ABER SMB SIGNING bewirkt die maximal zulässige Puffergröße. Daher müssen wir auch die SMB-Signatur deaktivieren, um unser Ziel zu erreichen. Die folgende Registrierung muss sowohl auf der Serverseite als auch nach Möglichkeit auch auf der Clientseite erstellt werden.
Wert Name:
EnableSecuritySignature
Datentyp:
REG_DWORD
Daten: 0 (deaktivieren), 1 (aktivieren)
quelle
Interessantes Phänomen. Folgendes würde ich versuchen - ich habe keine Ahnung, ob dies wirklich hilft. Wenn es meine Maschine wäre, würde ich die SMB-Perfcounter ausgiebig beobachten. Einer von ihnen wird die Ursache zeigen.
Weitere Dinge zu versuchen
Fügen Sie weitere Worker-Threads hinzu
Falls der SMB_RDR eine Schreib-E / A-Anforderung pro Zeile übersteigt (was hier nicht passieren sollte), kann es hilfreich sein, der Ausführungsengine einige Threads hinzuzufügen.
Setzen Sie "AdditionalCriticalWorkerThreads" auf 2 und dann auf 4.
Der Standardwert ist 0, was bedeutet, dass keine zusätzlichen kritischen Kernel-Worker-Threads hinzugefügt werden. Welches ist normalerweise ok. Dieser Wert wirkt sich auf die Anzahl der Threads aus, die der Dateisystem-Cache für Vorauslese- und Rückschreibanforderungen verwendet. Das Erhöhen dieses Werts kann zu mehr E / A in der Warteschlange im Speichersubsystem führen (was gut ist, wenn Sie zeilenweise schreiben möchten), ist jedoch CPU-teurer.
Weitere Warteschlangenlänge hinzufügen
Durch Erhöhen des Werts "AdditionalCriticalWorkerThreads" wird die Anzahl der Threads erhöht, die der Dateiserver zum Bearbeiten gleichzeitiger Anforderungen verwenden kann.
Der Standardwert ist 20. Ein Hinweis darauf, dass der Wert möglicherweise erhöht werden muss, ist, wenn die SMB2-Arbeitswarteschlangen sehr groß werden (perfcounter 'Server-Arbeitswarteschlangen \ Warteschlangenlänge \ SMB2 *' sollte <100 sein).
quelle