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