
yopp
17.02.2017
11:27:20
правда я не помню куда попадает findAndModify, кажется в update
Latest: 3.4.2, Stable: 3.2.12. Пришло время обновлятся до 3.4.1+: https://aphyr.com/posts/338-jepsen-mongodb-3-4-0-rc3

Alexey
17.02.2017
11:39:49

yopp
17.02.2017
11:40:39
нет, find это просто команды на чтения. а findAndModify это одна команда на найти и обновить

Google

yopp
17.02.2017
11:41:28
в opcounters скорее всего ты ищешь query
"query" : 959956,
"find" : {
"failed" : NumberLong(0),
"total" : NumberLong(959913)
},
ну близко

Alexey
17.02.2017
11:43:09
Мне скорее нужно понять что делает база, когда я вижу рост чтения на диске и пейджфолты

yopp
17.02.2017
11:43:14
%)
надо уже сесть и дописать экспортер
нужен прометей и графана
и jre7/8
и монга 3.2.10+
на 3.0.x/3.2.10- тоже почти всё будет работать, но там не будет метрик по тому как конкретной коллекцией/индексами кеш используются (wt cache usage)

Alexey
17.02.2017
11:50:09
у меня счетчики экспортируются в zabbix траппом, потом через плагин в графане отрисовываюится уже

yopp
17.02.2017
11:51:51
забикс не умеет собирать статистику по кокнетным коллекциям/индексам afaik

Google

Alexey
17.02.2017
11:52:57
а он сам не собирает, собирает скрипт, а потом уже кидает в айтемы, а из них выводит в графане
тот же серверстатус можно парсить каким-нибудь jq

yopp
17.02.2017
11:54:32
там не serverStatus пасить надо
а collStats для всех коллекций

Alexey
17.02.2017
11:54:39
а что?
ну ок... какая разница что парсить

yopp
17.02.2017
11:55:03
иначе толку от того что ты будешь знать что «монга пишет в/из кеша»
ну да, я тебе по твоим симптомам могу сказать что пишет!

Alexey
17.02.2017
11:55:43
это же через mongo -e"collstat()" длается все равно?

yopp
17.02.2017
11:55:45
больше скажу: монга делает больше io чем может прожевать сторадж!
потом получить список коллекций в базе
потом пройти по всем коллекциям

Alexey
17.02.2017
11:57:15
ну праивльно. через LLD в заббикс делаем индекс, потом каждой делаем колстат и в айтем
автообнаружение называется

yopp
17.02.2017
11:57:48
и сделать db.getCollection(<name>).stats({indexDetails: 1})
а потом парсить каждый документ в стате индексов :)
можешь взять логику из экспортера
пионерам бесполезно предлагать готовое решение :)

Alexey
17.02.2017
11:58:43
да, я именно так и считаю кол-во записей в коллекции

Google

yopp
17.02.2017
11:59:45
но вобщем развлекайся, мне заббикс не интересен совершенно, я готов на практические вопросы ответить

Alexey
17.02.2017
11:59:45
да не важно, главное понять что считать

yopp
17.02.2017
11:59:53
всё
тебе в идеале нужно распарсить весь документ со статой в метрики
что-то в духе ~200 метрик на коллекцию + ~200 на каждый индекс (сходу ~400)
потом разобраться в метриках и сделать себе дешборд и алерты на нужные метрики

Alexey
17.02.2017
12:02:44
да сделано уже, просто метрики по файнду добавлю и все. если надо фильтр включу, чтоб только нужные выгружались.
Мне надо было просто понять какая метрика за find отвечает, т. к. не нашел ее а оппкаунтерах

yopp
17.02.2017
12:03:02
тебе от find не холодно и не жарко
тебе serverStatus() тут не поможет

Alexey
17.02.2017
12:03:40
ок. а что мне нужно искать?

yopp
17.02.2017
12:03:40
это слишком общие метрики, которые ничего кроме «плохо/хорошо» вообще сказать не могут
нужно анализировать метрики из _каждой коллекции_

Alexey
17.02.2017
12:04:28
вот вижу я что растет чтение на диске, растет Iowait, есть всплески педжфолтов. Какая дальше должна быть стратегия?


yopp
17.02.2017
12:05:13
минимальный набор:
программа минимум (ключ wiredtiger в stats():
"cache" : {
"bytes currently in the cache" : 710342011,
"bytes read into cache" : 496185602,
"bytes written from cache" : 161808640,
"internal pages evicted" : 0,
"modified pages evicted" : 14,
"unmodified pages evicted" : 0
}
"block-manager" : {
"checkpoint size" : 194146304,
"file size in bytes" : 185212928,
"file bytes available for reuse" : 28672,
}
"cursor" : {
"bulk-loaded cursor-insert calls" : 0,
"create calls" : 25,
"cursor-insert key and value bytes inserted" : 168862327,
"cursor-remove key bytes removed" : 0,
"cursor-update value bytes updated" : 0,
"insert calls" : 1257539,
"next calls" : 11398715,
"prev calls" : 1,
"remove calls" : 0,
"reset calls" : 1812770,
"restarted searches" : 10372,
"search calls" : 466189,
"search near calls" : 89095,
"truncate calls" : 0,
"update calls" : 0
}
более того, затык может быть в индексах
так что тебе эти данные нужно ещё по _каждому индексу_ в каждой коллекции собирать
(аргумент {indexDetails: 1})
потом включить профайлер и смотреть какие конкретно запросы затыкают и поддержать их индексами или порезать индексы чтоб они все в память вмещались

Google

yopp
17.02.2017
12:06:59
но обычно по графикам сразу видно примерно что происходит

Alexey
17.02.2017
12:08:25

yopp
17.02.2017
12:08:34
я тебе выше скинул метрики

Alexey
17.02.2017
12:09:19
кеш - это про то, что коллекция влезает в кеш или нет, я правильно понимаю?

yopp
17.02.2017
12:09:45
в третий раз повторяю: по всем базам, по всем коллекциям, нужно сделать db.getCollection(<name>).stats({indexDetails: 1}) и распарсить ключ wiredtiger и indexDetails (в котором ключом будет название индекса, а значением будет примерно тоже самое что в wiredtiger)
сами документы могут и не влезать в кеш, это не страшно
(в большинстве случаев)
а вот если индексы не влезают — очень страшно
потому что на каждый запрос монга будет проезжать по дереву, а дерево частично будет на диске и оппа, мы упираемся в iops диска сходу
причём упираемся обычно худшим способом: evict modified, а это записать минимум несколько блоков на диск, а потом чтение нужного

Alexey
17.02.2017
12:14:30
ну хорошо, допустим я сделаю, соберу данные, вот те, что выше ты скинул. Дальше что? какая из этих метрик мне будет говорить, что мы поехали по диску?

yopp
17.02.2017
12:14:51
ты будешь видеть три вещи
"bytes currently in the cache" : 710342011,
"bytes read into cache" : 496185602,
"bytes written from cache" : 161808640,

Alexey
17.02.2017
12:14:58
я наверно не совсем понимаю, это что некий тест такой для монги, после которого она выводит статистику?

yopp
17.02.2017
12:15:10
нет, это внутренние метрики хранилища
они относительно безобидные в сборке
по крайней мере на порядки более безобидные чем setProfile с 10мс
wt и так собирает кучу информации, так что это просто чтение из памяти без особых изысков
короче

Google

yopp
17.02.2017
12:16:48
currently in cache покажет тебе сколько данные занимают в памяти (можно сравнить с size и понять сколько вмещается в память)
изменение currently in cache покажет что происходит с кешем конкретной коллекции: кеш вытесняется или вытесняет других
read into покажет как кеш пополняется / wrritten from показывает сколько из кеша выгружается на диск
это позволит определить что коллекция/индекс дрочат диск
дальше берём cursors и смотрим что именно дрочит

Alexey
17.02.2017
12:18:20
ага...теперь вроде более менее понятно

yopp
17.02.2017
12:18:27
и третий момент

Alexey
17.02.2017
12:18:29
расскажи про курсор, что это?

yopp
17.02.2017
12:18:36
"block-manager" : {
"checkpoint size" : 194146304,
"file size in bytes" : 185212928,
"file bytes available for reuse" : 28672,
}
изменение file size in bytes покажет тебе когда монга аллоцирует ещё места на диске
file bytes available for reuse покажет тебе что у тебя в коллекции много «дырок»: страниц которые помечены как свободные
checkpoint size я чот не помню зачем я сюда ввернул

Alexey
17.02.2017
12:20:44
про курсор можно поподробнее, что он показывает?

yopp
17.02.2017
12:20:52
ну курсор он и есть курсор

Alexey
17.02.2017
12:21:23
как он дрочит диск и тп, давай подробости)

yopp
17.02.2017
12:21:46
курсор это штука которая читает данные в wiredtiger
если про wt метрики
в монге любой запрос (в sql терминологии select) на чтение открывает курсор
считай как «постраничная навигация»

Alexey
17.02.2017
12:22:34
ок. так

yopp
17.02.2017
12:22:40
курсор тебе выдаёт окно в X записей и ты можешь туда-сюда двигать это окно