Linux — работа с виртуальной памятью

Концепция виртуальной памяти в Linux не слишком отличается от таковой в операционной системе Windows. Когда в Windows заканчивается свободная память, начинает использоваться файл подкачки (page file). Виртуальная память является относительно недорогим способом увеличить производительность в те моменты, когда система использует максимально возможный объем оперативной памяти.

Как просмотреть бесплатную оперативную память в Linux

Как и в любом другом случае в Linux, существует несколько способов проверить, сколько ОЗУ используется. Если вы работаете в коммерческой операционной системе, вам может быть проще открыть приложение, похожее на диспетчер задач Windows или монитор активности macOS. Название этой программы зависит от того, какую среду рабочего стола Linux вы используете.

В GNOME, наиболее широко используемой опции, откройте программу под названием Системный монитор. В KDE, аналогичной полнофункциональной альтернативе, используйте Konsole вместо. В других средах рабочего стола есть похожие инструменты под разными именами.

Для подхода, который работает независимо от среды вашего рабочего стола, вы можете обратиться к командной строке. Откройте Терминал приложение и введите следующую команду.

Вы увидите результаты, которые выглядят примерно так. Числа будут меняться в зависимости от объема оперативной памяти, установленной на вашем компьютере, и количества активных программ.

Для более тщательного изучения вашей оперативной памяти попробуйте следующее:

cat /proc/meminfo

Приведенная выше команда загружает тот же файл, что свободно Команда использует, чтобы увидеть, сколько памяти доступно на вашем компьютере.

Если ваши цифры кажутся серьезными, может показаться, что Linux съел вашу оперативную память. Допустим, у вас есть 4 ГБ ОЗУ, и используется 3,9 ГБ. Только 0,1 ГБ, кажется, бесплатно для дополнительных приложений! Похоже, что вы находитесь в одной программе от остановки вашего компьютера.

Посмотри снова. На этот раз обратите внимание на колонку «доступно». Там вы можете обнаружить, что у вас есть 1 ГБ данных, открытых для приложений. Но как? Все сводится к тому, как Linux управляет и использует RAM

Создание нового пространства подкачки

Если вам необходимо больше пространства подкачки, то у вас есть два пути: создать раздел подкачки или создать область подкачки в существующем разделе. Если имеется свободное дисковое пространство, то рекомендуется выделить некоторую его часть для создания отдельного раздела подкачки. Тем не менее, можно создать область подкачки необходимого размера и на уже имеющемся рабочем разделе, например на разделе с файловой системой ext3.

Читайте также:  Как настроить в Ubuntu Wi-Fi, если он не работает или не подключается

Если вы создаете новую область подкачки, например, расширяя имеющийся раздел или добавляя новый жесткий диск, то следует создать файловую систему специального типа с помощью команды mkswap. Для создания нового пространства подкачки выполните следующие действия:

  1. Создайте раздел с помощью команды fdisk и укажите для него тип 82 (область подкачки Linux).
  2. Создайте том подкачки с помощью команды mkswap.
  3. Задействуйте область подкачки с помощью команды swapon -a.
  4. Добавьте новую точку монтирования области подкачки в файле /etc/fstab.
  5. Перезагрузите компьютер и проверьте доступность новой области подкачки с помощью команды swapon -s.

Потребление памяти

Суммарное распределение страниц памяти по сегментам процесса можно получить при помощи третьего набора столбцов (активировав его клавишами № команды top, как показано в листинге ниже. В столбце VIRT изображается суммарный объем (в килобайтах) всех страниц процесса, а в столбце RES — объем резидентных «страниц (находящихся в страничных кадрах оперативной памяти). В столбце SWAP указывается объем всех страниц, находящихся во вторичной памяти — как «анонимных» страниц, выгруженных в специальную область подкачки, так и «файловых» страниц, возможно, никогда не загружавшихся в оперативную память.

Столбцы CODE и DATA показывают объемы (в килобайтах) памяти,, выделенной, под сегменты кода и данных, а столбец SHR — объем резидентных страниц, которые используются (или могут быть использованы) совместно с другими процессами.

Распределение памяти по назначению

[email protected]buntu:~$ top -р 26958 top — 11:05:01 up 15 days, 47 min, 8 users, load average: , ,

Tasks: 1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie

Cpu(s): 8.6%us, 2.4%sy, 0.0%ni, 88.6%id, 0.4%wa, 0.0%hi, 0.0%si, 0.0%si

Mem: 8192144k total, 7037720k used, 1154424k free, 238984k buffers

Swap: 4104188k total, 35376k used, 4068812k free, 4356372k cached

PID %МЕМ   VIRT  SWAP  RES  CODE  DATA  SHR nFLT nDRT  S  PR   NI %CPU  COMMAND

26958         0.1   10288 4936    5352  880     3852     1544        0         0   S   20   0          0    bash

Механизм отображения считывает содержимое файла в страничные кадры только один раз, вне зависимости от количества процессов, отображающих этот файл в свою память. В случае отображения одного файла разными процессами их страницы совместно отображаются на одни и те же страничные кадры, за исключением страниц, скопированных (согласно принципу COW) при изменении.

Такое поведение механизма отображения позволяет эффективно использовать оперативную память за счет использования разными программами одинаковых разделяемых библиотек. Так как ELF-файлы библиотек «загружаются* в память процессов при помощи отображения mmap, то в результате каждая библиотека размещается в оперативной памяти лишь единожды, вне зависимости от количества ее «использований».

Читайте также:  Как выбрать хостинг: нюансы, о которых следует знать

Интегральная статистика по использованию виртуальной памяти может быть получена при помощи команды free, как показано в листинге ниже.

Статистика использования памяти

[email protected]:~$ free -m total             used              free          shared     buffers        cached Mem:           8000            5523              2476                  0           219            3430 -/+ buffers/cache:           1873              6126 Swap:           4007                17               3990

Строка Mem: содержит статистику использования оперативной памяти, а строка Swap: — статистику специальной области подкачки. В столбце total указан суммарный объем всех доступных страничных кадров, а в столбцах used и free — суммарные объемы использованных и свободных страничных кадров, соответственно.

В столбце cached указан объем страничного кэша (page cache), т. е. суммарный объем страничных кадров оперативной памяти, использованных под отображение файлов в память. Аналогично, в столбце buffers указывается объем буферного кэша, т. е. суммарный объем памяти, использованной ядром для кэширования «не-отображаемых» сущностей: метаданных файлов, дисковых блоков при прямом вводе-выводе на устройства и пр.

В столбцах used и free строки -/+ buffers/cache указываются объемы использованной и свободной памяти «за вычетом» страничного и буферного кэшей, т. е. «чистая» память, выделенная процессам по требованию под данные, сгенерированные в процессе работы.

В листинге ниже показан пример потребления памяти процессом текстового редактора vi при попытке редактирования громадного файла в 1 Гбайт. Процесс загружает файл целиком, в результате чего он целиком оказывается в резидентных страницах сегмента данных процесса, что естественным образом увеличивает «чистый» расход оперативной памяти системы. После принудительного завершения процесса при помощи команды kill память естественным образом высвобождается.

Потребление памяти процессами

Добавляем SWAP в Linux

При заказе виртуального сервера, часто для установки используется заранее подготовленные шаблоны, из-за чего в системе может отсутствовать SWAP-раздел. Что бы предотвратить ошибки вызванные переполнением RAM и обеспечит нормальное функционирование системы в будущем, необходимо добавить в систему дополнительное SWAP-пространство.

Как правило, в процессе установки под SWAP выделяют отдельный раздел на диске, но начиная с версии ядра Linux 2.6 работа SWAP-файла не уступает по производительности SWAP-разделу.

Читайте также: 

Поэтому, в большинстве случаев я предпочитаю использовать SWAP-файл размещенный в корневом разделе диска.

Это добавляет гибкости для обслуживания системы в будущем: я в любой момент с легкостью могу уменьшить или увеличить размер файла, при необходимости перенести на другой раздел или полностью удалить.

Ниже приведен пример скрипта для быстрой настройки SWAP:

if [ -f /swapfile ]; then echo “Swapfile already exists?” exit 1 fi fallocate -l 4G /swapfile chmod 600 /swapfile mkswap /swapfile swapon /swapfile sysctl sysctl _cache_pressure=50 echo “/swapfile none swap sw 0 0” >> /etc/fstab echo >> /etc/ echo _cache_pressure=50 >> /etc/

Параметр указывает системе при каком минимальном проценте свободной памяти необходимо задействовать SWAP. Значение параметра может быть в пределах от 0 — 100. Но для улучшения производительности лучше установит значение данного параметра равным 10.

Добавляем SWAP в Linux

В случае использования SSD, необходимо уменьшит размер дискового кэша, для этого рекомендуется установить значение параметра _cache_pressure равным 50.

Иногда может возникнуть необходимость очистить SWAP без перезагрузки системы, для этого используем следующую команду:

swapoff -a && swapon -a

Для принудительной очистки системных кэшей используем команду:

sync # Чистим pagecache: echo 1 > /proc/sys/vm/drop_caches # Чистим dentrie и inode кэши: echo 2 > /proc/sys/vm/drop_caches # Чистим pagecache, dentrie и inode кэши: echo 3 > /proc/sys/vm/drop_caches

Как правило, я старюсь перегружать сервер только при крайней необходимости. Одна из причин, по которой я люблю Linux — если не течет память, то система абсолютно не нуждается в перезагрузке. Исключительно в целях профилактики чтобы очистить кеши и SWAP, на всех своих серверах в cron добавляю следующую команду:

0 0 * * * swapoff -a && swapon -a && sync && echo 3 > /proc/sys/vm/drop_caches

Размещение

SWAP может быть размещен на разделе диска, в или в RAM. Исторически в Linux SWAP размещался на разделе, но в современных дистрибутивах производительность SWAP-файла не уступает SWAP-разделу. Однако стандартный установщик Ubuntu (до версии ) не умеет создавать SWAP-файл при установке и выдает предупреждение, если SWAP-раздел не определен при разметке диска. Начиная с версии , Ubuntu предлагает по умолчанию создавать SWAP в файле (объем определяется как 5% от свободного на диске места, но не более 2 Гб). Использование SWAP-файла имеет некоторые преимущества: он не занимает отдельный раздел, его легко создать, изменить его размер или удалить.

Дополнительно при выборе размещения SWAP нужно учитывать, что не все файловые системы позволяют использовать прямую адресацию блоков SWAP-файла. Так, к примеру, нельзя использовать SWAP в файле на разделе с файловой системой btrfs(по состоянию на середину 2017).