Ubuntu в Proxmox: кэш памяти и настройка для MotionEye
Почему Ubuntu в VM Proxmox показывает большой Cached и как управлять памятью для MotionEye: qemu-agent, ballooning, лимиты systemd, советы по диагностике.
Почему Ubuntu 20.04 на VM Proxmox не освобождает кэшированную память автоматически? Как правильно настроить управление памятью с MotionEye?
Описание проблемы:
На виртуальной машине Proxmox установлена Ubuntu 20.04.6 LTS (по официальному гайду MotionEye). Выделено до 80 ГБ RAM, но вся память постепенно уходит в кэш (Cached: ~75 ГБ). Память освобождается только после перезагрузки или команды sync; echo 3 > /proc/sys/vm/drop_caches. Периодическая очистка кэша скриптом кажется костылём — система должна освобождать память сама.
Информация о системе:
cat /etc/*-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=20.04
DISTRIB_CODENAME=focal
...
** /proc/meminfo:**
MemTotal: 80423084 kB
MemFree: 860228 kB
MemAvailable: 77430792 kB
Cached: 75890780 kB
...
free -m:
total used free shared buff/cache available
Mem: 78538 1256 794 839 76486 75620
Swap: 2047 12 2035
top (фрагмент):
top - 09:39:49 up 1 day, 16:57, 1 user, load average: 1,29, 1,19, 1,10
...
MiB Mem : 78538,2 total, 807,8 free, 1245,5 used, 76484,9 buff/cache
...
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
3673388 root 20 0 4231788 743308 37832 S 91,0 0,9 62:39.84 motion
...
Motion (процесс MotionEye) потребляет много CPU и памяти. MemAvailable высокая (~75 ГБ), но вся RAM в кэше. Как решить проблему правильно, без ручной очистки кэша?
Высокий Cached в Ubuntu на VM Proxmox — это чаще всего нормальный и ожидаемый результат: ядро Linux агрессивно использует свободную RAM под pagecache, а показатель MemAvailable (~77 ГБ) показывает, что памяти достаточно; принудительная очистка (sync; echo 3 > /proc/sys/vm/drop_caches) лишь временно освобождает кэш и снижает производительность. Чтобы решить проблему без постоянных «костылей», нужно настроить управление памятью на госте и хосте: включить ballooning и qemu‑guest‑agent, задать адекватный Minimum memory для VM, ограничить MotionEye через systemd/cgroups или Docker и, при необходимости, настроить KSM/параметры vm. Детальный план диагностики и шаги — ниже.
Содержание
- Почему Proxmox Ubuntu память остаётся закэшированной
- Как правильно настроить управление памятью Proxmox Ubuntu для MotionEye
- Очистить память Ubuntu: когда и как (не как костыль)
- Диагностика — что проверить прямо сейчас
- Пошаговый план действий — быстро и надёжно
- Источники
- Заключение
Почему Proxmox Ubuntu память остаётся закэшированной
Linux «съедает» свободную память под pagecache и считает это нормой: кэш ускоряет чтение/запись, и ядро освободит его мгновенно при реальной потребности. Поэтому строка Cached (~75 ГБ) сама по себе не означает утечку памяти — важнее значение MemAvailable (~77 ГБ), которое показывает, сколько RAM реально доступно для приложений.
Proxmox (GUI) и некоторые мониторинги могут отображать кэш как «используемую» память, что пугает — но это вопрос учёта, а не фактической нехватки RAM. См. обсуждение поведения ballooning/отчётов в ветке форума Proxmox: PVE showing high memory usage but VM is not.
Ещё одна распространённая причина: ballooning не может вернуть память хосту, если в настройках гостя Minimum memory равен Maximum. В таком случае «шариковый» драйвер не может сжать объём памяти гостя и кэш остаётся внутри VM — подробнее в обсуждении: RAM usage is not going down (VM cleared cache).
Итого: высокое Cached — нормальный симптом; но если хост реально испытывает нехватку памяти или Proxmox показывает “забитую” RAM — нужно настроить сотрудничество гостя и хоста (ballooning, guest agent), а также ограничить ресурсы тяжёлых процессов внутри гостя (MotionEye).
Как правильно настроить управление памятью Proxmox Ubuntu для MotionEye
Коротко: настроить взаимодействие хоста и гостя + контролировать память MotionEye. Ниже — подробности и команды.
-
Начните с фактов: сколько реально использует процесс motion?
Вашtopпоказывает RES ≈ 743 MB дляmotion. Это значит — сам процесс занимает <1 ГБ, а не 75 ГБ. Большая часть — pagecache, и он доступен системе. Так что проблема — не обязательно утечка памяти процесса, а учет кэша и поведение ballooning. -
Включите qemu-guest-agent в гостевой Ubuntu (обязательно для корректной работы ряда функций и лучшего взаимодействия с Proxmox):
- В госте:
sudo apt update && sudo apt install -y qemu-guest-agentsudo systemctl enable --now qemu-guest-agent- Проверьте статус:
systemctl status qemu-guest-agent
qemu-guest-agent не «освобождает» кэш сам, но даёт хосту более точную информацию о состоянии гостя и помогает корректно управлять ballooning.
- Включите и правильно настройте ballooning (Proxmox host):
- В веб-интерфейсе Proxmox: выберите VM → Hardware → Memory → добавьте/проверьте Balloon device и задайте Minimum memory меньше Maximum memory (например, под ваши нужды — несколько ГБ как минимум для ОС + MotionEye). Если Minimum = Maximum — сжатие памяти не сработает.
- В госте можно проверить модуль шарикового драйвера:
lsmod | grep virtio_balloon(подгрузить:sudo modprobe virtio_balloon).
Balloning позволит хосту вернуть неиспользуемую память от гостя, когда это потребуется.
- Ограничьте MotionEye/
motion, чтобы он не занимал непредсказуемые объёмы:
- Если установлен как системная служба (обычно это
motionилиmotioneye), примените systemd‑контроль ресурсов: sudo systemctl edit motion
В открывшемся файле добавьте:
[Service]
MemoryAccounting=yes
MemoryMax=1G
sudo systemctl daemon-reloadsudo systemctl restart motion
Это даст гарантию, что процесс не выйдет за допустимый предел. Проверьте имя службы командойsystemctl status motionилиsystemctl status motioneye.- Если вы используете Docker, запускайте контейнер с лимитом памяти:
docker run --memory=2g --memory-swap=2g ... ccrisan/motioneye:latest
Контейнеризация упрощает жёсткое ограничение ресурсов.
- Проверьте настройки MotionEye (буферы, разрешение, fps):
- Уменьшение разрешения/частоты кадров и количества буферов снижает удерживаемую память. Посмотрите параметры
framerate,width,height,stream_maxrate,pre_captureи т.п. в конфигурации motion/motioneye.
- Если нужен дедуп (KSM) и более агрессивное высвобождение на хосте:
- На Proxmox включите KSM (Kernel Samepage Merging) для экономии памяти между виртуальными машинами:
echo 1 | sudo tee /sys/kernel/mm/ksm/runи настройте параметрыpages_to_scan/sleep_millisecsпри необходимости. По умолчанию KSM стартует в условиях нехватки памяти; детали — обзор оптимизации памяти в Proxmox.
KSM помогает только если у вас много похожих страниц в разных VM.
- Если после удаления файлов внутри гостя хост всё ещё “видит” занятость — выполните fstrim (особенно на thin/SSD/ZFS):
- В госте:
sudo fstrim -av
На форуме встречается кейс, когда послеfstrim -avи перезагрузки Proxmox корректно пересчитала использование памяти/диска: RAM Usage Ubuntu 20.04.
Очистить память Ubuntu: когда и как (не как костыль)
Стоит ли ставить cron с echo 3 > /proc/sys/vm/drop_caches? Нет — обычно не стоит. Это убирает pagecache/dentries/slab, но и уничтожает выигрыш в производительности: данные, которые могли быть быстро прочитаны из RAM, придётся читать с диска.
Если всё же нужно временно очистить кэш для отладки:
sudo sync && sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches'
Используйте это только как диагностический шаг или в редких сценах обслуживания. Подробно о назначении и видах очистки — статья с командами: Настройка ядра Linux — очистка кэша.
Диагностика — что проверить прямо сейчас
Быстрая шпаргалка команд и что они покажут:
-
Общая картина памяти:
-
free -h -
cat /proc/meminfo | egrep "MemTotal|MemFree|MemAvailable|Cached" -
Процессы по использованию RSS:
-
ps aux --sort=-rss | head -n 15— реально занимаемая RAM процессами. -
Проверить, не использует ли Motion tmpfs/ramdisk:
-
mount | grep tmpfs -
df -h | grep tmpfs -
Проверить сервисы гостя:
-
systemctl status qemu-guest-agent -
lsmod | grep virtio_balloon -
Посмотреть, куда пишет Motion и какие параметры:
-
journalctl -u motion -n 200или логи motion (/var/log/motion*) -
Уточнить конфигурацию VM на хосте:
-
В GUI Proxmox: Hardware → Memory (Balloon device), Options → Minimum memory
-
Через CLI: посмотрите
qm config <VMID>(в Proxmox) для подтверждения настроек памяти. -
(Опционально) изучить распределение страниц по процессам:
-
pmap -x <pid>— карта памяти процесса.
Эти проверки обычно быстро покажут: реальная нагрузка process‑level или же классическая страница кэша.
Пошаговый план действий — быстро и надёжно
- Убедитесь, что проблема — отображение кэша, а не OOM:
free -h→ если MemAvailable ≫ реальной потребности — тревоги нет.
- Установите и включите qemu-guest-agent в госте:
sudo apt update && sudo apt install -y qemu-guest-agentsudo systemctl enable --now qemu-guest-agent
- В Proxmox добавьте balloon device и установите Minimum memory меньше Maximum:
- Через GUI: VM → Hardware → Add → Balloon Device; VM → Options → Minimum memory = N GB.
- После изменения проверьте, что модуль в госте загружен:
lsmod | grep virtio_balloon.
- Ограничьте MotionEye:
- Через systemd (пример 1G лимита):
sudo systemctl edit motion→ добавить:
[Service]
MemoryAccounting=yes
MemoryMax=1G
sudo systemctl daemon-reload&&sudo systemctl restart motion- Или контейнеризируйте/запустите в Docker с
--memory.
- Проверьте и измените, если нужно, параметры I/O и tmpfs:
- Убедитесь, что Motion не хранит тонны данных в tmpfs; перенесите временные файлы на диск.
- Только при необходимости: включите KSM на хосте и отрегулируйте:
echo 1 | sudo tee /sys/kernel/mm/ksm/run- (тюнинг:
pages_to_scan,sleep_millisecs)
- Не используйте
drop_cachesрегулярно; вместо этого:
- Наблюдайте. Если нужно кратковременно очистить кэш для теста:
sudo sync && sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches'
- Мониторинг:
- Настройте простые оповещения на Proxmox (Datacenter → Metrics) и следите за Swap, OOM и Load. Если swap активно используется — это уже повод менять swappiness/память.
Если после всех шагов хост всё равно «не видит» освобождённой памяти — сделайте fstrim -av в госте и перезагрузку VM как диагностический шаг (в одном из обсуждений это помогло): RAM Usage Ubuntu 20.04.
Источники
- https://forum.proxmox.com/threads/pve-showing-high-memory-usage-but-vm-is-not.113463/
- https://forum.proxmox.com/threads/ram-usage-ubuntu-20-04.113374/
- https://forum.proxmox.com/threads/ram-usage-is-not-going-down-vm-cleared-cache.90043/
- https://github.com/home-assistant/operating-system/issues/2999
- https://github.com/motioneye-project/motioneye/issues/2131
- https://www.reddit.com/r/Proxmox/comments/1mk69rf/excessive_memory_usage_on_proxmox_9/?tl=ru
- https://habr.com/ru/companies/otus/articles/566970/
- https://bafista.ru/optimizacziya-operativnoj-pamyati-v-proxmox/
Заключение
В двух словах: высокое Cached на Ubuntu в VM Proxmox — обычно не баг, а фича ядра; MemAvailable показывает, что памяти много и всё доступно. Решение без «костылей» сводится к трём вещам: обеспечить корректное взаимодействие гостя и хоста (qemu‑guest‑agent + ballooning), ограничить ресурсы MotionEye (systemd/cgroups или Docker), и — опционально — настроить KSM/trim/параметры vm. Только после этих шагов ручная периодическая очистка кэша перестанет быть «необходимостью», и система будет вести себя предсказуемо.