aboutsummaryrefslogtreecommitdiffstats
path: root/library/cpp/actors/core/README.md
blob: 439a8dd459a07ba4bbbe55426daba49194075d3c (plain) (blame)
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: пиковое значение аллоцированной памяти