Мы написали приложение, которое выполняет небольшую (22 КБ) запись в несколько файлов одновременно (один поток выполняет асинхронную запись в очереди в несколько мест от имени других потоков) на одном и том же локальном томе (RAID1).
99,9% операций записи выполняются с низкой задержкой, но иногда (возможно, каждую минуту или две) мы получаем одну или две записи с огромной задержкой (я видел 10 секунд и выше) без каких-либо реальных объяснений.
Платформа: Win2003 Server с NTFS.
Мониторинг: Sysinternals Process Monitor (см. Ссылку ниже) и ведение журнала нашего собственного приложения.
Мы попробовали несколько вещей, чтобы попытаться решить эту проблему, которые были почерпнуты из нескольких веб-сайтов, например:
Делаем первую часть имен файлов уникальной, чтобы облегчить создание имени 8.3
Запись файлов в несколько каталогов
Изменение кэширования записи на диск Intel
Совместное использование файлов / принтеров Windows
Минимизируйте используемую память
Баланс
Увеличьте пропускную способность данных для обмена файлами
Увеличьте пропускную способность данных для сетевых приложений
Система-> Дополнительно-> Производительность-> Дополнительно
NtfsDisableLastAccessUpdate - использовать набор поведения fsutil disablelastaccess 1
отключить генерацию имени 8.3 - использовать "fsutil behavior set disable8dot3 1" + перезапуск
Включить кеш файловой системы большого размера
Отключить разбиение кода ядра на страницы
Предел блокировки страницы ввода-вывода
Выключите (или включите) службу индексирования
Но, похоже, ничего особенного не имеет. Есть множество вещей, которые мы еще не пробовали, но мы задались вопросом, сталкивался ли кто-нибудь с той же проблемой, причиной и решением (программным или нет)?
Мы можем воспроизвести проблему с помощью IOMeter и простой настройки:
Запустите IOMeter и удалите все, кроме первого рабочего потока в «Топологии», используя кнопку отключения.
Выберите рабочий поток и поставьте крестик в поле рядом с диском, который вы хотите использовать, на вкладке «Дисковые цели» и укажите «2000000» в поле «Максимальный размер диска» (ПРИМЕЧАНИЕ: должно быть не менее 1 ГБ свободного места; размер сектора составляет 512 байт).
Затем создайте новую спецификацию доступа и добавьте ее в рабочий поток:
Размер запроса на передачу = 22 КБ
100% последовательный
Процент спецификации доступа = 100%
Процент чтения / записи = 100% записи
Измените частоту обновления отображения результатов на 5 секунд, время выполнения настройки теста на 20 секунд и установите оба параметра «Число рабочих для автоматического создания» на ноль.
Выберите рабочий поток на панели «Топология» и 59 раз нажмите кнопку «Дублировать рабочий», чтобы создать 60 потоков с одинаковыми настройками.
Нажмите кнопку «Go» (зеленый флажок) и просмотрите вкладку «Результаты». «Максимальное время отклика ввода-вывода (мс)» на нашей машине всегда составляет не менее 3500. Наша машина не совсем медленная (8-ядерный стоечный сервер Xeon с 4 ГБ и встроенным RAID).
Мне было бы интересно посмотреть, что получают другие люди. У нас есть ощущение, что это может быть связано с файловой системой NTFS (наша в настоящее время на 75% заполнена фрагментированными файлами), и мы собираемся попробовать несколько вещей, связанных с этим принципом. Но это также связано с производительностью диска, поскольку мы не видим этого на RAMDisk, и это не так серьезно на массиве RAID10.
Любая помощь очень ценится.
Ричард
Щелкните правой кнопкой мыши и выберите «Открыть ссылку в новой вкладке»:
ProcMon Результат
Теперь у меня есть дополнительная информация по этому вопросу.
Протестировав описанный тест IOMeter на 12 разных машинах с использованием различного оборудования, я сузил его до определенного набора микросхем RAID (3 разные машины с одним набором микросхем демонстрируют такое поведение при использовании RAID1 и RAID10). Все остальные машины имеют результат как минимум на порядок лучше.
Чипсет: Intel 631xESB / 632xESB SATA RAID (он же ESB2)
См. Этот пост на сайте Intel для получения дополнительной информации и, надеюсь, ответа от Intel:
Intel 631xESB / 632xESB SATA RAID (он же ESB2) пишет медленно
Ричард