Настройка ZFS для пакетной последовательной записи

Это продолжение: Высокоскоростная запись по сети с хранилищем большой емкости . Заметно изменилась установка.

У меня пул одиночный на 6 дисков, все диски Exos X18 CMR. С использованиеми ручные тесты. Я знаю, что массив может поддерживать последовательную запись со скоростью около 800 МБ/с в среднем, это нормально и соответствует ожидаемой производительности этого массива. Машина представляет собой Ryzen5 Pro 2400 GE (4C/8T, повышение частоты 3,8 ГГц) с 32 ГБ оперативной памяти ECC, загрузочным/системным диском NVMe и 2 портами Ethernet 10 Гбит/с (Intel x550-T2). Я использую современную систему Arch с zfs 2.1.2-1.

Мой вариант использования — это видеоархив, в основном большой (~30 ГБ), сжатый видео, записанный один раз, прочитанный один раз. я отключил, набор, наборипоскольку данные на самом деле несжимаемы, и тестирование показало худшую производительность счемнесмотря на то, что говорит Интернет, дублирующихся данных не существует. Этот пул доступен по сети через Samba. Я настроил свою сеть и Samba до такой степени, что скорость передачи данных с NVMe NTFS на компьютере под управлением Windows на NVMe ext4 достигает 1 ГБ/с, т.е. достаточно близко к насыщению канала 10 Гбит/с 9K Jumbo Frames.

Вот здесь у меня возникают проблемы. Я хочу иметь возможность передавать один целый видеоархив 30G со скоростью 1 ГБ/с намассив, который может поддерживать только последовательную запись со скоростью 800 МБ/с. Мой план состоит в том, чтобы использовать грязные страницы на основе оперативной памяти, чтобы поглотить побочный эффект и сбросить его на диск после «завершения» передачи на стороне клиента. Я подумал, что все, что мне нужно, этогрязных страниц в оперативной памяти, которые могут быть сброшены на диск в течение примерно 10 секунд после завершения передачи. Я понимаю последствия этого для целостности данных, и риск приемлем, поскольку я всегда могу передать файл снова позже на срок до месяца, если из-за отключения питания файл будет утерян или неполным.

Однако я не могу заставить ZFS вести себя так, как я ожидаю... Я отредактировал свойфайл такой:

      options zfs zfs_dirty_data_max_max=25769803776
options zfs zfs_dirty_data_max_max_percent=50
options zfs zfs_dirty_data_max=25769803776
options zfs zfs_dirty_data_max_percent=50
options zfs zfs_delay_min_dirty_percent=80

Я запустил соответствующийкоманда, чтобы обновить мой initramfs и подтвердить, что настройки были применены после перезагрузки:

      # arc_summary | grep dirty_data
        zfs_dirty_data_max                                   25769803776
        zfs_dirty_data_max_max                               25769803776
        zfs_dirty_data_max_max_percent                                50
        zfs_dirty_data_max_percent                                    50
        zfs_dirty_data_sync_percent                                   20

Т.е. я установил максимальное количество грязных страниц на 24 ГБ, что намного больше, чем 7 ГБ, которые мне нужны, и удерживал кнопку, чтобы начать задерживать запись до тех пор, пока не будет использовано 80% этого объема. Насколько я понимаю, пул должен иметь возможность поглощать 19 ГБ в ОЗУ, прежде чем он начнет отталкивать записи от клиента (Samba) с задержкой.

Однако при записи из клиента Windows я наблюдаю, что примерно через 16 секунд при скорости записи ~ 1 ГБ/с производительность записи резко падает (все еще показывает, что диски усердно сбрасывают данные), что я могу только предположить, что это механизм возврата для регулирования записи ZFS. Однако это не имеет смысла, поскольку, по крайней мере, даже если ничего не было смыто в течение 16 секунд, оно должно было установиться через 3 секунды. Кроме того, в конце он снова отваливается, см. рисунок: [][https://i.stack.imgur.com/Yd9WH.png]

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

Вопросы:

  1. Я неправильно понял, как работает задержка регулирования записи?
  2. Возможно ли то, что я пытаюсь сделать?
  3. Если да, то что я делаю не так?

Да, я знаю, я буквально гонюсь за парой секунд и никогда не окупю затраченных на достижение этого усилий. Ничего страшного, на данный момент это личное дело между мной и ZFS, и это вопрос принципа ;)

1 ответ

Вам также необходимо увеличитьzfs_txg_timeoutот текущего значения по умолчанию, равного 5 секундам, до чего-то вроде 7G/0,2G/s = 35 с, поэтому установки значения 40 с должно быть достаточно.

В вашей/etc/modprobe.d/zfs.conf:

options zfs zfs_txg_timeout=40

Обратите внимание, что ARC — это именно кэш «чтения» с нулевым участием в кэше записи, поэтому убедитесь, что ваш ARC не настроен на потребление дополнительных 7 ГБ данных, которые ваш кэш блочной записи должен поглощать на каждый поток записи объемом 30 ГБ. Кэш записи для ZFS подобен любому другому простому блочному кэшу записи (например,commitпараметр для файловых систем ext4), поэтому обязательно проверяйте его в непроизводственной среде, чтобы гарантировать отсутствие нехватки оперативной памяти во всех сценариях передачи.

Другие вопросы по тегам