在执行小写操作时,我一直在努力解决SMB / CIFS共享的性能问题。
首先,让我描述一下我当前的网络设置:
服务器
- Synology DS215j(启用SMB3支持)
客户端(同一台计算机双启动的有线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
我目前正在使用以下用C ++编写的程序(在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;
}
Linux挂载配置:
//192.168.1.10/nas-main on /mnt/nas-main type cifs (rw,noexec,nodev)
Linux上的程序运行时(网络输出峰值约为100Mbps):
$ time ./nas-write-test /mnt/nas-main/home/will/test.txt
real 0m0.965s
user 0m0.148s
sys 0m0.672s
PCAP快照显示将多个行分块到一个TCP数据包中:
由PowerShell衡量的Windows上的程序运行时:
> 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
Windows上的PCAP快照,每个SMB写入请求显示一行:
在Windows上,相同的程序大约需要10分钟(〜2.3Mbps)。显然,Windows PCAP显示了一个非常嘈杂的SMB对话,并且负载效率非常低。
Windows上是否有任何设置可以提高小写性能?从数据包捕获看来,Windows无法正确缓冲写入操作,并立即一次将数据发送出一行。而在Linux上,数据被大量缓冲,因此具有优越的性能。让我知道PCAP文件是否有帮助,我可以找到一种上载它们的方法。
更新10/27/16:
如@sehafoc所述,我max protocol
使用以下命令将Samba服务器设置减小为SMB1:
max protocol=NT1
上述设置导致完全相同的行为。
我还通过在另一台Windows 10计算机上创建共享来删除了Samba变量,它也表现出与Samba服务器相同的行为,因此我开始认为这通常是Windows客户端的写缓存错误。
更新:10/06/17:
更新:10/12/17:
我还设置了一个NFS共享,Windows也确实为此编写了没有缓冲的内容。因此,据我所知,这绝对是Windows客户端的根本问题,这绝对是不幸的:-/
任何帮助,将不胜感激!