Mon go узкое место чтения с диска для больших наборов данных и ограничений IOPS - PullRequest
2 голосов
/ 10 марта 2020

Мне трудно понять, где существуют узкие места, связанные с чтением данных с диска в коллекции базы данных Mon go. Я знаю, что индексы являются огромным фактором оптимизации запросов, но, скажем, у нас есть коллекция без индексов, и я выполняю простой запрос в коллекции с 25 миллионами записей размером около 50 ГБ:

db.customers.find({ first_name: "xyz" })

Конечно , это должно запустить COLLSCAN, поэтому он очень медленный (если он не кэшируется в памяти). Но насколько медленный является существенным в нашем случае. Выполнение некоторых тестов показывает, что машина, на которой я выполняю этот запрос, не привязывает мои доступные IOPS. На машине с макс. ~ 10K считыванием IOPS этот простой запрос удушается на отметке 1.2K . Обратите внимание на процессор iowait disk usage

Запрос явно ограничен диском, но он не использует весь потенциал того, что доступно на машине. Интересно, что когда я создаю другое соединение с базой данных и выполняю два запроса асинхронно, загрузка IOPS увеличивается в 2 раза. Кажется, что каждый запрос может сканировать только столько данных на диске за раз. Что сдерживает это при выполнении этих запросов, которые не имеют индексов?

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

1 Ответ

2 голосов
/ 10 марта 2020

Для хранения данных узлы mongod используют структуру, аналогичную btree. Конечная страница может содержать много документов размером до 32 КБ (сжатых) или один документ, если он имеет такой размер или больше.

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

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

...