LinuxКак сделать

Что такое Swappiness в Linux? (и как это изменить)

Палки оперативной памяти (ОЗУ) для компьютера.
Subin-ч / Shutterstock.com

Значение подкачки в Linux не имеет никакого отношения к тому, сколько ОЗУ используется до начала подкачки. Это широко распространенная и широко распространенная ошибка. Мы объясняем, что это на самом деле.

Разрушая мифы о свопности

Обмен — это метод, при котором данные в оперативной памяти (ОЗУ) записываются в специальное место на жестком диске — раздел подкачки или файл подкачки — для освобождения ОЗУ.

В Linux есть параметр, называемый значением swappiness. Существует много путаницы в отношении того, что контролирует этот параметр. Наиболее распространенное неправильное описание подкачки — это то, что оно устанавливает порог для использования ОЗУ, и когда количество используемой ОЗУ достигает этого порога, начинается подкачка.

Это заблуждение, которое повторялось так часто, что теперь оно получило мудрость. Если (почти) все остальные скажут вам, что именно так работает подмена, почему вы должны верить нам, когда мы говорим, что это не так?

Просто. Мы собираемся доказать это.

Ваша оперативная память разделена на зоны

Linux не считает вашу оперативную память одним большим однородным пулом памяти. Он считает, что он разделен на ряд различных регионов, называемых зонами. Какие зоны присутствуют на вашем компьютере, зависит от того, является ли он 32-разрядным или 64-разрядным . Вот упрощенное описание возможных зон на компьютере с архитектурой x86 .

  • Прямой доступ к памяти (DMA) : это 16 МБ памяти. Зона получила свое название, потому что давным-давно существовали компьютеры, которые могли только осуществлять прямой доступ к памяти в этой области физической памяти.
  • Прямой доступ к памяти 32 : несмотря на свое название, прямой доступ к памяти 32 (DMA32) является зоной, встречающейся только в 64-битном Linux. Это 4 ГБ памяти. Linux, работающая на 32-битных компьютерах, может использовать DMA только для этого объема ОЗУ (если только они не используют ядро ​​с физическим расширением адреса (PAE)), то есть как зона получила свое имя. Хотя на 32-битных компьютерах он называется HighMem.
  • Нормальный : на 64-битных компьютерах нормальная память — это все ОЗУ объемом более 4 ГБ (примерно). На 32-битных машинах это оперативная память от 16 МБ до 896 МБ.
  • HighMem : это существует только на 32-битных компьютерах Linux. Это все ОЗУ выше 896 МБ, включая ОЗУ более 4 ГБ на достаточно больших машинах.

Значение PAGESIZE

ОЗУ выделяется в страницах, которые имеют фиксированный размер. Этот размер определяется ядром во время загрузки, определяя архитектуру компьютера. Обычно размер страницы на компьютере с Linux составляет 4 Кбайт.

Вы можете увидеть размер своей страницы с помощью команды getconf :

  getconf PAGESIZE 

getconf PAGESIZE

Зоны привязаны к узлам

Зоны привязаны к узлам. Узлы связаны с центральным процессором (ЦП) . Ядро будет пытаться выделить память для процесса, запущенного на ЦП, с узла, связанного с этим ЦП.

Концепция привязки узлов к процессорам позволяет устанавливать смешанные типы памяти на специализированных многопроцессорных компьютерах с использованием архитектуры неоднородного доступа к памяти .

Это все очень высокого класса. Средний компьютер с Linux будет иметь один узел, который называется ноль. Все зоны будут принадлежать этому узлу. Чтобы увидеть узлы и зоны на вашем компьютере, загляните в файл /proc/buddyinfo . Мы будем использовать less чтобы сделать это:

  less / proc / buddyinfo 

less / proc / buddyinfo в окне терминала

Это вывод 64-битного компьютера, на котором исследовалась эта статья:

  Узел 0, зона DMA 1 1 1 0 2 1 1 0 1 1 3
 Узел 0, зона DMA32 2 67 58 19 8 3 3 1 1 1 17 

Существует один узел, узел ноль. Этот компьютер имеет только 2 ГБ оперативной памяти, поэтому нет «нормальной» зоны. Есть только две зоны, DMA и DMA32.

Каждый столбец представляет количество доступных страниц определенного размера. Например, для зоны DMA32, чтение слева:

  • 2 : есть 2 из 2 ^ ( 0 * PAGESIZE) фрагментов памяти.
  • 67 : 67 из 2 ^ ( 1 * PAGE_SIZE) фрагментов памяти.
  • 58 : доступно 58 из 2 ^ ( 2 * PAGESIZE) фрагментов памяти.
  • И так далее, вплоть до…
  • 17 : есть 17 из 2 ^ ( 512 * СТРАНИЦ) частей.

Но на самом деле единственная причина, по которой мы смотрим на эту информацию — это видеть взаимосвязь между узлами и зонами.

Страницы файлов и анонимные страницы

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

Отображения памяти могут быть:

  • Файл с резервной копией : Отображения с файловой поддержкой содержат данные, которые были прочитаны из файла. Это может быть любой файл. Важно отметить, что если система освободила эту память и ей нужно было снова получить эти данные, их можно будет снова прочитать из файла. Но если данные были изменены в памяти, эти изменения должны быть записаны в файл на жестком диске, прежде чем память будет освобождена. Если этого не произойдет, изменения будут потеряны.
  • Аноним : Анонимная память — это отображение памяти без файла или устройства, поддерживающего его. Эти страницы могут содержать оперативную память, запрашиваемую программами для хранения данных, или для таких вещей, как стек и куча . Поскольку за данными этого типа нет файлов, необходимо выделить специальное место для хранения анонимных данных. Это место — раздел подкачки или файл подкачки. Анонимные данные записываются для обмена перед освобождением анонимных страниц.
  • Резервное копирование устройства : устройства обрабатываются через файлы блочных устройств, которые можно рассматривать как файлы . Данные могут быть прочитаны и записаны в них. В отображении памяти, поддерживаемом устройством, хранятся данные с устройства.
  • Общий доступ : несколько записей таблицы страниц могут отображаться на одной странице ОЗУ. Доступ к ячейкам памяти через любое из отображений покажет те же данные. Различные процессы могут очень эффективно взаимодействовать друг с другом, изменяя данные в этих совместно наблюдаемых местах памяти. Совместно используемые записи сопоставлений являются распространенным средством достижения высокопроизводительных межпроцессных взаимодействий.
  • Копирование при записи : Копирование при записи — это метод ленивого размещения. Если запрашивается копия ресурса, уже находящегося в памяти, запрос удовлетворяется путем возврата сопоставления исходному ресурсу. Если один из процессов, «разделяющих» ресурс, пытается записать в него, ресурс должен действительно реплицироваться в памяти, чтобы можно было внести изменения в новую копию. Таким образом, выделение памяти происходит только при первой команде записи.

Для замены нам нужны только первые два списка: страницы файлов и анонимные страницы.

Swappiness

Вот описание перестановки из документации Linux на GitHub :

"This control is used to define how aggressive (sic) the kernel will swap memory pages. Higher values will increase aggressiveness, lower values decrease the amount of swap. A value of 0 instructs the kernel not to initiate swap until the amount of free and file-backed pages is less than the high water mark in a zone.

The default value is 60."

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

Давайте копать глубже. Вот определение и значение по умолчанию vm_swappiness в файле исходного кода ядра vmscan.c :

/*
* From 0 .. 100. Higher means more swappy.
*/
int vm_swappiness = 60;

Значение своппинга может варьироваться от 0 до 100. Опять же, комментарий, безусловно, звучит так, как будто значение свопинга влияет на объем обмена, причем более высокая цифра ведет к большему обмену.

Далее в файле исходного кода мы видим, что новой переменной под названием swappiness присваивается значение, которое возвращается функцией mem_cgroup_swappiness() . Еще vm_swappiness трассировка через исходный код покажет, что значение, возвращаемое этой функцией — vm_swappiness . Так что теперь переменная swappiness установлена ​​равной любому значению vm_swappiness .

int swappiness = mem_cgroup_swappiness(memcg);

И немного дальше в том же файле исходного кода , мы видим это:

/*
* With swappiness at 100, anonymous and file have the same priority.
* This scanning priority is essentially the inverse of IO cost.
*/
anon_prio = swappiness;
file_prio = 200 - anon_prio;

Это интересно. Два отличных значения получены из swappiness . anon_prio и file_prio содержат эти значения. Когда один увеличивается, другой уменьшается, и наоборот .

Значение подкачки в Linux фактически устанавливает соотношение между двумя значениями.

Золотое сечение

Страницы файлов содержат данные, которые можно легко извлечь, если освободить эту память. Linux может просто прочитать файл снова. Как мы уже видели, если данные файла были изменены в оперативной памяти, эти изменения должны быть записаны в файл, прежде чем страница файла может быть освобождена. Но, так или иначе, файловая страница в оперативной памяти может быть переполнена чтением данных из файла. Так зачем добавлять эти страницы в раздел подкачки или файл подкачки? Если вам снова понадобятся эти данные, вы можете также прочитать их обратно из исходного файла вместо избыточной копии в пространстве подкачки. Таким образом, страницы файла не хранятся в разделе подкачки. Они «хранятся» обратно в исходном файле.

С анонимными страницами нет никакого основного файла, связанного со значениями в памяти. Значения на этих страницах были получены динамически. Вы не можете просто прочитать их обратно из файла. Единственный способ восстановить анонимные значения памяти страницы — это сохранить данные где-нибудь до освобождения памяти. И это то, что держит своп. Анонимные страницы, на которые вы будете ссылаться снова.

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

Как видно из последнего фрагмента кода, есть две переменные. Один называется file_prio для «приоритет файла», а другой называется anon_prio для «приоритет анонимный».

  • Переменная anon_prio установлена ​​в значение подкачки Linux.
  • Значение file_prio установлено на 200 минус значение anon_prio .

Эти переменные содержат значения, которые работают в тандеме. Если они оба установлены на 100, они равны. Для любых других значений anon_prio уменьшится со 100 до 0, а file_prio увеличится со 100 до 200. Два значения file_prio в сложный алгоритм, который определяет, работает ли ядро ​​Linux с предпочтением восстановления (освобождения) файловых страниц или анонимным страницы.

Вы можете думать о file_prio как о готовности системы освободить файловые страницы, а о anon_prio — о готовности системы освободить анонимные страницы. Чего эти значения не делают, так это устанавливают какой-либо триггер или порог, когда будет использоваться своп. Это решено в другом месте.

Но когда необходимо освободить память, эти две переменные — и их соотношение — учитываются алгоритмами восстановления и подкачки, чтобы определить, какие типы страниц предпочтительнее рассматривать для освобождения. И это диктует, будет ли связанная активность жесткого диска обрабатывать файлы для файловых страниц или пространство подкачки для анонимных страниц.

Когда своп фактически включается?

Мы установили, что значение подкачки в Linux устанавливает предпочтительный тип страниц памяти, которые будут сканироваться для возможного восстановления. Это хорошо, но что-то должно решить, когда своп собирается сработать.

Каждая зона памяти имеет верхний и нижний отметки. Это системные значения. Это проценты оперативной памяти в каждой зоне. Именно эти значения используются в качестве пороговых значений запуска свопа.

Чтобы проверить, какие у вас /proc/zoneinfo и нижние отметки уровня воды, загляните в файл /proc/zoneinfo с помощью этой команды:

  меньше / proc / zoneinfo 

less / proc / zoneinfo в окне терминала

Каждая из зон будет иметь набор значений памяти, измеренных в страницах. Вот значения для зоны DMA32 на тестовом компьютере. Низкая отметка составляет 13966 страниц, а верхняя отметка — 16759 страниц:

Значения водяного знака DMA32 в окне терминала

  • В нормальных условиях работы, когда объем свободной памяти в зоне падает ниже нижнего уровня зоны, алгоритм подкачки начинает сканирование страниц памяти в поисках памяти, которую он может восстановить, принимая во внимание относительные значения anon_prio и file_prio .
  • Если для Linux значение подкачки установлено равным нулю, подкачка происходит, когда объединенное значение файловых страниц и свободных страниц меньше верхней отметки.

Таким образом, вы можете видеть, что вы не можете использовать значение подкачки в Linux, чтобы влиять на поведение подкачки в отношении использования ОЗУ. Просто так не работает.

Что должно быть установлено Swapiness?

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

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

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

Вот некоторые моменты для рассмотрения:

  • Попытка «отключить подкачку» путем установки значения подкачки в Linux на ноль просто переводит активность, связанную со свопом, на активность, связанную с файлами.
  • Если у вас устаревшие механические жесткие диски, вы можете попытаться уменьшить значение подкачки в Linux, чтобы сместить анонимную страницу и уменьшить отток разделов подкачки. Конечно, когда вы выключаете одну настройку, другая настройка увеличивается. Уменьшение оттока подкачки, вероятно, увеличит отток файловой системы. Но ваш компьютер может быть счастливее, предпочитая один метод другому. Действительно, единственный способ узнать наверняка — это попытаться увидеть.
  • Для одноцелевых серверов, таких как серверы баз данных, вы можете получить рекомендации от поставщиков программного обеспечения для баз данных. Очень часто эти приложения имеют свои собственные специально разработанные процедуры кеширования файлов и управления памятью, на которые вам лучше положиться. Поставщики программного обеспечения могут предложить значение перестановки Linux в соответствии со спецификацией машины и рабочей нагрузкой.
  • Для среднего пользователя настольного компьютера с относительно новым оборудованием? Оставь как есть.

Как установить значение подкачки в Linux

Прежде чем изменить значение своппинга, вам необходимо знать его текущее значение. Если вы хотите немного уменьшить его, вопрос немного меньше, чем что? Вы можете узнать с помощью этой команды:

  cat / proc / sys / vm / swappiness 

cat / proc / sys / vm / swappiness

Чтобы настроить значение подкачки, используйте команду sysctl :

  sudo sysctl vm.swappiness = 45 

sudo sysctl vm.swappiness = 45 в окне терминала

Новое значение используется сразу, перезагрузка не требуется.

Фактически, если вы перезагрузите компьютер, значение подкачки вернется к значению по умолчанию, равному 60. Когда вы закончите экспериментировать и определились с новым значением, которое хотите использовать, вы можете сделать его постоянным при перезагрузках, добавив его в /etc/sysctl.conf Файл /etc/sysctl.conf . Вы можете использовать любой редактор, который вы предпочитаете. Используйте следующую команду для редактирования файла с помощью редактора nano :

  sudo nano /etc/sysctl.conf 

sudo nano /etc/sysctl.conf в окне терминала

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

  vm.swappiness = 35 

/Etc/sysctl.conf в редакторе нано в окне терминала

Чтобы сохранить изменения и выйти из nano , нажмите «Ctrl + O», нажмите «Enter» и нажмите «Ctrl + Z».

Управление памятью сложное

Управление памятью сложно. И именно поэтому для обычного пользователя обычно лучше оставить это ядру.

Легко думать, что вы используете больше оперативной памяти, чем вы. Такие утилиты, как top и free могут произвести неправильное впечатление. Linux будет использовать свободную оперативную память для различных своих целей, например для кэширования диска. Это искусственно увеличивает показатель «используемой» памяти и уменьшает показатель «свободной» памяти. Фактически, ОЗУ, используемое в качестве дискового кэша, помечается как «использованное» и «доступное», потому что оно может быть восстановлено в любое время, очень быстро.

Для непосвященных это может показаться, что своп не работает или что значение своппинга нужно изменить.

Как всегда, дьявол кроется в деталях. Или, в этом случае, демон. Демон обмена ядрами.

Похожие посты
Как сделать

Как получить возмещение за покупки в iTunes или App Store

Как сделать

Поверхностное перо не работает? Вот как это исправить

Как сделать

Как настроить и использовать Fire TV Recast

Как сделать

Как изменить рингтон по умолчанию на вашем iPhone