- В Linux вся доступная оперативная память используется для кэширования и страничного кэша, поэтому недостаток свободной памяти не обязательно означает наличие проблемы.
- Сочетание swap, zram/zswap и правильной настройки vm.swappiness позволяет сбалансировать производительность и стабильность.
- cgroup v2, systemd-oomd и такие инструменты, как earlyoom или nohang, обеспечивают точный контроль над нехваткой памяти и событиями нехватки памяти.
- Мониторинг с помощью free, vmstat, htop, sar или Glances имеет решающее значение для выявления узких мест и оптимизации управления памятью.
Если вы управляете системами, работаете с контейнерами или обслуживаете производственные серверы, глубокое понимание управления памятью в Linux больше не является необязательным. Это разница между сервером, который без проблем справляется с пиковыми нагрузками, и сервером, который испытывает трудности, переходит в режим перегрузки или в итоге вызывает печально известный OOM killer в самый неподходящий момент.
Linux разработан для максимально эффективного использования оперативной памяти: он кэширует файлы, сжимает страницы, перемещает данные в файл подкачки и расставляет приоритеты для процессов в соответствии с очень точными правилами. Со стороны может показаться, что он «потребляет много памяти» или что «свободной оперативной памяти никогда нет», но на самом деле он стремится обеспечить максимальную производительность и стабильность . Давайте шаг за шагом и с помощью простых объяснений рассмотрим, как всё это работает и как можно тонко настроить систему более сложными способами.
Основные понятия и мифы о памяти в Linux

Прежде чем возиться с параметрами ядра или бездумно монтировать zram, полезно иметь четкое представление о типах памяти, архитектуре и о том, как система воспринимает оперативную память.
Максимальный объем физической памяти, который может обрабатывать компьютер, определяется операционной системой и архитектурой процессора. 32-битная система обычно ограничена 4 ГБ оперативной памяти, в то время как 64-битная система может легко обрабатывать десятки или сотни гигабайт (теоретически, гораздо больше, хотя фактическое ограничение накладывается аппаратными возможностями).
В Linux вся память управляется как виртуальная . Это включает в себя как физическую оперативную память, так и пространство подкачки. Оперативная память не может быть «расширена», за исключением добавления физических модулей, но виртуальную память можно расширить с помощью диска (разделов или файлов подкачки) и продвинутых механизмов, таких как zram или zswap.
La физическая память (ОЗУ) Это быстрый и дорогостоящий ресурс: именно туда загружаются процессы, библиотеки, файловые кэши, буферы ввода-вывода, разделяемая память и т. д. В Linux очень четкая философия: если есть свободная оперативная память, лучше использовать ее в качестве кэша и ускорять доступ, чем оставлять ее пустой. Вот почему в таких инструментах, как Linux, часто встречается мало «свободной» памяти. free Это не значит, что у вас есть проблема.
Дисковая память ( постоянное хранилище) работает гораздо медленнее. В то время как оперативная память реагирует за наносекунды, даже SSD-накопитель реагирует за микросекунды или миллисекунды. Именно поэтому система старается хранить часто используемые данные в оперативной памяти и обращается к диску только в случае крайней необходимости: при загрузке исполняемых файлов, чтении «холодных» данных или подкачке страниц.
Виртуальная память, страницы и внутренние структуры ядра
Виртуальная память — это механизм, с помощью которого Linux предоставляет каждому процессу собственное изолированное и защищенное адресное пространство . Аппаратное обеспечение и ядро преобразуют виртуальные адреса в физические адреса посредством структур, называемых таблицами страниц.
Наименьшая единица, используемая для управления памятью, — это страница , обычно размером 4 КБ. Вся система виртуальной памяти построена на страницах: они выделяются, освобождаются, загружаются в файл подкачки, кэшируются и помечаются различными правами доступа (только для чтения, для выполнения и т. д.).
Таблицы страниц — это иерархические структуры, поддерживаемые ядром. Для каждой виртуальной страницы каждого процесса они хранят местоположение фактической физической страницы (если она существует), её права доступа и текущее состояние. Такое преобразование позволяет изолировать процессы, совместно использовать страницы и напрямую отображать файлы в память.
Когда процесс обращается к допустимому адресу, но страница еще не готова к доступу, происходит ошибка страничного доступа (page fault ). Это может быть «легкая» ошибка (страница находится в оперативной памяти, но в состоянии, требующем обновления) или «дорогостоящая» ошибка (страница находится на диске, в файле подкачки или в файле и должна быть загружена в оперативную память). Если ошибки страничного доступа происходят часто, система замедляется, поскольку тратит слишком много времени на чтение с диска.
Кэш страниц — это кэш страниц файлов, поддерживаемый ядром. Он хранит данные и метаданные для файлов и каталогов, чтобы уменьшить количество обращений к диску. Это одна из причин, почему Linux «кажется», что использует всю оперативную память: на самом деле он использует память, которую приложения активно не используют, чтобы ускорить доступ к диску.
Типы памяти: файловая, анонимная и их связь с файлом подкачки.
В Linux обычно различают файловую память и анонимную память . Обе находятся в оперативной памяти, но их происхождение и возможность резервного копирования на диск различны.
Вызов память файла Это та, которая поддерживается системными файлами: исполняемыми двоичными файлами, разделяемыми библиотеками, сопоставленными данными. mmap из файла и т. д. При необходимости освободить место в памяти можно удалить данные из исходного файла и загрузить их заново.
La анонимная память Это всё, что резервирует процесс, не привязанное к файлу: динамическая куча, стек, приватные области. MAP_ANONYMOUSа также области, копируемые механизмом «копировать при записи» при выполнении fork()Эта память существует только в оперативной памяти (или в файле подкачки, если она перемещена), и её единственное возможное резервное копирование — это именно это пространство подкачки.
Когда ядру необходимо освободить оперативную память, оно сначала пытается освободить страницы, которые можно собрать заново: как правило, страницы из кэша страниц или областей, поддерживаемых файлами. Только когда места больше нет или давление на память очень велико, оно начинает загружать анонимную память в файл подкачки , что гораздо дороже, но дает системе передышку.
Нехватка памяти, сбои и OOM killer
Проблема нехватки памяти возникает , когда количество свободных страниц падает ниже определенных внутренних пороговых значений. В этом случае ядро вынуждено постоянно работать над освобождением памяти: очищать кэш, записывать «измененные» страницы на диск, вытеснять редко используемые страницы и так далее.
Высокая нагрузка на память может проявляться очень очевидными симптомами: высокая задержка в работе веб-сервисов , медленная работа графических интерфейсов, задержки в ответах от удаленных сессий (SSH, VNC, RDP), прерывистая работа мыши, окна, реагирующие с задержкой в несколько секунд и т. д. В этот момент система больше сосредоточена на выживании, чем на выполнении полезной работы.
Проблема «трэшинга» возникает , когда оперативной памяти недостаточно для хранения страниц, которые постоянно используются процессами. Ядро начинает непрерывно обмениваться страницами: оно вытесняет одну, чтобы вставить другую, но затем немедленно нуждается в только что вытесненной странице. В результате возникает цикл ошибок страниц и обращений к диску, что ухудшает производительность.
При включенном файле подкачки происходит постоянное перемещение анонимных страниц между оперативной памятью и пространством подкачки, что приводит к перегрузке диска. Без файла подкачки проблема смещается на страницы файлов: они многократно удаляются и загружаются из файловой системы, что также может сделать машину практически непригодной для использования.
Если ядро по-прежнему не может получить доступ к свободной памяти, вступают в действие следующие механизмы: Механизм нехватки памяти (Out-of-Memory, OOM)Когда исчерпаны все возможности для удаления, сжатия или обмена данными, ядро вычисляет оценку для каждого процесса.oom_scoreи решает, кого из них принести в жертву. Этот процесс завершается OOM killer чтобы освободить значительный объем оперативной памяти и избежать полного сбоя.
Своп: что это такое, сколько нужно вложить и почему это не "дьявольская штука"
Память подкачки имеет плохую репутацию, отчасти из-за устаревших рекомендаций и упрощений, таких как «если у вас много оперативной памяти, вам не нужна подкачка». В действительности, пространство подкачки является ключевым компонентом архитектуры памяти Linux, даже в системах с большим объемом оперативной памяти.
Файл подкачки (Swap) — это область на диске (разделе или файле), которую ядро использует для хранения неактивных страниц памяти . Это позволяет освободить оперативную память для процессов, которым она действительно необходима. Это не виртуальная память как таковая, а один из механизмов, обеспечивающих её работу.
Без файла подкачки анонимным страницам некуда деваться при увеличении нагрузки на память. Ядро по-прежнему может полагаться на кэши и страницы, хранящиеся в файлах, но как только объем анонимной памяти становится критически высоким, оно практически вынуждено вызывать OOM killer гораздо раньше. Технически Linux может функционировать без файла подкачки, но на практике это ненужный риск в большинстве сценариев.
Что касается определения размера пространства подкачки, единого рецепта не существует, но есть несколько довольно разумных современных критериев, зависящих от назначения компьютера:
- Серверы без режима гибернацииОбычно 4-8 ГБ пространства подкачки достаточно в качестве буфера, даже при большом объеме оперативной памяти. Для ресурсоемких сервисов (базы данных, виртуализация) его можно увеличить в 1,5 раза по сравнению с объемом оперативной памяти, но приоритет следует отдавать увеличению физической оперативной памяти.
- Рабочие столы без режима гибернацииПри наличии 16 ГБ оперативной памяти и более, 2-4 ГБ файла подкачки более чем достаточно в качестве запаса прочности.
- Устройства с возможностью перехода в спящий режимОбъем файла подкачки должен быть равен или немного больше объема оперативной памяти, поскольку при переходе в спящий режим система выгружает в него все содержимое памяти.
Создание пространства подкачки очень гибкое. Вы можете использовать выделенный раздел или файл подкачки . Файл подкачки идеально подходит, если ваш диск уже разбит на разделы или вы хотите изменить его размер без перенастройки всей системы.
Показатели использования памяти: free, vmstat, ps, RSS, PSS и другие.
Классические инструменты управления памятью Linux могут приводить к неправильной интерпретации, если вы не знаете, что означает каждый столбец. Команда free -h Это самый простой способ с первого взгляда увидеть общий объем памяти, используемую память, свободную память, кэш и файл подкачки.
На выходе из free Ключевым моментом является анализ строки, в которой вычитаются буферы и кэш, поскольку этот столбец указывает на следующее: память, фактически занятая процессами, не считая того, что ядро использует в качестве кэша и что оно может быстро освободить при необходимости.
В лице vmstat -s -S M Вы получите более подробную сводку: общий объем памяти, используемая память, свободная память, активная память, неиспользуемая память, кэш подкачки и т. д. Вы также можете обратиться к... /proc/meminfo Чтобы детально рассмотреть каждый показатель, хотя результат получается более сухим и менее удобным для пользователя.
Чтобы выяснить, какие процессы оказывают наибольшее влияние на оперативную память, ps aux отображает столбцы, например VSZ (общий объем виртуальной памяти, которую процесс мог бы использовать, если бы загрузил все) и RSS (Размер резидентного набора, фактический объем памяти, находящийся в данный момент в ОЗУ). Примечание: RSS также включает в себя память разделяемой библиотеки, которая учитывается несколько раз, если используется несколькими процессами.
Здесь вступает в игру PSS (пропорциональный размер набора)которая распределяет стоимость совместно используемых библиотек между процессами, которые их используют. Для удобного получения PSS существуют такие инструменты, как... smemЭто очень полезно для определения того, какие приложения действительно "потребляют много данных", без искажения данных из-за использования общих библиотек.
Фрагментация памяти, стек, куча и ulimit
Ещё один, менее заметный аспект управления памятью — это фрагментация . Можно говорить о внутренней фрагментации (когда блоки памяти выделяются кратными 4, 8 или 16 байтам, оставляя бесполезный фрагмент) и внешней фрагментации (когда свободная память существует, но разделена на небольшие фрагменты, которые препятствуют использованию большого непрерывного выделения памяти).
В таких приложениях, как Redis, иногда можно заметить разницу между объемом памяти, сообщаемым системой (RSS), и объемом памяти, который само приложение считает полезным.used_memoryЭто расстояние обычно в значительной степени обусловлено внешняя фрагментация, пробелы, которые система считает занятыми, но которые процесс фактически не использует.
Память процесса концептуально делится на стек и кучаСтек используется для локальных переменных и вызовов функций, а куча — для динамического выделения памяти. malloc() и тому подобное. Когда структуры данных выходят за пределы возможностей стека, они извлекаются из кучи и обрабатываются с помощью указателей.
Максимальный размер стека на процесс можно настроить с помощью ulimit -a и системных конфигураций. Уменьшение этого параметра ограничивает количество больших локальных переменных, в то время как увеличение позволяет использовать больше переменных или глубокую рекурсию. Регулировка этого параметра может помочь лучше контролировать использование памяти и уменьшить определенные типы фрагментации, хотя это и не панацея.
Расширенные средства мониторинга и диагностики: top, htop, vmstat, sar и другие.
Чтобы определить процессы, потребляющие оперативную память, можно начать с... top А если вам нужно что-то более удобное в использовании, то вот оно: htopПоследний отображает индикаторы использования ЦП, памяти и файла подкачки, а также позволяет интерактивно сортировать и фильтровать процессы.
В Debian и его производных, установить htop c sudo apt install htopВ AlmaLinux и других системах, подобных Red Hat, с sudo dnf install htopОказавшись внутри, вы можете сортировать данные по объему памяти, искать конкретные процессы и завершать проблемные задачи непосредственно из интерфейса.
Для более глубокого анализа и пакетного режима, vmstat 5 Он предоставляет регулярную информацию о процессах, памяти, подкачке, блочном вводе-выводе, прерываниях и планировании работы ЦП. Он идеально подходит для отслеживания изменения нагрузки на память с течением времени.
после системный статус В его состав входят такие инструменты, как sarкоторые позволяют записывать и анализировать использование памяти и других ресурсов. Например, sar -r 1 5 Он отображает использование памяти и файла подкачки каждую секунду, пять раз. В Debian он устанавливается вместе с... sudo apt install sysstatи в AlmaLinux с sudo dnf install sysstat.
Если вам необходима углублённая отладка на уровне ядра, bpftrace Это мощный инструмент, основанный на eBPF. Он позволяет инструментировать системные вызовы, отслеживать доступ к памяти и выявлять узкие места без перекомпиляции или перезапуска. Обычно он устанавливается вместе с... sudo apt install bpftrace на системах, подобных Debian.
Практическое управление памятью: подкачка, подкачиваемость и очистка кэша.
Одной из основных задач на многих серверах является проверка текущее состояние свопа, с swapon --show У вас есть список активных файлов и устройств подкачки, их размер, тип и приоритет. Если вам нужно добавить файл подкачки на лету, вы можете создать файл с помощью команды... fallocateполучить разрешения с chmod 600отформатируйте его с помощью mkswap и активируйте его с помощью swaponЧтобы сохранить это значение, просто добавьте соответствующую запись в /etc/fstab.
Параметр vm.swappiness Этот параметр определяет, насколько часто ядро отдает приоритет использованию файла подкачки по сравнению с дальнейшим заполнением оперативной памяти. Он варьируется от 0 до 100. Низкие значения (10-20) заставляют систему избегать использования файла подкачки до тех пор, пока это не станет абсолютно необходимым, в то время как высокие значения (60 и более) побуждают систему чаще перемещать страницы в файл подкачки для поддержания свободного места в оперативной памяти.
На серверах с медленными дисками или большими базами данных это часто представляет интерес. снизить вероятность обменаНапример, до 10 или 20, с sudo sysctl vm.swappiness=10Для настольных компьютеров с быстрой оперативной памятью (zram) или SSD-накопителями промежуточные значения, такие как 30-60, могут обеспечить хороший баланс между задержкой и использованием памяти.
В ситуациях с хорошей памятью иногда приходится прибегать к принуждению. освобождение кэша c sudo sync && sudo sysctl -w vm.drop_caches=3Это очищает значительную часть кэша страниц и записей идентификаторов. Иногда это полезно для тестирования или освобождения памяти в системах с очень ограниченными ресурсами, но не следует использовать это регулярно, поскольку при этом теряется повышение производительности, которое обеспечивает кэширование.
Расширенные инструменты управления: cgroup v2, memory.pressure и OOM в пользовательском пространстве.
В современных системах, использующих systemd и cgroup v2 , управление памятью может быть точно настроено на уровне групп процессов. cgroup v2 организует задачи в иерархии и применяет ограничения и приоритеты ресурсов (ЦП, память, ввод-вывод) на уровне группы, а не только на уровне отдельного процесса.
В рамках иерархии памяти такие параметры, как memory.low Они позволяют указать, что память определенных групп cgroup должна быть более защищена от глобального давления, в то время как другие могут быть более доступны для использования, если необходимо освободить оперативную память.
Файл memory.pressure Он предоставляет очень полезные метрики: как долго задачи в этой группе были заблокированы из-за нехватки памяти, с интервалами в 10, 60 и 300 секунд. Вариант некоторых Это указывает на то, была ли отложена хотя бы одна задача, и полный Это отражает моменты, когда все задачи группы одновременно подвергались воздействию.
В дополнение к встроенному в ядро механизму OOM killer, появились решения, реализуемые в пользовательском пространстве, такие как: ранняя комната, ноханг o systemd-oomdEarlyOOM отслеживает состояние оперативной памяти и файла подкачки, и когда их значения падают ниже определенных пороговых значений, система заблаговременно завершает процессы. oom_score более высокий уровень, восстанавливающий работоспособность до того, как машина зависнет.
NoHang идёт ещё дальше: он поддерживает больше критериев выбора , может учитывать нехватку памяти и хорошо интегрируется с расширенными конфигурациями, хотя его разработка переживала как взлёты, так и падения. Между тем, systemd-oomd напрямую интегрируется с systemd и cgroup v2 и в настоящее время является предпочтительным вариантом во многих дистрибутивах для более интеллектуального и детального управления ситуациями с нехваткой памяти.
Современный файл подкачки: zram, zswap и приоритеты устройств.
В дополнение к «классическому» подкачке диска, Linux предлагает современные механизмы, которые значительно повышают производительность за счет сочетания сжатия оперативной памяти и выборочного использования диска.
zram — это модуль ядра, который создает блочные устройства непосредственно в оперативной памяти, где страницы хранятся в сжатом состоянии. Обычно они используются в качестве сверхбыстрых устройств подкачки: сжатие и распаковка потребляют часть ресурсов процессора, но при этом увеличивается объем логической памяти и значительно сокращается использование дискового пространства.
Во многих дистрибутивах достаточно установить zram-tools o генератор зрам и включить его службу. Например, в Debian это можно сделать с помощью sudo apt install zram-tools и активировать zramswap с systemd. В AlmaLinux, с sudo dnf install zram-generator и соответствующую услугу.
С другой стороны, zswap функционирует как сжатый кэш перед областью подкачки диска . Сначала он пытается сохранить страницы, находящиеся в подкачке, в сжатой оперативной памяти; только когда этот кэш заполняется или страницы становятся неактивными, он записывает данные в фактическую область подкачки. Это уменьшает операции ввода-вывода на диске и продлевает срок службы SSD-накопителей, но за счет некоторого увеличения нагрузки на процессор.
При объединении нескольких файлов подкачки (например, zram и дискового файла) крайне важно настроить параметры. приоритеты, с swapon -p или вариант pri= en /etc/fstab Вы указываете, какое устройство следует использовать первым. Обычно приоритет отдается zram (например, 100), а disk swap (10) — более низкому приоритету, чтобы ядро могло в полной мере использовать сжатое пространство подкачки в ОЗУ перед доступом к диску.
Управление памятью на серверах: файл подкачки, службы и безопасность.
В веб-серверах (Apache, Nginx), базах данных (MySQL, MariaDB, MongoDB) или ресурсоемких приложениях память является критически важным ресурсом. Конфигурация оперативной памяти и файла подкачки напрямую определяет, сколько одновременных запросов вы можете обработать, прежде чем система начнет испытывать трудности.
В случае с такими системами управления базами данных, как MongoDB, крайне важно, чтобы объем физической оперативной памяти превышал требования базы данных ; в противном случае она начнет использовать пространство подкачки, и производительность резко упадет из-за существенной разницы между доступом к оперативной памяти и доступом к диску. То же самое относится к MySQL/MariaDB, где такие инструменты, как MySQLTuner, рекомендуют параметры памяти на основе доступного объема оперативной памяти.
Чтобы избежать нерационального использования памяти, рекомендуется останавливать неиспользуемые службы и очищать контейнеры, образы и тома Docker, которые больше не нужны. В средах разработки и тестирования очень легко накапливать забытые ресурсы, которые незаметно для окружающих занимают гигабайты оперативной памяти и дискового пространства.
Безопасность также играет свою роль: ненужные порты открыты Они увеличивают поверхность атаки. Вредоносное ПО, которому удается проникнуть в систему, может, например, запускать процессы майнинга, потребляющие ресурсы процессора и памяти, планировать задачи в crontab и привести к сбою системы. Проверка входящих и исходящих портов, закрытие всего несущественного и очистка подозрительных заданий cron являются частью базовой системной гигиены, которая также защищает ресурсы памяти.
Память и файловые системы: ext4, XFS, Btrfs и журналирование.
Хотя это может показаться отдельным вопросом, выбор файловой системы и её конфигурация также влияют на поведение памяти и нагрузку на ввод-вывод. Например, Ext4 использует журнал, который, в зависимости от нагрузки, может создавать дополнительную нагрузку на диск и, следовательно, на управление кэшем.
В требовательных серверных средах многие администраторы выбирают XFS или даже Btrfs . XFS обычно очень хорошо работает с большими файлами и высокопроизводительными системами. Btrfs предлагает расширенные функции, такие как моментальные снимки, прозрачное сжатие и подтома, но за счет некоторой сложности и, в зависимости от версии и дистрибутива, уровня зрелости, который до сих пор обсуждается для всех типов рабочих нагрузок.
Ядро адаптирует свою политику кэширования и записи к характеристикам файловой системы, поэтому переход с ext4 на XFS или Btrfs влияет не только на необработанный ввод-вывод, но и на то, как оперативная память и страничный кэш используются для буферизации операций чтения и записи.
Необходимые графические инструменты и утилиты для администраторов.
Хотя терминал остается универсальным инструментом для любого администратора, существуют инструменты, значительно упрощающие управление памятью и ресурсами . Один из них — Glances , монитор в реальном времени, отображающий загрузку ЦП, памяти, дискового пространства, сети и процессов на одном экране, с дополнительным веб-интерфейсом для мониторинга нескольких серверов из браузера.
Для быстрой установки в Debian просто... sudo apt install glancesGlances очень хорошо дополняет htop, vmstat y sar, что позволяет получить более наглядное представление о поведении системы под нагрузкой.
В сфере графического администрирования серверов Cockpit предлагает удобный веб-интерфейс для мониторинга памяти, процессов и служб . Он позволяет управлять несколькими серверами с одной консоли, запускать и останавливать модули systemd, отслеживать использование файла подкачки и zram, а также просматривать журналы, не покидая браузер.
В настольных системах многие дистрибутивы интегрируют собственный монитор ресурсов, но для сред без графического интерфейса или там, где требуется легковесное решение, сочетание этих консольных инструментов с пользовательскими скриптами обеспечивает превосходную видимость того, что происходит с памятью в любой момент времени.
Правильное управление памятью в Linux включает в себя понимание того, как ядро использует ОЗУ, роли swap, zram и zswap, как cgroup v2 и различные ошибки нехватки памяти реагируют на нагрузку, а также какие инструменты у вас есть для мониторинга и тонкой настройки системы. Когда вы объединяете все эти компоненты — от free, vmstat, PSS и memory.pressure до zram, swappiness и systemd-oomd — вы перестаете бороться с проблемой «Linux потребляет ОЗУ» и начинаете иметь тонко настроенную, стабильную систему, способную максимально эффективно использовать аппаратное обеспечение в любой роли: сервер, настольный компьютер или среда с высокой нагрузкой.