
В Ubuntu 22.04 у меня возникла странная проблема с памятью. Я не могу понять, почему использование памяти так велико. Когда я загружаю свой ноутбук, использование памяти соответствует ожидаемому, но со временем что-то, похоже, съедает мою память, но система, похоже, не знает, для чего она используется.
После того, как ноутбук проработал пару дней и спал ночью, free -m
появились следующие сообщения:
total used free shared buff/cache available
Mem: 14812 7329 2683 1810 4799 5348
Swap: 2047 416 1631
Все заявки были закрыты, и согласноэтот инструментнакопленная память, используемая всеми приложениями, составляет 1,7 ГиБ. Так что же использует последние ~5,5 ГиБ (7,2-1,7)?
Я что-то пропустил?
решение1
Этот ответ написан в попытке устранить возможные причины «неучтенного» использования памяти, которые могут выходить за рамки того, с чем сталкивается OP.
Фон
В Linux использование памяти можно в основном объяснить двумя факторами:
- Использование процессами/потоками
- Использование файловой системой
В случае этого вопроса OP не может учесть всю используемую память процессами/потоками. Следовательно, весьма вероятно, что оставшаяся память используется ядром для операций файловой системы.
Вероятные причины
В настоящее время мне известны три основные причины чрезмерного использования памяти файловой системы:
- Кэш ZFS ARC (или аналогичный кэш файловой системы, который регистрируется как «нормальное» использование памяти)
- Ramdisks (
tmpfs
и подобные файловые системы) - Собственное сжатие файловой системы в сочетании с избыточным дисковым вводом/выводом (в результате чего сжатие/повторное сжатие происходит с постоянным потреблением памяти)
Для устранения этих трех сценариев я бы рекомендовал следующее:
1. Кэш ZFS ARC
Выполните эту команду, чтобы получить подробную информацию о кэше ZFS ARC:
arcstat -a
Статистика, представленная в отчете, size
будет отображаться как обычный объем использованной памяти.
Из вашего поста очевидно, что здесь используется 0,5 ГБ.
2. Рамдиски
Выполните эту команду, чтобы получить информацию о текущих tmpfs
виртуальных дисках файловой системы:
df -hl -t"tmpfs"
Любой объем, указанный в отчете, used
будет отображаться как обычный объем использованной памяти.
Ubuntu (и многие другие варианты Linux) имеют ramdisk по умолчанию в /dev/shm
. Приложения могут использовать это пространство, и поэтому вы можете легко проверить это с помощью:
ls -ahl /dev/shm
Кроме того, в выходных данных tmpfs
также отображается использование , поэтому из вашего сообщения очевидно, что здесь используется 1,8 ГБ.shared
free
3. Сжатие ФС
Проверьте наличие дискового ввода-вывода с помощью этой команды: ( iostat
является частью пакета sysstat
)
iostat
Объедините это со знаниями о включенном сжатии файловой системы для соответствующих дисков. Для ZFS выполните эту команду, чтобы получить свойства сжатия для всех Zpools и наборов данных:
zfs get compression
Если у вас высокий уровень дискового ввода-вывода в сочетании с включенным собственным сжатием, это может привести к тому, что избыточный объем памяти будет отображаться как обычный используемый объем памяти.
решение2
Используете ли вы сжатие в своей файловой системе или файловую систему с копированием при записи, такую как BTRFS или ZFS?
Возможно, чрезмерное использование памяти вызвано тем, что ядро пытается (пере)сжать файлы в реальном времени или копирует/версионирует каждую запись, когда большие файлы часто изменяются.
Нехватка памяти становится особенно заметной, если у вас есть большие файлы, такие как образы для виртуальных машин, где файлы часто меняются и имеют размер в гигабайтах, а не в мегабайтах.
Вы можете рассмотреть возможность отключения сжатия на уровне файловой системы/подтома/тома или на уровне отдельных файлов и/или отключения COW (копирование при записи).
БТРФС:
Поддерживается удаление сжатия для определенных файлов с помощью команда btrfs:
property set <file> compression none
чтобы удалить COW (копирование при записи) для определенной папки:
chattr -R +C /directory/of/your/vm_images/
ЗФС:
Я не верю, что можно убрать сжатие для отдельных файлов. Отключение сжатия для тома повлияет только на будущие записи, поэтому вам нужно будет скопировать каждый файл по отдельности, чтобы отключить сжатие для файлов.
zfs set compression=off name_of_zfs_vol