Podczas wykonywania małych zapisów próbowałem rozwiązać problem z wydajnością udziału SMB / CIFS.
Najpierw opiszę moją obecną konfigurację sieci:
serwer
- Synology DS215j (z włączoną obsługą SMB3)
Klienci (ten sam komputer, przewodowy Gig-E z podwójnym uruchomieniem)
- 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
Obecnie testuję małą wydajność zapisu za pomocą następującego programu napisanego w C ++ ( tutaj na GitHub ):
#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;
}
Konfiguracja montowania w systemie Linux:
//192.168.1.10/nas-main on /mnt/nas-main type cifs (rw,noexec,nodev)
Czas działania programu w systemie Linux (szczytowa wydajność sieci przy ~ 100 Mb / s):
$ time ./nas-write-test /mnt/nas-main/home/will/test.txt
real 0m0.965s
user 0m0.148s
sys 0m0.672s
Migawka PCAP pokazująca fragmentowanie wielu linii w jednym pakiecie TCP:
Czas działania programu w systemie Windows mierzony za pomocą programu 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
Migawka PCAP w systemie Windows z pojedynczą linią dla każdego żądania zapisu SMB:
Ten sam program zajmuje około 10 minut (~ 2,3 Mb / s) w systemie Windows. Oczywiście Windows PCAP pokazuje bardzo głośną rozmowę SMB o bardzo niskiej wydajności.
Czy są jakieś ustawienia w systemie Windows, które mogą poprawić wydajność małego zapisu? Wygląda na to, że patrząc na przechwytywanie pakietów, Windows nie buforuje poprawnie zapisów i natychmiast wysyła dane po jednej linii na raz. Natomiast w systemie Linux dane są mocno buforowane, a zatem mają znacznie lepszą wydajność. Daj mi znać, czy pliki PCAP będą pomocne, a ja mogę znaleźć sposób na ich przesłanie.
Aktualizacja 27.10.16:
Jak wspomniano w @sehafoc, zmniejszyłem max protocol
ustawienie serwerów Samba do SMB1, wykonując następujące czynności:
max protocol=NT1
Powyższe ustawienie spowodowało dokładnie takie samo zachowanie.
Usunąłem również zmienną Samby, tworząc udział na innym komputerze z systemem Windows 10, a także wykazuje to samo zachowanie, co serwer Samba, więc zaczynam wierzyć, że jest to błąd buforowania zapisu ogólnie dla klientów Windows.
Aktualizacja: 10/06/17:
Przechwytywanie pełnego pakietu Linux (14 MB)
Przechwytywanie pełnego pakietu Windows (375 MB)
Aktualizacja: 10/12/17:
Skonfigurowałem również udział NFS, a system Windows również pisze bez buforowania. Jest to zdecydowanie podstawowy problem klienta Windows, o ile wiem, co jest zdecydowanie niefortunne: - /
Każda pomoc będzie mile widziana!