ฉันดิ้นรนเพื่อแก้ไขปัญหาด้านประสิทธิภาพด้วยการแชร์ SMB / CIFS เมื่อทำการเขียนขนาดเล็ก
ก่อนอื่นให้ฉันอธิบายการตั้งค่าเครือข่ายปัจจุบันของฉัน:
เซิร์ฟเวอร์
- Synology DS215j (เปิดใช้งานการสนับสนุน SMB3)
ไคลเอนต์ (คอมพิวเตอร์แบบใช้สายคู่บูต Gig-E)
- Ubuntu 14.04.5 LTS, 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 mount:
//192.168.1.10/nas-main on /mnt/nas-main type cifs (rw,noexec,nodev)
โปรแกรมรันไทม์บน Linux (เอาต์พุตเครือข่าย peaks ที่ ~ 100Mbps):
$ time ./nas-write-test /mnt/nas-main/home/will/test.txt
real 0m0.965s
user 0m0.148s
sys 0m0.672s
PCAP snapshot แสดงการดึงข้อมูลหลาย ๆ บรรทัดลงใน TCP แพ็กเก็ตเดียว:
โปรแกรมรันไทม์บน Windows ตามที่วัดโดย 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
PCAP snapshot บน Windows แสดงบรรทัดเดียวตามคำขอเขียน SMB:
โปรแกรมเดียวกันนี้ใช้เวลาประมาณ 10 นาที (~ 2.3Mbps) บน Windows เห็นได้ชัดว่า PCAP ของ Windows แสดงบทสนทนา SMB ที่มีเสียงดังมากพร้อมประสิทธิภาพในการโหลดข้อมูลที่ต่ำมาก
มีการตั้งค่าใด ๆ บน Windows ที่สามารถปรับปรุงประสิทธิภาพการเขียนขนาดเล็กได้หรือไม่? ดูเหมือนว่าจากการดูที่การจับแพ็คเก็ตนั้น Windows ไม่ได้บัฟเฟอร์การเขียนอย่างถูกต้องและจะส่งข้อมูลทีละหนึ่งบรรทัดทันที ในขณะที่บน Linux ข้อมูลถูกบัฟเฟอร์อย่างหนักและมีประสิทธิภาพที่เหนือกว่า แจ้งให้เราทราบว่าไฟล์ PCAP จะมีประโยชน์หรือไม่และฉันสามารถหาวิธีอัปโหลดได้
อัปเดต 10/27/16:
ตามที่กล่าวไว้โดย @sehafoc ฉันได้ลดการmax protocol
ตั้งค่าเซิร์ฟเวอร์ Samba เป็น SMB1 ด้วยสิ่งต่อไปนี้:
max protocol=NT1
การตั้งค่าด้านบนส่งผลให้มีพฤติกรรมเดียวกัน
ฉันยังลบตัวแปรของ Samba ด้วยการสร้างการแชร์บนเครื่อง Windows 10 อีกเครื่องและมันก็แสดงพฤติกรรมเช่นเดียวกับเซิร์ฟเวอร์ Samba ดังนั้นฉันเริ่มเชื่อว่านี่เป็นข้อผิดพลาดในการเขียนแคชกับไคลเอนต์ Windows โดยทั่วไป
อัปเดต: 10/06/17:
การจับแพ็คเก็ต Linux เต็มรูปแบบ (14MB)
การจับแพ็คเก็ต Windows แบบเต็ม (375MB)
อัปเดต: 10/12/17:
ฉันยังตั้งค่าการแชร์ NFS และ Windows จะเขียนโดยไม่มีการบัฟเฟอร์สำหรับสิ่งนี้เช่นกัน ดังนั้นมันจึงเป็นปัญหาไคลเอนต์ Windows ที่แฝงอยู่เท่าที่ฉันสามารถบอกได้ซึ่งเป็นโชคร้ายอย่างแน่นอน: - /
ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชม!