Связаны ли диски случайных обновлений в основном со стандартными и добавляются только базы данных? - PullRequest
1 голос
/ 05 февраля 2011

Если у меня большой набор данных и я делаю случайные обновления, я думаю, что обновления в основном ограничены дисками (в случае добавления только баз данных речь идет не о поисках, а о пропускной способности, я думаю). При небольшом обновлении записи одна страница данных должна быть обновлена, поэтому, если мой диск может записывать 10 МБ / с данных, а размер страницы составляет 16 КБ, я могу иметь до 640 случайных обновлений в секунду. В дополнение только базы данных около 320 в секунду, потому что одно обновление может занять две страницы - индекс и данные. В других базах данных ranom пытается обновить страницу на месте, может быть даже хуже, как 100 обновлений в секунду.

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

Я имею в виду ситуацию, когда грязные страницы (после обновления) должны быть сброшены на диск и синхронизированы (больше не могут оставаться в кэше). Значит, количество обновлений в секунду в этой ситуации ограничено? Вероятны ли мои вычисления, как 320 обновлений в секунду? Может я что-то упустил?

1 Ответ

1 голос
/ 05 февраля 2011

"Это зависит."

Чтобы быть полным, есть другие вещи, которые нужно учитывать.

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

Конечно, это в идеальном мире.

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

В типичном сценарии, если вы обновите строку, база данных внесет изменения в память. Если вы зафиксируете эту строку, база данных подтвердит это, сделав заметку в журнале, сохранив фактическую грязную страницу в памяти. Позже, когда контрольные точки базы данных исправят грязные страницы на диске. Но когда он делает это, он сортирует блоки и записывает их настолько последовательно, насколько это возможно. Затем он запишет контрольную точку в журнал.

Во время восстановления, когда БД дала сбой и не смогла установить контрольную точку, база данных считывает журнал до последней контрольной точки, «перекатывает его вперед» и применяет эти изменения к фактической странице диска, отмечает последнюю контрольную точку, а затем делает систему доступной для сервис. * * 1013

Запись в журнал является последовательной, запись данных в основном последовательной.

Теперь, если журнал является частью обычного файла (типичного сегодня), вы записываете запись журнала, которая добавляется к файлу диска. СИСТЕМА ФАЙЛОВ затем (вероятно) добавит в журнал ITS, который вы только что внесли изменения, чтобы он мог обновить свои структуры локальной файловой системы. Позже файловая система также зафиксирует свои грязные страницы и сделает изменения метаданных постоянными.

Итак, вы можете видеть, что даже простое добавление может вызвать несколько записей на диск.

Теперь рассмотрим дизайн «только для добавления», такой как CouchDB. То, что сделает Couch, - это когда вы делаете простую запись, у него нет журнала. Файл представляет собой собственный журнал. Файлы Couch DB растут без конца и нуждаются в сжатии во время обслуживания. Но когда он выполняет запись, он записывает не только страницу данных, но и любые затронутые индексы. И когда на индексы влияют, то Couch перепишет всю ветвь изменения индекса с корня на лист. Таким образом, простая запись в этом случае может быть дороже, чем вы могли бы подумать.

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

В идеале, ваша БД использует выделенное сырое хранилище по сравнению с файловой системой для хранения, но большинство не делает этого сегодня. Преимущества хранилищ на основе файловых систем, как правило, перевешивают преимущества производительности.

Если вы работаете в файловой системе, то заранее выделенные последовательные файлы являются преимуществом, так что ваше «только добавление» не просто пропускает другие файлы в файловой системе, что делает их похожими на случайные обновления. Кроме того, используя предварительно выделенные файлы, ваши обновления просто обновляют структуры данных БД во время записи, а не структуры данных БД И файловой системы при расширении файла.

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

Итак, все эти факторы влияют на пропускную способность БД.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...