Настроить
МоБо: Супер Микро сервер
Proc: Twin Xenon с 20 физическими ядрами и 40 нитями
Оперативная память: 128 ГБ
ОС: Cento 7.x Сервер
VCard: nVidia Quadro 4000
Задача включает в себя запись и чтение с подключенных USB-накопителей (1 ТБ в формате Micron 5100 Pro vfat) с максимально возможной механической скоростью для проверки целостности данных. На процессор приходится 40 линий PCIe 2.0. Одна из 40 имеет две карты StarTech USB 3.0 с выделенными каналами 5 Гбит / с, но без дополнительного внутреннего питания. Мы используем внешние документы SSD Orico для подключения и питания дисков. Вне разных документов USB, серверное оборудование, формат SSD и ОС не могут быть изменены.
А теперь актуальная проблема и вопрос. Когда мы начинаем запись на диски в цикле записи / чтения, все начинается нормально.
- Получить файл с 200 Мб до 1,6 Гб с удаленного файлового сервера (хранить в локальной оперативной памяти)
-Записать файл на каждый из четырех USB-накопителей (каждая запись выполняется в отдельном потоке).
-Читать файл с установленного USB SSD для проверки SHA (также в отдельных потоках)
-Очистить данные файла из оперативной памяти
-Повторите, пока все файлы не будут закончены
После примерно дюжины файлов запись на один или два диска настолько замедляется, что другие диски вынуждены ждать из-за ограничений, которые мы установили для количества файлов, хранящихся в любой момент времени. Затем диск "догонит", а другой диск замедлится. Эта проблема временная, и мы записали весь пакет файлов (до 1600) без проблем и в пределах 10% от того, что должно быть физически возможным.
Итак, вопросы в том, что может быть причиной этого и что мы можем сделать, чтобы предотвратить это? Наше программное обеспечение гарантирует, что ни один диск не будет записываться и считываться одновременно, и при этом мы не пытаемся читать или записывать более одного файла с любого данного диска за раз. Любая помощь будет принята с благодарностью.
PS Это вопрос, отличный от того, который я здесь задавал.
РЕДАКТИРОВАТЬ 1: Таким образом, это может не иметь никакого отношения к USB, SSD, драйверам, переключению контекста, пропускной способности PCIe и т. Д .... Мне просто пришлось приостановить выполнение в очень подходящий момент, и std:: vector, который я использую для хранения записываемых данных, был помечен как недоступный в отладчике для QtCreator. Спустя несколько операторов print и некоторых точек останова я обнаружил, что данные есть, указатель, возвращаемый функцией :: data(), хорош, и все в порядке, за исключением того, что локальная переменная в отладчике показывает, что она недоступна. Тем не менее, каждый раз, когда вектор показывает, что он недоступен, запись на диск происходит очень долго. Итак, теперь я нахожусь в поисках чего-то, что портит память или что-то подобное. Очень странное поведение.