Varnish использует значительно больше памяти, чем кэш?

Я использую лак в качестве веб-кеша. Я использую RHEL 9.2. Мой кэш имеет размер 1 ГБ. Мой процесс лакирования использует память 3,7 ГБ.

$ ps -p 1163  -o %mem,rss
%MEM   RSS
15.7 3886108

Я запускаю лак с аргументом -s malloc,1024M, который должен установить размер кэша 1 ГБ. Полная команда, вызываемая systemd, выглядит так:

/usr/sbin/varnishd -a 127.6.6.6:7480 -f /etc/varnish/default.vcl -S /etc/varnish/secret -s malloc,1024M -P /var/run/varnish.pid -T 127.6.6.6:62

Кажется, это работает, я вижу с помощью varnishstat:

$ varnishstat -1 | grep s0.g
SMA.s0.g_alloc                            22573          .   Allocations outstanding
SMA.s0.g_bytes                       1073105012          .   Bytes outstanding
SMA.s0.g_space                           636812          .   Bytes available

Мне трудно поверить, что для кэша объемом 1 ГБ требуются 2,7 ГБ накладных расходов. Что мне здесь не хватает?

Перезапуск с помощью systemctl restart varnish временно снижает использование (поскольку при этом очищается кеш, но также исчезает некэш-память), но постепенно оно снова увеличивается и достигает 3,7 ГБ.

Это тестовая система под довольно большой нагрузкой. Возможно ли, что эта память действительно используется для обслуживания запросов? Я вижу это в переходном пространстве, на мой взгляд это выглядело неинтересно, но после прочтения некоторых других тем, возможно, так оно и есть.

SMA.Transient.c_req                     9720800         7.90 Allocator requests
SMA.Transient.c_fail                          0         0.00 Allocator failures
SMA.Transient.c_bytes              324751584558    263852.57 Bytes allocated
SMA.Transient.c_freed              324751584558    263852.57 Bytes freed
SMA.Transient.g_alloc                         0          .   Allocations outstanding
SMA.Transient.g_bytes                         0          .   Bytes outstanding
SMA.Transient.g_space                         0          .   Bytes available

Я также видел несколько предположений, что лак предназначен для использования с jemalloc, у меня не установлен jemalloc, похоже, что лак использует malloc glibc.

РЕДАКТИРОВАНИЕ: Полный вывод лакстата -1 можно найти здесь: https://pastebin.com/3uZ1kpy6 , а лакадм param.show здесь: https://pastebin.com/7jrLKdMx. На момент создания дампа статистики использование памяти составляло 3 ГБ.

ps -p 917285   -o %mem,vsz,rss
%MEM    VSZ   RSS
12.8 7278920 3136620
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
175
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

malloc Хранение кэша представляет собой лишь часть потребления памяти Varnish.

Временное хранение

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

К вашему сведению: параметр времени выполнения shortlived определяет, что такое кратковременный контент, и по умолчанию равен 10 секундам.

Потоки

Существует также стоимость использования Varnish. Для каждого потока происходит некоторое распределение памяти.

Количество потоков ограничено параметрами времени выполнения thread_pool_min и thread_pool_max для каждого пула потоков. По умолчанию эти значения составляют минимум 100 и максимум 5000 на пул потоков.

Поскольку существует 2 пула потоков (как определено thread_pools), оно будет находиться в диапазоне от 200 до 1000, если вы полагаетесь на значения по умолчанию.

Параметр времени выполнения workspace_thread определяет начальный объем памяти, потребляемый каждым потоком. Значение по умолчанию — 2 КБ.

Потребляется больше памяти рабочей области

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

Если поток используется для управления сеансом TCP, и по умолчанию потребляется дополнительно 0,75 КБ памяти, как определено параметром времени выполнения workspace_session.

Если поток используется для обработки HTTP-запроса, по умолчанию используется 96 КБ памяти, как определено параметром времени выполнения workspace_client.

А для серверных запросов потребление памяти определяется параметром времени выполнения workspace_backend, который по умолчанию также равен 96 КБ.

Тюнинг

Если вы изменили какой-либо из упомянутых мной параметров времени выполнения, это повлияет на общее потребление памяти.

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

Но также иметь достаточно памяти для обработки всей логики, указанной вами в файле VCL.

Альтернативным решением является Massive Storage Engine , который является частью Varnish Enterprise, коммерческой версии Varnish. Он имеет функцию под названием Регулятор памяти, которая позволяет ограничивать общее потребление памяти Varnish и автоматически масштабировать размер кэша в зависимости от требуемой памяти во время выполнения.

Спасибо за подробности. Хотя я не уверен, что это объясняет то, что я вижу. Чтобы предоставить дополнительную информацию, у меня 200 тем. «varnishstat», как показано выше, показывает, что я использую 1 ГБ в кеше malloc и 0 во временном пространстве. Так откуда же взялись эти дополнительные 2,7 ГБ? Я заметил, что когда я снял нагрузку, использование памяти также остается высоким. Такое ощущение, что у меня какие-то неправильные настройки конфигурации.

Alex 03.05.2024 10:42

Я также должен отметить, что после обновления с 4.0.5 до 6.6.2 ситуация кардинально изменилась. Перед обновлением мы использовали в общей сложности около 1,3 ГБ для поддержки кэша объемом 1 ГБ.

Alex 03.05.2024 14:58

@ Алекс 200, у тебя очень мало потоков. Я не вижу причин, по которым varnishd потреблял бы так много памяти. Не могли бы вы прикрепить полный вывод varnishstat -1 к своему вопросу и полному файлу VCL? Конечно, вам нужно собирать статистику, когда происходит высокое потребление памяти. Пожалуйста, также прикрепите выходные данные varnishadm param.show, чтобы увидеть, какие параметры времени выполнения вы используете. Я хотел бы получить полную картину.

Thijs Feryn 03.05.2024 17:00

Я обновил исходное сообщение, добавив полный вывод лакстата и команду лакаадм. Большое спасибо за ваши постоянные советы.

Alex 03.05.2024 19:04

@Алекс, я только что разговаривал с нашими разработчиками, и они посоветовали бы тебе отключить «прозрачные огромные страницы» в ядре Linux. Дополнительную информацию см. на странице docs.varnish-software.com/varnish-enterprise/installation/…. jemalloc тоже может быть связано. Какую версию Варниша вы используете?

Thijs Feryn 07.05.2024 08:11

Я использую лак-6.6.2, установленный через RPM прямо из ISO-образа RHEL9. Я перезагрузил одну из наших систем после отключения прозрачных огромных страниц, которые выглядели многообещающе, однако, к сожалению, использование памяти осталось неизменным. Кажется (согласно: bugzilla.redhat.com/show_bug.cgi?id=1656034), что версия лака для RHEL компилируется без jemalloc. Возможно, мне стоит попробовать пересобрать с помощью jemalloc?

Alex 07.05.2024 11:23

@Alex Пожалуйста, установите Varnish из packagecloud.io/varnishcache. Имейте в виду, что версия 6.6 — это EOL. Либо используйте 6.0 LTS, либо 7.5. Я не уверен, что это включает поддержку jemalloc из коробки, но попробовать стоит.

Thijs Feryn 07.05.2024 17:18

Спасибо за предложение. Я установил версию 6.0.13 и jemalloc (подозреваю, что это было необходимо, ldd показывает, что он связан с лаком). Использование памяти для кэша объемом 1 ГБ снизилось с ~3,7 ГБ до ~2 ГБ. Это потрясающее улучшение, мне действительно интересно, что происходит с версией RHEL9. Скорее всего, я подниму с ними заявку в службу поддержки. Большое спасибо за вашу помощь в этом.

Alex 07.05.2024 18:43

@Алекс, несколько заключительных советов: если можете, попробуйте установить Varnish Cache 7.5 и посмотреть, есть ли еще улучшения. Синтаксис VCL и поведение Varnish должны быть совместимы.

Thijs Feryn 08.05.2024 10:38

Другие вопросы по теме