Я изо всех сил пытался исправить проблему производительности с общим ресурсом SMB / CIFS при выполнении небольших записей.
Сначала позвольте мне описать мою текущую настройку сети:
сервер
- Synology DS215j (с включенной поддержкой SMB3)
Клиенты (тот же компьютер с двойной загрузкой проводной Gig-E)
- Ubuntu 14.04.5 LTS, Трасти Тар
- 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 (максимальная производительность сети составляет ~ 100 Мбит / с):
$ 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 МБ)
Обновление: 10/12/17:
Я также настроил общий ресурс NFS, и Windows также пишет без буферизации для этого. Итак, насколько я могу судить, это определенно основная проблема клиента Windows, что, безусловно, вызывает сожаление: - /
Любая помощь будет оценена!