Küçük yazılar yazarken bir KOBİ / CIFS payı ile performans sorununu çözmek için uğraşıyorum.
İlk olarak, mevcut ağ kurulumumu açıklayayım:
Sunucu
- Synology DS215j (SMB3 desteği etkinken)
İstemciler (aynı bilgisayar çift önyüklemeli kablolu Gig-E)
- Ubuntu 14.04.5 LTS, Güvenilir Tahr
- Windows 8.1
smb.conf'yi
[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
Şu anda (GitHub üzerinde C ++ ile yazılmış aşağıdaki program ile küçük yazma performansını test ediyorum burada ):
#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 yapılandırması:
//192.168.1.10/nas-main on /mnt/nas-main type cifs (rw,noexec,nodev)
Linux'ta program çalışma süresi (~ 100Mbps'de ağ çıkışını artırır):
$ time ./nas-write-test /mnt/nas-main/home/will/test.txt
real 0m0.965s
user 0m0.148s
sys 0m0.672s
Birçok satırın tek bir TCP paketine parçalanmasını gösteren PCAP anlık görüntüsü:
PowerShell tarafından ölçülen Windows'ta program çalışma zamanı:
> 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
SMB Yazma İsteği başına tek satır gösteren Windows PCAP anlık görüntüsü:
Aynı program Windows'ta yaklaşık 10 dakika (~ 2.3Mbps) alır. Açıkçası, Windows PCAP, çok düşük taşıma kapasitesi verimliliği ile çok gürültülü bir KOBİ konuşması gösterir.
Windows'ta küçük yazma performansını artırabilecek ayarlar var mı? Paket yakalamalarına bakıldığında, Windows'un yazmaları düzgün bir şekilde arabelleğe almadığı ve verileri bir kerede bir satır olarak gönderdiği görülmektedir. Oysa, Linux'ta, veriler yoğun bir şekilde arabelleğe alınır ve bu nedenle çok daha üstün bir performansa sahiptir. PCAP dosyalarının yardımcı olup olmayacağını bana bildirin ve bunları yüklemek için bir yol bulabilirim.
Güncelleme: 10/27/16:
@Sehafoc tarafından belirtildiği gibi Samba sunucuları max protocol
ayarını SMB1 olarak aşağıdakilerle indirdim:
max protocol=NT1
Yukarıdaki ayar aynı davranışla sonuçlandı.
Ayrıca başka bir Windows 10 makinesinde bir paylaşım oluşturarak Samba değişkenini kaldırdım ve aynı zamanda Samba sunucusuyla aynı davranışı sergiliyor, bu yüzden bunun genel olarak Windows istemcileri ile bir yazma önbellekleme hatası olduğuna inanmaya başlıyorum.
Güncelleme: 10/06/17:
Tam Linux paket yakalama (14MB)
Tam Windows paket yakalama (375MB)
Güncelleme: 10/12/17:
Ayrıca bir NFS paylaşımı ayarladım ve Windows da bunun için arabelleğe alma olmadan yazıyor. Yani, kesinlikle altta yatan bir Windows istemci sorunu anlayabildiğim kadarıyla, bu kesinlikle talihsiz: - /
Herhangi bir yardım mutluluk duyacağız!