Высокое использование памяти, которое невозможно отнести к какой-либо службе или приложению

Высокое использование памяти, которое невозможно отнести к какой-либо службе или приложению

В 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 не может учесть всю используемую память процессами/потоками. Следовательно, весьма вероятно, что оставшаяся память используется ядром для операций файловой системы.

Вероятные причины

В настоящее время мне известны три основные причины чрезмерного использования памяти файловой системы:

  1. Кэш ZFS ARC (или аналогичный кэш файловой системы, который регистрируется как «нормальное» использование памяти)
  2. Ramdisks ( tmpfsи подобные файловые системы)
  3. Собственное сжатие файловой системы в сочетании с избыточным дисковым вводом/выводом (в результате чего сжатие/повторное сжатие происходит с постоянным потреблением памяти)

Для устранения этих трех сценариев я бы рекомендовал следующее:

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 ГБ.sharedfree

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

Связанный контент