есть некий сервис на С++, который состоит из множества частей. Хотелось бы понимать в разные моменты времени, какие части приложения сколько выжрали оперативной памяти. То есть организовать достаточно детализированный профайлинг памяти для приложения.
Сейчас регулярно снимается стастика с аллокатора (jemalloc), но понятное дело, что это говорит только о ситуации для всего приложения.
Есть идеи, как подобное организовать?
Первое, что мне приходит в голову - разным частям приложения раздать разные аллокаторы и зафорсить по крайней мере для начала административно их использование в различных подсистемах приложения. Ну или свой аллокатор с какими-то метками для каждой части приложения, которые при аллоках\деаллоках будет заниматься подсчётом нужной статистики.
Почему не используются готовые утилиты профайлинга - они не дают нужной точности.
Если важно - С++14
Я делал на основе pmr, singlton registry именованных ресурсов, которые просто прокси в default resource со счётчиками. Всю инфу по счётчикам можно получить через registry. Уровень детализации тут на вкус, хоть до каждого класса. При этом не обязательно делать контейнеры pmr, можно сделать stateless allocator параметризуемый singlton-ресурсом, который может выглядеть примерно так:
struct my_resource {
static memory_resource* get() {
static auto* mem = get_counted_memory_resource("My-memory");
return mem;
}
};
Ну и таким образом можно ещё повозиться с type_info и для контейнеров вообще это дело зашаблонить, using vector<T> = std::vector<T, counted_alloc<T, vector_alloc_resource<T>>>.