Проблемы с потреблением памяти в RHEL 8.6: диагностика и решения
В настоящее время у нас имеется 342 машины с установленной ОС RHEL 8.6, и мы столкнулись с заметной проблемой: сервис systemctl
показывает довольно высокий расход памяти, превышающий фактическое использование памяти самим процессом. В данной статье мы подробно рассмотрим эту ситуацию и предложим несколько решений.
Наблюдаемые симптомы
При использовании команды systemctl status presto.service
мы видим, что сервис presto.service
(Perforce Server) указывает на потребление памяти на уровне 298.1G, несмотря на то, что основной PID (идентификатор процесса) фактически затрачивает всего около 32G.
systemctl status presto.service
● presto.service - Perforce Server
.
.
.
Main PID: 3683651 (presto-server)
Tasks: 284 (limit: 3297083)
Memory: 298.1G
CGroup: /system.slice/presto.service
Сама Presto PID можно проверить с помощью команды:
more /sys/fs/cgroup/memory/system.slice/presto.service/memory.usage_in_bytes
31329787904 --> ~32G
Также можно использовать команду ps aux --sort=-%mem | head
для проверки потребления памяти процессом presto
.
Причины высокого потребления памяти
Значительное расхождение между показами systemctl
и фактическим потреблением памяти может быть связано с неправильным управлением ресурсами в данной конфигурации системы. Важно понимать, что systemctl
может отслеживать общее потребление ресурсов процесса, включая все дочерние процессы и дополнительные операции, которые могут требовать больше памяти.
Решение проблемы: ограничение потребления памяти
Чтобы справиться с данной ситуацией, можно установить ограничения на максимальное и высокое потребление памяти для сервиса. Ниже приведен пример конфигурации сервиса, который позволяет задать такие лимиты:
[Service]
User=presto
Group=presto_group
MemoryMax=64000M
MemoryHigh=60000M
Конфигурация сервиса
Мы также можем обратить внимание на конфигурацию самого сервиса presto.service
, чтобы убедиться, что она корректна. Примеры команд для его настройки приведены ниже:
# Тип должен быть всегда установлен на "forking" для поддержки
# нескольких процессов Perforce:
Type=forking
# Команда для запуска Perforce:
ExecStart=/home/presto/server/bin/launcher start
ExecStop=/home/presto/server/bin/launcher stop
Restart=always
RestartSec=30s
StartLimitInterval=0
StartLimitBurst=5
RemainAfterExit=no
LimitNOFILE=65536
[Install]
# Описывает целевой объект для этого сервиса -- это всегда
# будет 'multi-user.target':
WantedBy=multi-user.target
Дополнительные проверки
Для более детального анализа потребления памяти можно использовать команду:
more /sys/fs/cgroup/memory/memory.stat
На данном этапе вы можете наблюдать за различными метриками и показателями, которые могут обеспечить дополнительную информацию о том, почему происходит такое значительное расхождение в потреблении памяти.
Заключение
Высокое потребление памяти, отображаемое systemctl
, в контексте RHEL 8.6 может быть признаком неправильной конфигурации или управления ресурсами. Путем установки соответствующих ограничений на память и тщательной проверки конфигурации сервиса можно добиться стабилизации работы и снижению потребления ресурсов. Если у вас остались вопросы или возникли новые проблемы, не стесняйтесь обращаться за дополнительной поддержкой.