Отправка SecurityGroupIngress во вложенный стек облачной информации

Не уверен, здесь или в SO лучше спросить ...

Я пытаюсь разделить наши шаблоны CloudFormation чтобы сделать их более удобными и компактными.

Я столкнулся с проблемой, когда я хочу использовать «базовый» шаблон группы безопасности, который по существу пуст, а затем указать его вместе с параметрами для каждой группы безопасности, которую мне нужно создать.

Моя проблема связана с заполнением " позвольте мне описать мою текущую настройку сети:

Сервер

  • 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 (максимальная выходная мощность сети ~ 100 Мбит / с):

$ time ./nas-write-test /mnt/nas-main/home/will/test.txt

real    0m0.965s
user    0m0.148s
sys 0m0.672s

Снимок PCAP, показывающий разбиение многих строк на один пакет TCP:

Linux PCAP snapshot

Время выполнения программы в 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:

Windows PCAP snapshot

Эта же программа занимает около 10 минут (~ 2,3 Мбит / с) в Windows. Очевидно, что Windows PCAP показывает очень шумный SMB-диалог с очень низкой эффективностью полезной нагрузки.

Существуют ли в Windows какие-либо настройки, которые могут улучшить производительность записи небольших файлов? Глядя на захват пакетов, кажется, что Windows не буферизует записи должным образом и сразу же отправляет данные по одной строке за раз. В то время как в Linux данные сильно буферизуются и, следовательно, имеют гораздо более высокую производительность. Сообщите мне, будут ли полезны файлы PCAP, и я найду способ их загрузить.

Обновление от 27.10.16:

Как упоминалось @sehafoc, я уменьшил максимальное количество серверов Samba устанавливается на SMB1 со следующим:

макс. Протокол = NT1 данные сильно буферизуются и, следовательно, имеют гораздо более высокую производительность. Сообщите мне, будут ли полезны файлы PCAP, и я найду способ их загрузить.

Обновление 27.10.16:

Как упоминалось @sehafoc, я уменьшил максимальное количество серверов Samba устанавливается на SMB1 со следующим:

макс. Протокол = NT1 данные сильно буферизуются и, следовательно, имеют гораздо более высокую производительность. Сообщите мне, будут ли полезны файлы PCAP, и я найду способ их загрузить.

Обновление 27.10.16:

Как упоминалось @sehafoc, я уменьшил максимальное количество серверов Samba устанавливается на SMB1 со следующим:

макс. Протокол = NT1

Приведенная выше настройка привела к точно такому же поведению.

Я также удалил переменную Samba, создав общий ресурс на другом компьютере с Windows 10, и он также демонстрирует то же поведение, что и сервер Samba, поэтому я начинаю полагать, что это ошибка кэширования записи с клиентами Windows в целом .

Обновление: 10.06.17:

Полный захват пакетов Linux (14 МБ)

Полный захват пакетов Windows (375 МБ)

Обновление: 12.10.17:

Я также установил Общий ресурс NFS и Windows также записывают без буферизации. Итак, насколько я могу судить, это определенно основная проблема клиента Windows, что определенно досадно: - /

Любая помощь будет принята с благодарностью!

10
задан 12 October 2017 в 17:43
4 ответа

C ++ endl определен как вывод '\ n' с последующим сбросом. flush () - дорогостоящая операция, поэтому обычно следует избегать использования endl в качестве конца строки по умолчанию, поскольку он может создать именно ту проблему с производительностью, которую вы наблюдаете (и не только с SMB, но и с любым из потоков с дорогостоящим сбросом, включая локальное вращение rust или даже последний NVMe с какой-то смехотворно высокой скоростью вывода).

Замена endl на "\ n" исправит производительность, указанную выше, позволив системе буферизоваться, как задумано. За исключением того, что некоторые библиотеки могут сбрасываться на "\ n", и в этом случае у вас больше головной боли (см. https://stackoverflow.com/questions/21129162/tell-endl-not-to-flush для решения переопределение метода sync ()).

Чтобы усложнить ситуацию, flush () определен только для того, что происходит в буферах библиотеки. Влияние сброса на операционную систему, диск и другие внешние буферы не определено. Для Microsoft.NET «Когда вы вызываете метод FileStream.Flush, буфер ввода-вывода операционной системы также сбрасывается». ( https://msdn.microsoft.com/en-us/library/2bw4h516 (v = vs.110) .aspx ) Это делает очистку особенно дорогостоящей для Visual Studio C ++, так как она будет обходить пишите полностью на физический носитель на дальнем конце вашего удаленного сервера, как вы видите. GCC, с другой стороны, говорит: «Последнее напоминание:обычно задействовано больше буферов, чем только на уровне языка / библиотеки. Буферы ядра, дисковые буферы и т.п. также будут иметь эффект. Их проверка и изменение зависят от системы. "( https://gcc.gnu.org/onlinedocs/libstdc++/manual/streambufs.html ) Ваши следы Ubuntu, похоже, указывают на то, что операционная система / сеть Буферы не сбрасываются библиотекой flush (). Зависимое от системы поведение было бы еще большей причиной, чтобы избежать чрезмерного endl и сброса. Если вы используете VC ++, вы можете попробовать переключиться на производную Windows GCC, чтобы увидеть, как реагирует зависимое от системы поведение, или, в качестве альтернативы, использовать Wine для запуска исполняемого файла Windows в Ubuntu.

В более общем плане вам нужно подумать о своих требованиях, чтобы определить, подходит ли очистка каждой строки. endl обычно подходит для интерактивных потоков, таких как отображение (нам нужен пользователь, чтобы на самом деле видеть наш вывод, а не пачками), но обычно не подходит для других типов потоков, включая файлы, где накладные расходы на промывку могут быть значительными. Я видел, как приложения сбрасываются при каждой записи 1, 2, 4 и 8 байтов. .. это н не очень приятно видеть, как операционная система обрабатывает миллионы операций ввода-вывода для записи файла размером 1 МБ.

В качестве примера, файл журнала может нуждаться в очистке каждой строки, если вы отлаживаете сбой, потому что вам нужно очистить ofstream до того, как произойдет сбой; в то время как другой файл журнала может не нуждаться в очистке каждой строки, если он просто создает подробный информационный журнал, который, как ожидается, будет очищен автоматически перед завершением работы приложения. Это не обязательно, так как вы могли бы получить класс с более сложным алгоритмом сброса, отвечающим конкретным требованиям.

Сравните ваш случай с противоположным случаем, когда люди должны гарантировать, что их данные полностью сохраняются на диске и не уязвимы в буфере операционной системы ( https://stackoverflow.com/questions/7522479/how-do-i-ensure-data-is-written-to-disk-before-closing-fstream ) ). 12111] Обратите внимание, что, как написано, outFile.flush () является лишним, поскольку он сбрасывает уже сброшенный поток. Чтобы быть педантичным, вам следовало использовать только endl или предпочтительно "\ n" с outFile.flush (), но не оба сразу.

2
ответ дан 2 December 2019 в 22:12

У меня недостаточно репутации, чтобы оставить комментарий (что, на мой взгляд, было бы лучше с учетом уровня верификации данного ответа).

Я заметил, что одно большое различие в трассировке на уровне Linux и Windows заключается в том, что вы используете SMB1 на Linux и SMB2 на Windows. Возможно, механизм пакетной блокировки работает лучше в самбе SMB1, чем реализация эксклюзивной аренды SMB2. В обоих случаях это должно позволять некоторое кэширование на клиентской стороне.

1) Возможно, попробуйте установить более низкий максимальный уровень протокола в Samba, чтобы попробовать окна с SMB1. 2) Проверить, что эксклюзивные оплоки или аренда сняты

Надеюсь, это поможет :)

.
2
ответ дан 2 December 2019 в 22:12

На производительность операций с удаленными файлами, таких как чтение/запись, по протоколу SMB может влиять размер буферов, выделяемых серверами и клиентами. Размер буфера определяет количество циклов, необходимых для отправки фиксированного количества данных. Каждый раз, когда запросы и ответы посылаются между клиентом и сервером, количество затрачиваемого времени равно, по крайней мере, латентности между обеими сторонами, что может быть очень существенным в случае WAN (Wide Area Network - Широкополосная сеть).

SMB буфер -- MaxBufferSize может быть настроен через следующую настройку реестра:

HKLM\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters\SizeReqBuf

Тип данных: REG_DWORD

Range: 1024 - 65535 (Выберите значение согласно вашему требованию выше 5000)

BUT SMB SIGNING воздействует на максимальный допустимый размер буфера. Таким образом, мы должны отключить SMB подпись, а также для достижения нашей цели. Следующий реестр должен быть создан как на стороне сервера, так и, по возможности, на стороне клиента.

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\LanManWorkstation\Parameters

Имя значения: EnableSecuritySignature

Data Type: REG_DWORD

Data: 0 (отключено), 1 (включено)

.
2
ответ дан 2 December 2019 в 22:12

Интересное явление. Вот что я бы попробовал - понятия не имею, действительно ли это помогает. Если бы это была моя машина, я бы внимательно следил за счетчиками SMB. Один из них покажет причину.

Еще кое-что попробовать

Добавить больше рабочих потоков

В случае, если SMB_RDR выдает один запрос ввода-вывода на запись на строку (что должно ] не здесь), это может помочь добавить некоторые потоки в механизм выполнения.

Установите «AdditionalCriticalWorkerThreads» на 2, затем на 4.

HKLM\System\CurrentControlSet\Control\Session Manager\Executive\AdditionalCriticalWorkerThreads

Значение по умолчанию - 0, что означает, что не добавляются дополнительные критические рабочие потоки ядра. Что обычно нормально. Это значение влияет на количество потоков, которые кэш файловой системы использует для запросов с упреждающим чтением и отложенной записью. Повышение этого значения может разрешить большее количество операций ввода-вывода в очереди в подсистеме хранения (что хорошо, если вы хотите писать построчно), но это дороже ЦП.

Добавить дополнительную очередь. Длина

Увеличение значения «AdditionalCriticalWorkerThreads» увеличивает количество потоков, которые файловый сервер может использовать для обслуживания одновременных запросов.

HKLM\System\CurrentControlSet\Services\LanmanServer\Parameters\MaxThreadsPerQueue

Значение по умолчанию - 20. Указание на то, что это значение может нуждаться в увеличении. - если рабочие очереди SMB2 становятся очень большими (perfcounter 'Server Work Queues \ Queue Length \ SMB2 *'. должно быть <100).

1
ответ дан 2 December 2019 в 22:12

Теги

Похожие вопросы