1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
|
## Memory tracker
https://a.yandex-team.ru/arc/trunk/arcadia/library/cpp/actors/core/memory_track.h
Использование:
* отслеживание аллокаций экземпляров конкретного класса через new/delete и new[]/delete[]
* отслеживание аллокаций в контейнерах
* ручное отслеживание моментов аллокации/деаллокации
----
### Отслеживание аллокаций класса через new/delete
Использование с автоматически генерируемой меткой:
```cpp
#include <library/cpp/actors/core/memory_track.h>
struct TTypeLabeled
: public NActors::NMemory::TTrack<TTypeLabeled>
{
char payload[16];
};
```
Использование с пользовательским именем метки:
```cpp
#include <library/cpp/actors/core/memory_track.h>
static const char NamedLabel[] = "NamedLabel";
struct TNameLabeled
: public NActors::NMemory::TTrack<TNameLabeled, NamedLabel>
{
char payload[32];
};
```
----
### Отслеживание аллокаций в контейнерах
```cpp
#include <library/cpp/actors/core/memory_track.h>
static const char InContainerLabel[] = "InContainerLabel";
struct TInContainer {
char payload[16];
};
std::vector<TInContainer, NActors::NMemory::TAlloc<TInContainer>> vecT;
std::vector<TInContainer, NActors::NMemory::TAlloc<TInContainer, InContainerLabel>> vecN;
using TKey = int;
std::map<TKey, TInContainer, std::less<TKey>,
NActors::NMemory::TAlloc<std::pair<const TKey, TInContainer>>> mapT;
std::map<TKey, TInContainer, std::less<TKey>,
NActors::NMemory::TAlloc<std::pair<const TKey, TInContainer>, InContainerLabel>> mapN;
std::unordered_map<TKey, TInContainer, std::hash<TKey>, std::equal_to<TKey>,
NActors::NMemory::TAlloc<std::pair<const TKey, TInContainer>>> umapT;
std::unordered_map<TKey, TInContainer, std::hash<TKey>, std::equal_to<TKey>,
NActors::NMemory::TAlloc<std::pair<const TKey, TInContainer>, InContainerLabel>> umapN;
```
----
### Ручное отслеживание аллокаций/деаллокаций
```cpp
#include <library/cpp/actors/core/memory_track.h>
static const char ManualLabel[] = "ManualLabel";
...
NActors::NMemory::TLabel<ManualLabel>::Add(size);
...
NActors::NMemory::TLabel<ManualLabel>::Sub(size);
```
----
### Собираемые метрики
Сервис **utils**, пользовательская метка **label**, сенсоры:
- MT/Count: количество аллокаций в моменте
- MT/Memory: аллоцированная память в моменте
- MT/PeakCount: пиковое значение количества аллокаций (сэмплится с фиксированной частотой)
- MT/PeakMemory: пиковое значение аллоцированной памяти
|