Как может WAL (запись в журнал впереди) иметь лучшую производительность, чем запись непосредственно на диск? - PullRequest
2 голосов
/ 04 ноября 2019

Технология WAL (Write-Ahead Log) используется во многих системах.

Механизм WAL заключается в том, что когда клиент записывает данные, система делает две вещи:

  1. Запись журнала на диск и возврат к клиенту
  2. Запись данных на диск, в кэш или в память асинхронно

Существует два преимущества:

  1. Если возникает какое-либо исключение (потери мощности) мы можем восстановить данные из журнала.
  2. Производительность хорошая, потому что мы записываем данные асинхронно и можем выполнять пакетные операции

Почему бы просто не записать данные непосредственно на диск? Вы делаете каждую запись прямо на диск. В случае успеха вы сообщаете клиенту об успехе. Если запись не удалась, вы возвращаете ошибочный ответ или время ожидания.

Таким образом, у вас все еще есть эти два преимущества.

  1. Вам не нужно ничего восстанавливать в случае отключения питания. Поскольку каждый успешный ответ, возвращаемый клиенту, означает, что данные действительно находятся на диске.
  2. Производительность должна быть одинаковой. Хотя мы часто прикасаемся к диску, но WAL тоже одинаков (каждая успешная запись для WAL означает, что это успех на диске)

Так в чем же преимущество использования WAL?

Ответы [ 2 ]

2 голосов
/ 04 ноября 2019

Производительность.

  • Второй шаг в вашем списке не является обязательным. Для занятых записей значение может не попасть в кэш и на диск до его повторного обновления. Эти записи выполнять не нужно, для возможного восстановления выполняются только записи журнала.

  • Записи журнала могут быть объединены в последовательные записи большего размера. Для загруженных рабочих нагрузок задержка записи в журнал и последующее выполнение одной записи может значительно улучшить пропускную способность.

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

Обновление:

Твердотельные накопители также имеют более высокую производительность при больших последовательных записях, но по другим причинам. Это не так просто, как сказать «нет времени поиска или задержки вращения, поэтому просто напишите случайным образом». Например, запись больших блоков в пространство, которое SSD знает как «свободный» (например, с помощью команды TRIM для накопителя), лучше, чем чтение-изменение-запись, где накопителю также необходимо управлять выравниванием износа и, возможно, отображать обновления в различныеразмеры внутреннего блока.

0 голосов
/ 05 ноября 2019

У меня есть предположение.

Сделайте каждую запись на диск напрямую, не требуя восстановления при отключении питания. Но проблему производительности нужно обсуждать двояко.

ситуация 1:

Все ваше устройство хранения данных вращается на диске. У пути WAL будет лучшая производительность. Потому что, когда вы пишете WAL, это последовательная запись. Операция записи данных на диск является случайной записью. Производительность для произвольной записи очень низкая, чем для последовательной записи на вращающемся диске.

Ситуация 2: Все ваше устройство является SSD. Тогда производительность не может быть слишком большой разницей. Потому что последовательная запись и случайная запись имеют почти одинаковую производительность для SSD.

...