Tôi đã phải vật lộn để khắc phục vấn đề về hiệu năng với chia sẻ SMB / CIFS khi thực hiện ghi nhỏ.
Trước tiên, hãy để tôi mô tả thiết lập mạng hiện tại của mình:
Người phục vụ
- Synology DS215j (đã bật hỗ trợ SMB3)
Khách hàng (cùng máy tính có dây khởi động kép Gig-E)
- Ubuntu 14.04.5 LTS, Tahr Trusty
- 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
Tôi hiện đang thử nghiệm hiệu suất ghi nhỏ với chương trình sau được viết bằng C ++ (trên GitHub tại đây ):
#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;
}
Cấu hình gắn kết Linux:
//192.168.1.10/nas-main on /mnt/nas-main type cifs (rw,noexec,nodev)
Thời gian chạy chương trình trên Linux (đầu ra mạng cực đại ở mức ~ 100Mbps):
$ time ./nas-write-test /mnt/nas-main/home/will/test.txt
real 0m0.965s
user 0m0.148s
sys 0m0.672s
Ảnh chụp nhanh PCAP hiển thị phân đoạn nhiều dòng vào một gói TCP:
Thời gian chạy chương trình trên Windows được đo bằng 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
Ảnh chụp nhanh PCAP trên Windows hiển thị một dòng trên mỗi Yêu cầu ghi SMB:
Chương trình tương tự này mất khoảng 10 phút (~ 2.3Mbps) trên Windows. Rõ ràng, Windows PCAP cho thấy một cuộc trò chuyện SMB rất ồn ào với hiệu quả tải trọng rất thấp.
Có bất kỳ cài đặt nào trên Windows có thể cải thiện hiệu suất ghi nhỏ không? Có vẻ như khi nhìn vào các gói chụp, Windows không đệm ghi đúng cách và ngay lập tức gửi dữ liệu từng dòng một. Trong khi đó, trên Linux, dữ liệu được đệm rất nhiều và do đó có hiệu năng vượt trội hơn nhiều. Hãy cho tôi biết nếu các tệp PCAP sẽ hữu ích và tôi có thể tìm cách tải chúng lên.
Cập nhật 27/10/2016:
Như @sehafoc đã đề cập, tôi đã giảm max protocol
cài đặt máy chủ Samba xuống SMB1 bằng cách sau:
max protocol=NT1
Các thiết lập ở trên dẫn đến hành vi chính xác tương tự.
Tôi cũng đã loại bỏ biến Samba bằng cách tạo chia sẻ trên một máy Windows 10 khác và nó cũng thể hiện hành vi tương tự như máy chủ Samba, vì vậy tôi bắt đầu tin rằng đây là lỗi ghi bộ đệm với các máy khách Windows nói chung.
Cập nhật: 10/06/17:
Chụp gói Windows đầy đủ (375MB)
Cập nhật: 10/12/17:
Tôi cũng thiết lập một chia sẻ NFS và Windows cũng không có bộ đệm cho việc này. Vì vậy, đây chắc chắn là một vấn đề máy khách Windows tiềm ẩn theo như tôi có thể nói, điều này rất đáng tiếc: - /
Bất kỳ trợ giúp sẽ được đánh giá cao!