
Magistr
10.03.2017
17:09:12

Pavel
10.03.2017
17:09:19
дада

Vladimir
10.03.2017
17:09:22
Я и хочу по сути флеймграфы от времени с наложением друг на друга

Google

Vladimir
10.03.2017
17:09:48
Чтобы видеть разницу
И возможностью листать время

Alex
10.03.2017
20:00:54
Конечно
тебя похоже от метрик дико вставляет, раз 3 день обсуждаете их под графану

Vladimir
10.03.2017
20:38:59
Просто мы сектанты

ptchol
11.03.2017
04:37:45
Мы же последователи церкви
мы ещё и с вами можем поговорить
Смею напомнить, что сама тема "церкви", это не просто выдумка Алексея, а корни её уходят далеко, в 2011й год. Когда некогда популярный проект Etsy показал нам этот путь.
https://codeascraft.com/2011/02/15/measure-anything-measure-everything/
По крайней мере я надеюсь что это была отсылка к этому :)

Алексей
11.03.2017
05:18:22
нее. подслушано у @demeliorator

Andrey
11.03.2017
05:41:29
думаю он читал ту статью

Evgeny
11.03.2017
08:53:53
Используем GO стек для графита carbonapi + go-carbon, возникла проблема что carbonapi никак не лимитируется по памяти, когда идет запрос на кучу метрик carbonapi это кэширует и так до тех пор пока не закончиться оперативка (64 ГБ) и он не упадет. есть параметр memsize , пробововал ему выставить 10 и 100 - разницы в поведении не заметил. Кто нибудь сталкивался ?

Vladimir
11.03.2017
10:36:22

Google

Vladimir
11.03.2017
10:36:32
вообще должен лимитироваться параметром -memsize
https://github.com/dgryski/carbonapi/blob/master/main.go#L616
либо можно в memcache кэшировать, но это не очень тестировалось

Evgeny
11.03.2017
10:38:50
смотрел этот код - но не очень понял, кэш протухает (т.е. должен очищатся) через 10 * какое то время в секундах

Vladimir
11.03.2017
10:41:00
при добавлении в кэш он проверяет есть ли еще у него память доступная
если нет то удаляет какую-нибудь запись
https://github.com/dgryski/go-expirecache/blob/master/cache.go#L75
логика вообще следующая
при добавлении элемента в кэш ему устанавливается время жизни
кэш таймаут по умолчанию 60 секунд (как у графита), меняется &cacheTimeout=время_в_секундах
https://github.com/dgryski/carbonapi/blob/master/main.go#L287
вот в этом месте
каждые 10 секунд горутина просыпается и удаляет те записи которые уже протухли из кэша
674-ая строка это как раз ее запуск


Evgeny
11.03.2017
10:44:52
при старте я вижу установку параметров в логе
2017/03/11 13:42:54 starting carbonapi (development build)
2017/03/11 13:42:54 using zipper http://127.0.0.1:8084
2017/03/11 13:42:54 using GOMAXPROCS 8
2017/03/11 13:42:54 Using graphite host 127.0.0.1:2003
2017/03/11 13:42:54 setting stats interval to 1m0s
2017/03/11 13:42:54 listening on port 8082
2017/03/11 13:42:54 Serving [::]:8082 with pid 20801
а memsize почему то нет

Vladimir
11.03.2017
10:45:06
если не указано иного

Google

Vladimir
11.03.2017
10:45:13
0 - безлимит
выставь ему туда -memsize=$((1024*1024*1024*12)) # (12GB)
должно полегчать
наверное умолчания неправильные и надо ограничивать в процентах от свободной памяти
например 50%
но мы умолчания под себя делали

Evgeny
11.03.2017
10:46:45
root 20801 0.0 0.4 740284 299848 ? Sl 13:42 1:58 /usr/sbin/carbonapi -cpus 8 -graphite 127.0.0.1:2003 -i 1m -p 8082 -memsize 100 -z http://127.0.0.1:8084
в описании написано что в мегабайтах задавать - или не так ?

Vladimir
11.03.2017
10:47:14
а да, сорри

Evgeny
11.03.2017
10:48:29
я как бы и 100 писал и 1000 - это ни на что не влияет... процесс все равно ест все что есть

Vladimir
11.03.2017
10:48:35
То есть вы его ограничили, но ограничение не работает?
@ihard а можешь снять heap profile?

Vladimir
11.03.2017
10:48:48
и отправить свгшку?
go tool pprof http://localhost:8082/debug/pprof/heap
сделать например top10
и показать list на функцию
(требует сборки через go build -a или наличия сырцов софтины на этой машине)

Evgeny
11.03.2017
10:51:14
щас попробую

Vladimir
11.03.2017
10:51:33
можно сделать curl http://localhost:8082/debug/pprof/heap > memory.profile
и утащчить файл на другой хост, где сырцы

Google

Vladimir
11.03.2017
11:00:06
а еще вопрос - какой коммит используется?

Evgeny
11.03.2017
11:02:07
sysctl vm.overcommit_memory
vm.overcommit_memory = 2

Vladimir
11.03.2017
11:02:38
я про другое )
я про то какой carbonapi?
и ООМ вызывает именно api?

Evgeny
11.03.2017
11:03:53
memory.profile - утянул на машину где собирал, как посмотреть дальше ?

Vladimir
11.03.2017
11:04:08
go tool pprof бинарник path/to/memory.profile
бинарь который собран тоже нужен


Evgeny
11.03.2017
11:05:38
go tool pprof /usr/sbin/carbonapi memory.profile
Entering interactive mode (type "help" for commands)
(pprof) top10
32255.44kB of 32255.44kB total ( 100%)
Dropped 197 nodes (cum <= 161.28kB)
Showing top 10 nodes out of 29 (cum >= 31743.24kB)
flat flat% sum% cum cum%
20121.57kB 62.38% 62.38% 20121.57kB 62.38% github.com/dgryski/carbonzipper/carbonzipperpb.(*GlobResponse).Marshal
6871.30kB 21.30% 83.68% 9109.02kB 28.24% github.com/dgryski/carbonapi/expr.MarshalJSON
2237.72kB 6.94% 90.62% 2237.72kB 6.94% strconv.formatBits
902.59kB 2.80% 93.42% 1451.43kB 4.50% compress/flate.NewWriter
548.84kB 1.70% 95.12% 548.84kB 1.70% compress/flate.(*compressor).init
548.84kB 1.70% 96.82% 548.84kB 1.70% github.com/dgryski/go-expirecache.(*Cache).Set
512.38kB 1.59% 98.41% 512.38kB 1.59% net/url.Values.Encode
512.20kB 1.59% 100% 512.20kB 1.59% runtime.malg
0 0% 100% 1451.43kB 4.50% compress/gzip.(*Writer).Write
0 0% 100% 31743.24kB 98.41% github.com/gorilla/handlers.(*combinedLoggingHandler).ServeHTTP


Vladimir
11.03.2017
11:07:48
@ihard то есть памяти аллоцировано мало совсем

Admin
ERROR: S client not available


Evgeny
11.03.2017
11:08:09
щас я сэмулирую нагрузку
go tool pprof /usr/sbin/carbonapi /tmp/memory.profile
Entering interactive mode (type "help" for commands)
(pprof) top10
11480.93MB of 11596.75MB total (99.00%)
Dropped 228 nodes (cum <= 57.98MB)
Showing top 10 nodes out of 16 (cum >= 11479.61MB)
flat flat% sum% cum cum%
11453.66MB 98.77% 98.77% 11453.66MB 98.77% github.com/dgryski/carbonzipper/carbonzipperpb.(*FetchResponse).Unmarshal
25MB 0.22% 98.98% 11504.61MB 99.21% main.renderHandler.func1
2.26MB 0.02% 99.00% 90.14MB 0.78% main.renderHandler
0 0% 99.00% 11453.66MB 98.77% github.com/dgryski/carbonzipper/carbonzipperpb.(*MultiFetchResponse).Unmarshal
0 0% 99.00% 90.14MB 0.78% github.com/gorilla/handlers.(*combinedLoggingHandler).ServeHTTP
0 0% 99.00% 90.14MB 0.78% github.com/gorilla/handlers.(*cors).ServeHTTP
0 0% 99.00% 90.14MB 0.78% github.com/gorilla/handlers.CompressHandlerLevel.func1
0 0% 99.00% 90.14MB 0.78% github.com/gorilla/handlers.combinedLoggingHandler.ServeHTTP
0 0% 99.00% 90.14MB 0.78% main.main.func3
0 0% 99.00% 11479.61MB 98.99% main.zipper.Render
/usr/sbin/carbonapi -cpus 8 -graphite 127.0.0.1:2003 -i 1m -p 8082 -memsize 100 -z http://127.0.0.1:8084
собирал 28 января - этот коммит последний получается https://github.com/dgryski/carbonapi/commit/9a17fbb1e6a1c42edfd3805bf7c7a70a875820a9


Vladimir
11.03.2017
11:14:47
Кажется что там основное это unmarshal, а не кэш
могу посоветовать попробовать обновить и carbonapi и zipper (если используете) и go-carbon до версии поддерживающей protobuf3, там вроде бы потребление памяти уменьшилось
а так в целом - какое количество запросов, сколько примерно метрик в запросе матчится?
за какие примерно периоды

Evgeny
11.03.2017
11:18:47
период 14 дней метрик 100 000 где то

Google

Vladimir
11.03.2017
11:19:49
это в 1 запрос 100 тысяч?

Evgeny
11.03.2017
11:19:50
попробую пересобрать

Vladimir
11.03.2017
11:20:15
я про колличество запросов в секунду, среднее колличество точек в результате на запрос
Потому что 11ГБ это довольно большие запросы выходят

Evgeny
11.03.2017
11:23:05
на графике 3 запроса в каждом где то по 30000 метрик уникальных, если период несколько часов то все норм, несколько дней если период - то память начинает кончаться
carbonzipper не используется - carbonapi сразу в carbonserver (go-carbon) смотрит, если добавить carbonzipper врядли поможет в такой ситуации ?

Vladimir
11.03.2017
11:29:23
не, не поможет
тут надо либо смотреть как carbonapi (точнее в целом unmarshal и передачу данных) оптимизировать, либо больше памяти и железа...

Evgeny
11.03.2017
11:30:47
ок спасибо

Vladimir
11.03.2017
11:31:00
можешь тикет завести с описанием кейса? Чтобы как минимум не потерялось

Pavel
11.03.2017
11:31:05
30 000 метрик для графита - это 30 000 файлов

Vladimir
11.03.2017
11:31:28

Pavel
11.03.2017
11:31:30
я бы начал с осмотра состояния сервера в целом и медитации на iotop и perf top

Vladimir
11.03.2017
11:31:59
то есть 14 дней по минуте это 14*60*24 = 20160 точек
то есть 200кб на метрику
их 100000

Pavel
11.03.2017
11:32:20
static_assert(sizeof(whisper_point_t) == 12, "Broken size for whisper_point_t");

Evgeny
11.03.2017
11:32:22
https://github.com/dgryski/carbonapi/issues/191 - завел, приложу perf

Vladimir
11.03.2017
11:32:31

Pavel
11.03.2017
11:32:36
12 байт там точка. double + timestamp 32битный

Vladimir
11.03.2017
11:32:45
@pavel_odintsov ты про другое совсем
в этом случаи это 10 байт на точку
апроксимировано