Источник: What is Virtual Memory on Linux?
В постоянно меняющемся мире современных вычислений эффективное управление ресурсами памяти критически важно для плавной и отзывчивой работы системы. Чтобы справиться с проблемами, создаваемыми прожорливыми приложениями и ограниченной физической памятью, Linux задействует мощь виртуальной памяти. В этой статье мы глубоко разберём виртуальную память в Linux, исследуем её значение, реализацию и преимущества, которые она приносит миру вычислений.
Виртуальная память в Linux — это сложная система управления памятью, которая позволяет операционной системе эффективно использовать как физическую оперативную память (RAM), так и вторичное хранилище (обычно часть жёсткого диска, называемую областью подкачки — swap space), создавая иллюзию большего объёма памяти, чем есть физически.
Некоторые ключевые методы виртуальной памяти, используемые в Linux:
Вытребованная страничная подгрузка (Demand Paging):
Demand paging — техника, при которой ядро Linux загружает страницы в физическую память только тогда, когда они требуются процессу.
Область подкачки (Swap Space):
Swap space — выделенная область на жёстком диске, которая выступает расширением физической RAM.
Копирование при записи (Copy-on-Write, COW):
Copy-on-write — техника оптимизации памяти, используемая Linux при создании дочерних процессов через системный вызов fork().
Отображение памяти (Memory Mapping):
Linux позволяет отображать файлы напрямую в адресное пространство процесса с помощью техник отображения памяти, таких как mmap().
Оба аллокатора играют разные роли в управлении различными типами выделения памяти внутри ядра.
Аллокатор Buddy:
Аллокатор Buddy — техника управления памятью, используемая для выделения и освобождения больших блоков памяти. Как он работает:
- Когда приходит запрос на выделение памяти, аллокатор ищет ближайший доступный размер блока, который может удовлетворить запрос — это всегда степень двойки.
- Если есть блок нужного размера, он выделяется запрашивающему процессу. Если нет, блок большего размера делится на два равных блока-«приятеля» (buddy), и процесс повторяется рекурсивно, пока не будет достигнут требуемый размер блока.
Аллокатор Slab:
Аллокатор Slab — техника управления памятью, используемая для небольших выделений памяти, часто называемых «объектами» или «слэбами» (slabs).
Как он работает:
- Аллокатор Slab делит физическую память на кеши фиксированного размера, каждый из которых предназначен для хранения определённой структуры данных ядра или типа объектов.
- Когда приходит запрос на небольшое выделение памяти, аллокатор ищет кеш, который может вместить запрашиваемый размер. Если в кеше есть доступный объект, он выделяется процессу. В противном случае создаётся новый кеш, и память выделяется из него.
Вот некоторые ключевые задачи и техники, связанные с виртуальной памятью в ядре Linux:
Выделение и освобождение страниц:
Ядро Linux отвечает за выделение и освобождение страниц памяти для процессов. Когда процесс запрашивает память, ядро использует свою подсистему управления памятью, чтобы выделить необходимые страницы из физической памяти (RAM) или области подкачки на диске.
Обработка страничных сбоев (Page Fault):
Страничные сбои происходят, когда процесс обращается к странице памяти, которой в данный момент нет в физической памяти. Ядро Linux обрабатывает эти сбои, подгружая требуемую страницу в память из области подкачки.
Алгоритмы замещения страниц:
Для оптимизации использования памяти и загрузки страниц ядро Linux применяет различные алгоритмы замещения страниц. Эти алгоритмы определяют, какие страницы следует вытеснить из памяти, когда нужно загрузить новые.
Параметр vm.swappiness определяет, насколько агрессивно ядро использует область подкачки, когда физическая RAM заполняется.
Проверка текущего значения swappiness:
Прежде чем вносить изменения, проверьте текущее значение vm.swappiness, чтобы понять, как система использует область подкачки. Откройте терминал и выполните следующую команду:
$ cat /proc/sys/vm/swappinessВывод покажет текущее значение — обычно оно установлено по умолчанию на 60.
Временная настройка swappiness:
Чтобы временно изменить значение vm.swappiness, можно использовать команду sysctl:
$ sudo sysctl vm.swappiness=VALUEЗамените VALUE на желаемое значение swappiness. Например, чтобы установить swappiness равным 10:
$ sudo sysctl vm.swappiness=10Изменение вступает в силу немедленно, и система начнёт использовать область подкачки менее агрессивно.
Постоянная настройка swappiness:
Чтобы настройка swappiness сохранялась после перезагрузок, отредактируйте файл sysctl.conf, в котором хранятся изменяемые параметры системы:
$ sudo nano /etc/sysctl.confДобавьте или измените следующую строку, чтобы установить желаемое значение swappiness (например, 10):
vm.swappiness=10
Сохраните и закройте файл.
Применение постоянного изменения:
Чтобы применить изменения без перезагрузки, выполните следующую команду:
$ sudo sysctl -pКоманда sysctl -p читает файл sysctl.conf и применяет изменения немедленно.
Мониторинг swappiness:
После внесения изменений можно отслеживать значение swappiness системы с помощью команды sysctl или других инструментов мониторинга. Убедитесь, что новая настройка соответствует требованиям вашей системы и её рабочей нагрузке.
Параметр vm.dirty_ratio определяет процент системной RAM, который может использоваться под «грязные» страницы — изменённые данные, ожидающие записи обратно на диск.
Проверка текущего значения dirty ratio:
Прежде чем вносить изменения, проверьте текущее значение vm.dirty_ratio, чтобы понять, как система обращается с грязными страницами. Откройте терминал и выполните команду:
$ cat /proc/sys/vm/dirty_ratioВывод покажет текущее значение — обычно оно установлено по умолчанию около 20.
Временная настройка dirty ratio:
Чтобы временно изменить значение vm.dirty_ratio, используйте команду sysctl:
$ sudo sysctl vm.dirty_ratio=VALUEЗамените VALUE на желаемый процент dirty ratio. Например, чтобы установить dirty ratio равным 30%:
$ sudo sysctl vm.dirty_ratio=30Изменение вступает в силу немедленно.
Постоянная настройка dirty ratio:
Чтобы настройка dirty ratio сохранялась после перезагрузок, отредактируйте файл sysctl.conf:
$ sudo nano /etc/sysctl.confДобавьте или измените следующую строку, чтобы установить желаемый процент dirty ratio (например, 30%):
vm.dirty_ratio=30
Сохраните и закройте файл, примените постоянные изменения и отслеживайте dirty ratio, как описано выше.
Параметр vm.dirty_background_ratio определяет процент системной RAM, который может использоваться под грязные страницы, прежде чем ядро начнёт сбрасывать их на диск в фоновом режиме.
Проверка текущего значения dirty background ratio:
Прежде чем вносить изменения, проверьте текущее значение vm.dirty_background_ratio, чтобы понять, как система обрабатывает грязные страницы в фоне. Откройте терминал и выполните команду:
$ cat /proc/sys/vm/dirty_background_ratioВывод покажет текущее значение — обычно оно установлено по умолчанию около 10.
Временная настройка dirty background ratio:
Чтобы временно изменить значение vm.dirty_background_ratio, используйте команду sysctl:
$ sudo sysctl vm.dirty_background_ratio=VALUEЗамените VALUE на желаемый процент. Например, чтобы установить dirty background ratio равным 15%:
$ sudo sysctl vm.dirty_background_ratio=15Изменение вступает в силу немедленно.
Постоянная настройка dirty background ratio:
Чтобы настройка сохранялась после перезагрузок, отредактируйте файл sysctl.conf:
$ sudo nano /etc/sysctl.confДобавьте или измените следующую строку, чтобы установить желаемый процент (например, 15%):
vm.dirty_background_ratio=15
Сохраните и закройте файл, примените постоянные изменения и отслеживайте параметр, как описано выше.
Следуя этим практикам, вы можете оптимизировать использование памяти и обеспечить плавную работу:
- Установите подходящий размер области подкачки: Убедитесь, что область подкачки имеет подходящий размер. Как правило, устанавливайте её как минимум того же размера, что и физическая RAM. Достаточная область подкачки позволяет системе эффективно справляться с пиковыми нагрузками на память.
- Используйте 64-битную архитектуру: Если ваше оборудование поддерживает, используйте 64-битный дистрибутив Linux, чтобы воспользоваться преимуществами большего виртуального адресного пространства, что позволит системе обрабатывать более значительные требования к памяти.
- Используйте эффективное по памяти ПО: Выбирайте приложения и службы, экономно расходующие память. По возможности избегайте прожорливого ПО и отдавайте предпочтение легковесным альтернативам.
- Разумно используйте отображение в память (mmap): Хотя отображение в память может повысить производительность, будьте осторожны при работе с большими файлами. Отображение слишком больших файлов может потреблять значительные объёмы памяти и привести к исчерпанию ресурсов.
- Обновляйте ядро: Регулярно обновляйте ядро Linux и соответствующие пакеты, чтобы получать улучшения управления памятью и исправления ошибок, вносимые сообществом.
Когда Linux-система одновременно запускает несколько приложений или обрабатывает задачи, интенсивно использующие память, физической RAM может не хватить для размещения всех данных, необходимых работающим процессам. Чтобы обойти это ограничение, ядро использует часть жёсткого диска как виртуальную память, известную как область подкачки (swap space).
Когда процессу требуется больше памяти, чем доступно в физической RAM, ядро Linux применяет технику, называемую вытребованной подгрузкой страниц (demand paging). Если процесс обращается к данным, которых в данный момент нет в RAM (происходит страничный сбой — page fault), ядро извлекает необходимые данные из области подкачки в свободную область физической RAM. Этот процесс называется «swapping in» или «paging in».
Размер раздела подкачки — важный момент, требующий внимания. Он должен быть достаточно большим, чтобы вместить потребности в памяти работающих процессов и избежать ситуаций нехватки памяти. С другой стороны, слишком большая область подкачки может не давать выгоды и даже привести к проблемам с производительностью.
Файлы подкачки в Linux предоставляют гибкий способ добавить виртуальную память в систему без необходимости выделять отдельные разделы подкачки. Вот как использовать файлы подкачки в Linux:
Чтобы создать файл подкачки, определите желаемый размер и расположение. Файл подкачки можно создать в любом каталоге, но обычно его размещают в корневом каталоге (/). Например, чтобы создать файл подкачки размером 2 ГБ с именем «swapfile»:
$ sudo fallocate -l 2G /swapfileФайлы подкачки должны иметь ограниченные права доступа для обеспечения безопасности. Установите соответствующие права и заблокируйте файл, чтобы предотвратить изменение:
$ sudo chmod 600 /swapfileПеред использованием файла подкачки его необходимо отформатировать как область подкачки:
$ sudo mkswap /swapfileПосле форматирования файла подкачки включите его, чтобы сделать доступным для использования:
$ sudo swapon /swapfileЧтобы файл подкачки автоматически включался при загрузке системы, добавьте запись в файл /etc/fstab:
$ sudo nano /etc/fstabДобавьте следующую строку в конец файла:
/swapfile none swap sw 0 0
Сохраните и закройте файл.
Убедитесь, что файл подкачки активен и используется, проверив использование подкачки с помощью команды free или swapon:
$ free -h
$ swapon --showВиртуальная память в Linux использует область подкачки, чтобы расширить доступную память за пределы физической RAM, позволяя системе обрабатывать задачи с интенсивным использованием памяти и эффективно управлять ресурсами памяти.
Вот общие рекомендации, помогающие определить, сколько места подкачки выделять:
-
RAM до 2 ГБ: Для систем с менее чем 2 ГБ RAM выделение области подкачки, равной размеру физической RAM или чуть больше (например, в 1,5 раза больше RAM), должно быть достаточно.
-
RAM от 2 до 8 ГБ: Для систем с 2–8 ГБ RAM размер области подкачки, равный физической RAM, обычно адекватен. Современные системы с достаточным объёмом RAM могут справляться с большинством нагрузок без интенсивного свопинга.
-
RAM от 8 до 64 ГБ: Для систем с 8–64 ГБ RAM обычно достаточно области подкачки размером 2–4 ГБ. Наличие некоторого объёма подкачки помогает справляться с эпизодическими всплесками использования памяти.
-
RAM более 64 ГБ: Для систем с более чем 64 ГБ RAM можно выделить меньшую область подкачки, около 1–2 ГБ, если ваша система не выполняет задачи с интенсивным использованием памяти или специализированные нагрузки.
Виртуальная память — это фундаментальный механизм, играющий критическую роль в поддержании стабильности, производительности и отзывчивости Linux-систем.
-
Обработка задач с интенсивной памятью: Виртуальная память позволяет системе эффективно обрабатывать задачи с интенсивным использованием памяти, задействуя область подкачки для временного хранения данных, которые не активно используются процессами.
-
Бесшовная многозадачность: Виртуальная память обеспечивает бесшовную многозадачность, позволяя нескольким приложениям эффективно делить ограниченную физическую RAM.
-
Избежание ситуаций нехватки памяти: Без виртуальной памяти всплески, такие как утечки памяти в приложениях и непредвиденные запросы ресурсов, могли бы приводить к ситуациям out-of-memory (OOM), когда система падает из-за нехватки памяти.
- Виртуальная память абстрагирует физическую память, позволяя процессам работать так, как будто у них непрерывное адресное пространство. Виртуальная память применяет продуманные техники свопинга для оптимизации использования памяти и обеспечения стабильной и отзывчивой работы.
- Система виртуальной памяти Linux подходит для широкого спектра вычислительных применений — от персональных компьютеров до высокопроизводительных серверов.
- Виртуальная память без проблем справляется с запросами памяти в современных вычислительных средах. Использование виртуальной памяти делает Linux надёжным выбором для различных вычислительных задач.
- По мере развития технологий виртуальная память остаётся адаптируемой к меняющимся требованиям современных вычислений. Виртуальная память играет ключевую роль в достижении оптимальной производительности системы на Linux-платформах.