Size: a a a

2020 September 15

AM

Alexander Malkov in pro.cxx
смотрел я немного, как это сделано в ClickHouse, там они собирают статистику с jemalloc, пока более подробно как и что не разобрался, но думаю что-то подобное сделать надо
источник

ПК

Побитый Кирпич... in pro.cxx
Alexander Malkov
например, есть у нас асинхронный сервер, и пользователи выполняют запрос, нужно вычислить, сколько потребовалось оперативной памяти на выполнение этого запроса
Ну вот один запрос это не функция, скорее что то абстрактное. А раз так, то можно как-нибудь прокинуть ID запроса в аллокатор (у каждого запроса свой аллокатор), и смотреть потом группировку по ID
источник

ПК

Побитый Кирпич... in pro.cxx
Надо только так писать код, чтоб этот алокатор все юзали в рамках запроса
источник

ПК

Побитый Кирпич... in pro.cxx
На ровном месте так не получится
источник

ПК

Побитый Кирпич... in pro.cxx
Побитый Кирпич
Ну вот один запрос это не функция, скорее что то абстрактное. А раз так, то можно как-нибудь прокинуть ID запроса в аллокатор (у каждого запроса свой аллокатор), и смотреть потом группировку по ID
Хотя мб можно и ограничиться функцией, если норм получается. Тогда стектрейсы анализировать
источник

AM

Alexander Malkov in pro.cxx
Побитый Кирпич
Надо только так писать код, чтоб этот алокатор все юзали в рамках запроса
ну вот, а это либо аллокатор по умолчанию подменять, либо везде в коде писать этот аллокатор
источник

AM

Alexander Malkov in pro.cxx
ClickHouse подменяют на jemalloc
источник

SE

Stanislav Ershov in pro.cxx
Alexander Malkov
ClickHouse подменяют на jemalloc
да его через LD_PRELOAD можно заменить при желании
источник

AM

Alexander Malkov in pro.cxx
Нашел в исходниках ClickHouse, что они переопределили операторы new и delete и там просто трекают память, какую необходимо выделить или очистить, таким образом выводят метрику по использованию текущей и пиковой памяти
источник

AM

Alexander Malkov in pro.cxx
можно сделать подобное, и если бы была задача для синхронного сервера, то все решалось бы просто, трекаем потребление в начале запроса, трекаем перед выводом, разница = потребляемая память на запрос
источник

AM

Alexander Malkov in pro.cxx
но как это все красиво сделать с асинхронным запросом..
источник

AM

Alexander Malkov in pro.cxx
передавать в трек id запроса и дополнительно собирать мониторинг по id...
источник

ПК

Побитый Кирпич... in pro.cxx
Alexander Malkov
передавать в трек id запроса и дополнительно собирать мониторинг по id...
Если на каждый запрос свой поток, то можно через thread_local сделать
источник

AM

Alexander Malkov in pro.cxx
но так мониториться память в куче.. а стек остается на произвол..
источник

ПК

Побитый Кирпич... in pro.cxx
Alexander Malkov
но так мониториться память в куче.. а стек остается на произвол..
на стек пофиг
источник

K

Kirill in pro.cxx
Зачем вообще нужен copy elision, если есть std::move?
Недавно 3 часа отлаживал багу, оказалось что nvcc в copy elision не умеет, а gcc умеет, и из-за этого ничего не работало
источник

ПК

Побитый Кирпич... in pro.cxx
он всегда выделен
источник

ПК

Побитый Кирпич... in pro.cxx
Kirill
Зачем вообще нужен copy elision, если есть std::move?
Недавно 3 часа отлаживал багу, оказалось что nvcc в copy elision не умеет, а gcc умеет, и из-за этого ничего не работало
у тебя в коде бага, что от оптимизаций всё ломается
источник

ПК

Побитый Кирпич... in pro.cxx
Kirill
Зачем вообще нужен copy elision, если есть std::move?
Недавно 3 часа отлаживал багу, оказалось что nvcc в copy elision не умеет, а gcc умеет, и из-за этого ничего не работало
а copy elision нужен, потому что это:
1) Оптимальнее мува
2) Позволяет возвращать из функций немуваемые объекты (std::mutex)
источник

K

Kirill in pro.cxx
Побитый Кирпич
у тебя в коде бага, что от оптимизаций всё ломается
Да, я багу в итоге пофиксил. Оказалось что у меня почему-то конструктор копирования был не удалён, а определён пустым. Но сколько времени мне на это понадобилось...
источник