Я намагаюся вирішити проблему продуктивності з часткою 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:
Пробіг програми в 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 у Windows, що показує один рядок на запит SMB:
Ця ж програма займає близько 10 хвилин (~ 2,3 Мбіт / с) у Windows. Очевидно, що Windows PCAP демонструє дуже шумну SMB розмову з дуже низькою ефективністю корисного навантаження.
Чи є налаштування в Windows, які можуть покращити невелику продуктивність запису? З огляду на захоплення пакетів, Windows не буферизує записи належним чином і негайно надсилає дані по одному рядку. В той час, як в Linux, дані сильно буферизовані і, таким чином, мають значно кращі показники. Повідомте мене, чи корисні будуть файли PCAP, і я можу знайти спосіб їх завантаження.
Оновлення 27.10.16:
Як згадував @sehafoc, я зменшив max protocol
налаштування серверів Samba до SMB1 з наступним:
max protocol=NT1
Вищевказані настройки призвели до точно такої ж поведінки.
Я також видалив змінну Samba, створивши спільний доступ на іншій машині Windows 10, і він також демонструє таку саму поведінку, як і сервер Samba, тому я починаю вважати, що це помилка кешування записів із клієнтами Windows в цілому.
Оновлення: 10.06.17:
Повне захоплення пакетів Linux (14 МБ)
Повний захват пакетів Windows (375 МБ)
Оновлення: 12.12.17:
Я також налаштовую NFS-спільний доступ, і Windows записує без буферизації для цього. Отже, це, безумовно, основна проблема клієнта Windows, наскільки я можу сказати, що, безумовно, прикро:
Будь-яка допомога буде вдячна!