Вопрос или проблема
Я использую Ubuntu 20.04.2 LTS с ядром 5.4.0-70-generic. Общая память продолжает накапливаться, пока система не зависнет, так как не остаётся свободной памяти.
Я использую Prometheus + Grafana для мониторинга ресурсов системы, и из их графиков видно, что требуется примерно 4-7 дней с момента перезапуска, пока общая память не достигнет 20 ГБ. Но на этом не останавливается, она продолжает расти, пока я не сделаю другой перезапуск.
Такое же количество использования общей памяти можно увидеть с помощью команды free -h
.
Использование tmpfs, похоже, низкое:
Общая память продолжает расти, даже если я закрываю все приложения и не использую компьютер. Какова может быть причина такого поведения? Как мне начать исследование проблемы? Как я могу выяснить, какие процессы используют так много общей памяти?
$ ipcs -m --human
------ Сегменты общей памяти --------
key shmid owner perms size nattch status
0x00000000 3145729 martsraits 600 256M 2 dest
0x00000000 2588677 martsraits 600 512K 2 dest
0x00000000 1245191 martsraits 600 512K 2 dest
0x00000000 5832713 martsraits 600 512K 2 dest
0x00000000 10 martsraits 600 512K 2 dest
0x00000000 1212427 martsraits 600 512K 2 dest
0x00000000 12 martsraits 600 512K 2 dest
0x00000000 1212429 martsraits 600 64M 2 dest
0x00000000 32785 martsraits 600 512K 2 dest
0x00000000 2064402 martsraits 600 512K 2 dest
0x00000000 5537814 martsraits 600 512K 2 dest
0x00000000 1114138 martsraits 600 512K 2 dest
0x00000000 8945695 martsraits 600 23,3K 2 dest
0x00000000 1507360 martsraits 600 512K 2 dest
0x00000000 2916388 martsraits 600 512K 2 dest
0x00000000 4816933 martsraits 606 8,2M 2 dest
0x00000000 4816934 martsraits 606 8,2M 2 dest
0x00000000 4816935 martsraits 600 128M 2 dest
0x00000000 3670057 martsraits 600 512K 2 dest
0x00000000 3309611 martsraits 600 512K 2 dest
0x00000000 1441844 martsraits 600 512K 2 dest
0x00000000 2555960 martsraits 600 8M 2 dest
0x00000000 917564 martsraits 600 512K 2 dest
0x00000000 3899453 martsraits 600 512K 2 dest
Сумма столбца размера в ipcs -m
составляет всего 500M.
Я только что столкнулся с этим на встроенной системе, и моей проблемой был tmpfs
– в частности, там хранятся журналы (мне нужно это изменить), и они занимали слишком много оперативной памяти. И да, в выводе free
это показывалось как использование общей памяти.
Ответ или решение
Увеличение использования общей памяти на Ubuntu 20.04.2 LTS: Причины и решения
Использование общей памяти в вашей системе, работающей на Ubuntu 20.04.2 LTS с ядром 5.4.0-70-generic, зашкаливает, что может привести как к замедлению работы системы, так и к её зависанию. Приведенные вами данные и описанные симптомы могут указывать на потенциальные проблемы с управлением памятью, которые нужно тщательно исследовать.
Понимание проблемы
Общая память (шареная память) активно используется для межпроцессного общения (IPC), и при её неправильном использовании может возникнуть утечка памяти. Судя по вашим наблюдениям:
- Нарастание использования памяти: За 4-7 дней ваш системный мониторинг фиксирует рост использования общей памяти до 20 ГБ и более.
- Низкое использование tmpfs: С вашего вывода видно, что использование tmpfs невысокое, что указывает на то, что проблема не в кэше временных файлов.
- Показатели команды ipcs: Полученные данные показывают, что суммарный объем памяти, используемой сегментами общей памяти, составляет всего 500 МБ, что не соответствует вашим наблюдениям о 20 ГБ и более.
Эта разница может указывать на другие источники нагрузки, такие как ошибки в приложениях или системные процессы, использующие память неэффективно.
Шаги для диагностики и устранения
-
Проверка сегментов общей памяти:
Используйте командуipcs -m
для проверки всех сегментов общей памяти. Обратите внимание наnattch
(количество прикреплений) и статус сегментов. Если вы видите много сегментов с ненужными данными, попробуйте их освобождать. -
Мониторинг процесса:
Запуститеtop
илиhtop
, чтобы отследить процессы, которые могут потреблять память. Вы также можете использовать командуpmap <PID>
для детального анализа использования памяти конкретным процессом. Оцените процессы, которые потребляют большое количество памяти, и исследуйте, возможно ли их оптимизировать. -
Логи в tmpfs:
Если у вас есть подозрения, что логи сохраняются в tmpfs и приводят к увеличению использования памяти, выявите их. Возможно, ваше приложение создает слишком много логов. Рассмотрите возможность использования файловой системы на диске для их хранения вместо памяти. -
Тестирование утечек памяти:
Используйте инструменты для диагностики утечек памяти, такие какvalgrind
, если вы разрабатываете приложения, илиsystemd-analyze blame
для выявления зависших служб. -
Обновление ядра и пакетов:
Убедитесь, что ваша система и ядро обновлены. Обновления могут включать исправления для известных проблем с памятью. -
Настройки системы:
Проверьте настройки вашего сервера. Возможно, параметры, такие какvm.overcommit_memory
, изменяют поведение распределения памяти. Настройте эти параметры в соответствии с рекомендациями для вашей архитектуры работы.
Заключение
Увеличение использования общей памяти может быть результатом утечек, ошибок конфигурации, неэффективных процессов или неправильного управления логами. Вам необходимо провести комплексный подход к анализу состояния вашей системы. Применяя предложенные шаги, вы сможете выявить источники проблемы и устранить их, обеспечив стабильную работу вашего окружения. Безусловно, системное администрирование требует регулярного мониторинга и оптимизации для поддержания производительности на высоком уровне.