Saya telah berjuang untuk memperbaiki masalah kinerja dengan pangsa SMB / CIFS saat melakukan penulisan kecil.
Pertama, izinkan saya menjelaskan pengaturan jaringan saya saat ini:
Server
- Synology DS215j (dengan dukungan SMB3 diaktifkan)
Klien (komputer yang sama dual-booted kabel 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
Saat ini saya sedang menguji kinerja penulisan kecil dengan program berikut yang ditulis dalam C ++ (di GitHub di sini ):
#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;
}
Konfigurasi pemasangan Linux:
//192.168.1.10/nas-main on /mnt/nas-main type cifs (rw,noexec,nodev)
Program run-time di Linux (puncak output jaringan pada ~ 100Mbps):
$ time ./nas-write-test /mnt/nas-main/home/will/test.txt
real 0m0.965s
user 0m0.148s
sys 0m0.672s
Snapshot PCAP yang menunjukkan pemotongan banyak baris menjadi satu paket TCP:
Program run-time di Windows yang diukur dengan 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
Snapshot PCAP di Windows yang menunjukkan satu baris per SMB Tulis Permintaan:
Program yang sama ini memakan waktu sekitar 10 menit (~ 2.3Mbps) di Windows. Jelas, PCAP Windows menunjukkan percakapan SMB yang sangat bising dengan efisiensi payload yang sangat rendah.
Apakah ada pengaturan pada Windows yang dapat meningkatkan kinerja penulisan kecil? Tampaknya dari melihat tangkapan paket bahwa Windows tidak buffer menulis dengan benar dan segera mengirimkan data satu baris pada suatu waktu. Padahal, di Linux, data sangat buffered dan dengan demikian memiliki kinerja yang jauh lebih unggul. Beri tahu saya jika file PCAP akan membantu, dan saya dapat menemukan cara untuk mengunggahnya.
Perbarui 10/27/16:
Seperti yang disebutkan oleh @sehafoc, saya mengurangi max protocol
pengaturan server Samba ke SMB1 dengan yang berikut ini:
max protocol=NT1
Pengaturan di atas menghasilkan perilaku yang sama persis.
Saya juga menghapus variabel Samba dengan membuat share di mesin Windows 10 lainnya, dan juga menunjukkan perilaku yang sama dengan server Samba, jadi saya mulai percaya ini adalah bug caching tulis dengan klien Windows pada umumnya.
Pembaruan: 10/06/17:
Pengambilan paket Linux penuh (14MB)
Pengambilan paket Windows penuh (375MB)
Pembaruan: 10/12/17:
Saya juga mengatur berbagi NFS dan Windows tidak menulis tanpa buffering untuk ini juga. Jadi, ini jelas merupakan masalah klien Windows yang mendasarinya sejauh yang saya tahu, yang pasti disayangkan: - /
Bantuan apa pun akan dihargai!