# 6. Управление памятью

> Выделение памяти, ограничения, пулы, буферы и оценка потребностей процесса

---

Индекс LLMS: [llms.txt](/ru/llms.txt)

---

<!-- Generated by scripts/generate-haproxy-docs.py from pinned upstream text. -->

HAProxy использует простое и быстрое управление памятью на основе пулов. Поскольку он работает с небольшим числом
различных типов объектов, гораздо эффективнее брать новые объекты из пула, уже
содержащего объекты подходящего размера, чем вызывать malloc() для каждого отдельного размера. Пулы
организованы как стек, или LIFO: при выделении используются недавно освобождённые
объекты, которые ещё находятся в кэшах CPU. Пулы близких размеров объединяются, чтобы
ограничить фрагментацию памяти.

По умолчанию, поскольку приоритет отдаётся производительности, каждый освобождённый объект возвращается в свой
исходный пул, а выделенная память под объекты никогда не освобождается, так как ожидается их скорое повторное использование.

В CLI можно проверить использование памяти пулами с помощью команды
"show pools":

```shell
> show pools
Dumping pools usage. Use SIGQUIT to flush them.
  - Pool cache_st (16 bytes): 0 allocated (0 bytes), 0 used, 0 failures, 1 users, @0x9ccc40=03 [SHARED]
  - Pool pipe (32 bytes): 5 allocated (160 bytes), 5 used, 0 failures, 2 users, @0x9ccac0=00 [SHARED]
  - Pool comp_state (48 bytes): 3 allocated (144 bytes), 3 used, 0 failures, 5 users, @0x9cccc0=04 [SHARED]
  - Pool filter (64 bytes): 0 allocated (0 bytes), 0 used, 0 failures, 3 users, @0x9ccbc0=02 [SHARED]
  - Pool vars (80 bytes): 0 allocated (0 bytes), 0 used, 0 failures, 2 users, @0x9ccb40=01 [SHARED]
  - Pool uniqueid (128 bytes): 0 allocated (0 bytes), 0 used, 0 failures, 2 users, @0x9cd240=15 [SHARED]
  - Pool task (144 bytes): 55 allocated (7920 bytes), 55 used, 0 failures, 1 users, @0x9cd040=11 [SHARED]
  - Pool session (160 bytes): 1 allocated (160 bytes), 1 used, 0 failures, 1 users, @0x9cd140=13 [SHARED]
  - Pool h2s (208 bytes): 0 allocated (0 bytes), 0 used, 0 failures, 2 users, @0x9ccec0=08 [SHARED]
  - Pool h2c (288 bytes): 0 allocated (0 bytes), 0 used, 0 failures, 1 users, @0x9cce40=07 [SHARED]
  - Pool spoe_ctx (304 bytes): 0 allocated (0 bytes), 0 used, 0 failures, 2 users, @0x9ccf40=09 [SHARED]
  - Pool connection (400 bytes): 2 allocated (800 bytes), 2 used, 0 failures, 1 users, @0x9cd1c0=14 [SHARED]
  - Pool hdr_idx (416 bytes): 0 allocated (0 bytes), 0 used, 0 failures, 1 users, @0x9cd340=17 [SHARED]
  - Pool dns_resolut (480 bytes): 0 allocated (0 bytes), 0 used, 0 failures, 1 users, @0x9ccdc0=06 [SHARED]
  - Pool dns_answer_ (576 bytes): 0 allocated (0 bytes), 0 used, 0 failures, 1 users, @0x9ccd40=05 [SHARED]
  - Pool stream (960 bytes): 1 allocated (960 bytes), 1 used, 0 failures, 1 users, @0x9cd0c0=12 [SHARED]
  - Pool requri (1024 bytes): 0 allocated (0 bytes), 0 used, 0 failures, 1 users, @0x9cd2c0=16 [SHARED]
  - Pool buffer (8030 bytes): 3 allocated (24090 bytes), 2 used, 0 failures, 1 users, @0x9cd3c0=18 [SHARED]
  - Pool trash (8062 bytes): 1 allocated (8062 bytes), 1 used, 0 failures, 1 users, @0x9cd440=19
Total: 19 pools, 42296 bytes allocated, 34266 used.
```

Имя пула носит лишь справочный характер: это имя первого типа объектов, использовавшего данный пул. Размер
в скобках — размер объектов в этом пуле. Размеры объектов всегда округляются вверх
до ближайшего числа, кратного 16 байтам. Выводятся текущее число выделенных объектов и соответствующее
количество байтов, что позволяет легко определить, какой пул потребляет больше всего
памяти. Число объектов, используемых в данный момент, также приводится в поле "used".
Разница между "allocated" и "used" соответствует освобождённым объектам, доступным
для немедленного использования. Адрес в конце строки — это адрес пула, а следующее за ним
число — индекс пула, если он существует; если индекс не назначен, выводится -1.

Объём памяти, выделяемой на процесс, можно ограничить параметром командной строки "-m",
указав после него число мегабайт. Он охватывает всё адресуемое пространство процесса,
включая память некоторых библиотек и стек, но обеспечивает надёжное ограничение при
построении системы с ограниченными ресурсами. Он работает так же, как "ulimit -v" в системах,
где эта команда доступна, или "ulimit -d" в остальных.

Если выделить память не удалось из-за достижения лимита или из-за нехватки
памяти в системе, haproxy сначала освобождает все доступные объекты во всех пулах,
а затем снова пытается выделить память. Этот механизм освобождения неиспользуемой памяти можно
запустить, отправив процессу haproxy сигнал SIGQUIT.

При перезагрузке конфигурации процесс, перешедший в состояние плавной остановки, также автоматически
очищает память после освобождения каждого соединения, чтобы высвободить как можно больше памяти
для нового процесса.
