Dmitry
прикольно
yopp
потому что для сборки метрик с хоста всегда есть --privileged или --device
yopp
а для выгребания метрик из контейнеров три ведра решений
Denis
/me
Denis
Упс, тыкнулось случайно, извиняйте
George
Как можно ускорить update_one? Работает намного медленнее, чем insert_many(ordered=False)
George
Всего около 100 итераций в секунду с обновлением
George
Понятно, что запись должна быть быстрее, чем перезапись, но почему так критично?
George
Однажды получилось ускорить этот процесс до 7000 итераций в секунду, но я не знаю что сделал тогда. Монга как-то разогрелась.
Dmitry
а зачем отказываться от insert_many?
Dmitry
а, update_one лол
Denis
Потому что обновление и вставка две разные операции)
Dmitry
ну bulk_operations
Dmitry
там вроде копит по 1к операций и выполняет за раз
Dmitry
у меня upsert ы так работают
George
Насколько я помню, у меня просто тогда было 1 итерация за 10 секунд
George
Как раз по 1000
Dmitry
initialize_unordered_bulk_op
Dmitry
у тебя на чем код?
George
А вот unordered не делал вроде
Dmitry
если питон то вот initialize_unordered_bulk_op
George
У меня pymongo
Dmitry
и туда пишешь что хочешь, хочешь апдейты, хочет что угодно
Dmitry
ну вот
Dmitry
как раз оттуда
Dmitry
у меня тоже )
Dmitry
http://api.mongodb.com/python/current/examples/bulk.html
George
Но почему тогда он как-то сам мог разогнаться?) Я замечаю, что монга требует разогрева, первая операция всегда дольше последующих
George
Хотя занимает 50% озу для кэша
Dmitry
к примеру bulk = db.test.initialize_unordered_bulk_op() bulk.find({'_id': 4}).upsert().update({'$inc': {'j': 1}}) потом после того как накопил сколько нужно операций >>> try: ... bulk.execute() ... except BulkWriteError as bwe: ... pprint(bwe.details)
Dmitry
Но почему тогда он как-то сам мог разогнаться?) Я замечаю, что монга требует разогрева, первая операция всегда дольше последующих
хз, я не делал особых замеров, по докам если хочешь ускорить кучу операций - делай unordered bulk operations :)
George
Но insert_many на bulk работает
Dmitry
по поводу скорости наверняка прогревается
Dmitry
но все-равно unordered bulk будет быстрее имхо
Dmitry
я так понял оно все кеширует в памяти, потом по 1к скармливает монге и та уже как-то параллельно пишет, сама разбирается как ей лучше
Dmitry
@dd_bb подскажи пожалуйста, а если у меня будет 2 secondary ноды, и я укажу приоритет на чтение с secondary - оно будет напрягать ноды равномерно?
yopp
От клиента зависит
yopp
update конечно медленнее чем insert.
yopp
Для update сначала find надо сделать
George
Ну да, кстати, индексы же ускорят этот процесс
George
Другое дело, что конкретно я в query писал _id, а такой индекс по дефолту есть
George
И кстати, как обновлять индексы на WiredTiger? Слышал что раньше на mmap он сам обновлял. Сейчас нужно RebaseIndexes или что-то такое?
yopp
эм
yopp
ускоряют, но не исключают. операция чтения — дорогая операция в любом случае. вставка существенно дешевле. индексы автоматически обновляются вместе с данными, иначе в них никакого смысла нет. ничего для этого делать не надо
Кукурузный
Почему чтение дороже вставки?
Кукурузный
Запись на диск всегда дороже чтения с него, разве нет?
yopp
Нет
vveare138
поиск же
Кукурузный
Почему?
yopp
Во-первых, запись в монгу нельзя сравнивать с сырым дисковым io
yopp
Как и чтение.
Кукурузный
За счёт wired Tiger?
yopp
Это гораздо более сложный и затратный процесс, который в себя включает огромное число операций.
Кукурузный
Есть что читнуть по теме
Кукурузный
?
yopp
Исходники монги?
yopp
strace?
yopp
Доку по архитектуре wt?
yopp
Во-вторых, чтение в монге это сложная операция, так как она происходит в несколько стадий. В лучшем случае это index fetch и document fetch.
yopp
В случае с записью в лучшем случае это index fetch (_id duplicate check) + index insert + document insert.
yopp
Если брать холодный сторадж, то запись будет быстрее, так как она не требует поиска данных.
yopp
В общем случае в вакууме. В реальности всё гораздо сложнее, так как есть множество уровней кешировния.
yopp
А простые операции чтения или обновления документов, где всё ограничивается index fetch крайне редкое явление.
yopp
Но в среднем когда мы вставляем документ, необходимо сделать fetch и несколько update в индексы и один insert в document storage. Что будет сильно проще чем update, в котором обычно есть условия.
yopp
А это уже многоуровневая операция, обычно со сканированием индексов. А это уже другие порядки
yopp
Но вообще, исходя из постановки, задача выглядит как предварительная оптимизация. Смысла мерять сколько можно вставить документов в монгу из вашего драйвера — нет.
Nick
Где хранится индекс на шардированной коллекции, если в нем нет префикса из шард ключа?
yopp
В шарде индексы всегда хранятся на самом шарде.
Кукурузный
@dd_bb развернутый ответ, спасибо
yopp
Так что ответ: на самом шарде.
Sergey
Эм, при записи всё равно будет fsync делаться, почему она бустрее чтения должна быть?
yopp
Разница межу использованием запроса с указанием shard key и без, только в том, что в первом случае планировщик исходя из данных о диапазонов шард-ключей будет знать на какой конкретный шард отправить запрос. В случае если ключа нет, запрос будет отправлен на все шарды
Nick
Ок, спасибо. Про сами запросы итак понятно
yopp
Шард это просто кусок коллекции.
Sergey
С чего вдруг
Ну ок, только при "j: true"
Sergey
хотя, я бы не рискнул писать без этой опции
yopp
Я бы вообще предложил не обсуждать что быстрее или медленнее в отрыве от конкретного кейса и конкретных данных.
yopp
Потому что ответ: ¯\_(ツ)_/¯ или как повезёт