что такое свопинг в ос
Данное слово произошло от английского swapping. Перевод (дословный) выглядит как «обменивать». Это слово в английском языке присутствует уже давно. И там оно является обычным глаголом. И только в русском языке у него совсем другой смысл. Есть несколько вариантов толкования данного слова, и все они относятся к различным сферам деятельности:
Свопинг в мире акций. Таким термином брокеры на биржах обозначали быстрый обмен акциями. В настоящее время свопинг тоже присутствует на крупных биржах. На «Форексе» тоже есть такое понятие, но там оно обозначает быструю продажу всех акций.
Свопинг в компьютерном мире. В мире ПК и ноутбуков этим термином обзывают процесс освобождения части оперативной памяти и перенесение данных в заранее созданный файл подкачки на жестком диске. Весьма полезная опция для тех, у кого мало оперативной памяти.
Работа ОС с файлом подкачки
Стоит сразу отметить, что при катастрофическом недостатке RAM свопинг и виртуальная память здорово выручают операционную систему компьютера. Вообще, специалисты рекомендуют использовать файл подкачки тем, у кого имеется всего 4 гигабайта физической оперативной памяти на борту. Обязательно его использование и в том случае, если памяти меньше. А вот если больше, то файл подкачки и не нужен вовсе. Каков же принцип работы «оперативки» с файлом подкачки? Рассмотрим его подробнее.
В том случае, если оперативной памяти не хватает, ОС перемещает часть неиспользуемой информации из RAM в специально созданный файл на жестком диске компьютера. Таким образом освобождается место в физической оперативной памяти для новых задач. Такой процесс необходим в том случае, если «оперативки» критически не хватает. Вот что такое свопинг в ОС. А теперь поговорим о том, как настроить файл подкачки.
Настройка файла подкачки в «Виндовс»
Какие недостатки имеет свопинг? По сути, недостаток только один: очень медленная скорость. Если рабочий процесс помещается в файл подкачки, то его работоспособность резко снижается. Дело в том, что скорость чтения данных с жесткого диска в несколько десятков раз меньше, чем из флеш-памяти физической «оперативки». Потому и скорость работы процесса будет никакой. Возможны различные тормоза и глюки. Но это случается редко, так как в файл подкачки обычно помещаются процессы, которые не работают в данный конкретный момент времени.
Также весьма распространена проблема с твердотельными накопителями. Если разместить файл подкачки на SSD, то свопинг быстро убьет его. Ресурс-то ограничен. Потому и рекомендуется размещать файлы подкачки исключительно на механических жестких дисках. У них ресурс возможных операций куда больше, чем у твердотельных накопителей.
Свопинг
При разработке системы всегда есть желание сделать память как можно быстрее. С другой стороны, потребности в памяти очень велики и постоянно растут. Современные персональные системы имеют около 150 Гбайт дисковой памяти, и этого часто оказывается недостаточно, особенно если идет работа с мультимедиа или просто с высококачественными изображениями.
Очевидно, что система с 150 Гб статического ОЗУ будет иметь стоимость, скажем так, совершенно не персональную, не говоря уже о габаритах, потребляемой мощности и прочем. К счастью, далеко не все, что хранится в памяти системы, используется одновременно. В каждый заданный момент исполняется только часть программного обеспечения, и оно работает только с частью данных.
Статистика утверждает, что в пределах одной программы 90% времени исполняется код, который занимает 10% места, а остальные 90% кода исполняются только 10% времени. Для данных разница в частоте использования, по-видимому, не столь резкая, но также существует
Еще одним фактором использования памяти является наличие операций ввода-вывода в программе. На рисунке 2.16 показан график зависимости коэффициента загрузки процессора в зависимости от числа одновременно выполняемых процессов и доли времени, проводимого этими процессами в состоянии ожидания ввода-вывода.
Рис. 2.16. Зависимость загрузки процессора от числа задач и интенсивности ввода-вывода
Из рисунка видно, что для загрузки процессора на 90% достаточно всего трех счетных задач. Однако для того, чтобы обеспечить такую же загрузку интерактивными задачами, выполняющими интенсивный ввод-вывод, потребуются десятки таких задач. Необходимым условием для выполнения задачи является загрузка ее в оперативную память, объем которой ограничен. В этих условиях и используется свопинг. При свопинге некоторые процессы (обычно находящиеся в состоянии ожидания) временно выгружаются на диск. Планировщик операционной системы не исключает их из своего рассмотрения, и при наступлении условий активизации некоторого процесса, находящегося в области свопинга на диске, этот процесс перемещается в оперативную память. Если свободного места в оперативной памяти не хватает, то выгружается другой процесс.
При свопинге, в отличие от рассмотренных ранее методов реализации виртуальной памяти, процесс может перемещаться между памятью и диском целиком, то есть в течение некоторого времени процесс может полностью отсутствовать в оперативной памяти. Существуют различные алгоритмы выбора процессов на загрузку и выгрузку, а также различные способы выделения оперативной и дисковой памяти загружаемому процессу.
В системах коллективного пользования размер памяти часто выбирают так, чтобы система балансировала где-то между состоянием, когда все программы держат свое рабочее множество в ОЗУ, и оверсвопом. Точное положение точки балансировки определяется в зависимости от соотношения скорости процессора со скоростью обмена с диском и с потребностями прикладных программ. Во многих старых учебниках рекомендуется подбирать объем памяти так, чтобы канал дискового обмена был загружен на 50%
swap (своп) или файл подкачки
Swap (своп) или файл подкачки
Своп (swap) — это файл, либо раздел, т.е. определенное место на жестком диске (HDD), которое используется для «выгрузки» в него неиспользуемых страниц из оперативной памяти. Не зацикливайтесь на словосочетании «страница памяти» — это не столь важно на данный момент, ибо это уже углубление в принципы действия, которые вам не нужны на данном этапе и могут вообще не понадобится.
Стандартный HDD 3,5″ (На фото HDD от Western Digital)
Говоря же простым языком, в своп из оперативной памяти выгружается вся та информация, которая на данный момент не используется и к которой уже какое-то время не обращается ни одна программа. Т.е. своп в каком-то смысле создает дополнительный объем для вашей оперативной памяти, в который выгружается все ненужное на данный момент, но то, что может в скором времени понадобится какой-либо программе.
Думаю, многие знают и понимают, что HDD обладают в разы меньшим быстродействием, чем оперативная память и у вас может возникнуть логичный вопрос — зачем же использовать заведомо более медленное устройство?
Дело тут в том, что не возможно предусмотреть и предугадать объем оперативной памяти на каждом компьютере, а так же количество программ и процессов, которые будут запущены одновременно. Отсюда возникают ситуации, когда на некоторых компьютерах какая-либо программа может работать нормально, а на некоторых компьютерах появится проблема недостатка памяти.
Как раз для решения проблемы недостатка памяти и было придумано организовать специальное место на HDD — своп, в которое бы выгружалась вся ненужная на данный момент информация из оперативной памяти, освобождая место для активных программ и информации, которая используется на данный момент.
Если же к этой выгруженной в своп информации вновь поступает запрос, она загружается обратно в оперативную память, а из свопа удаляется, или просто поверх нее записывается что-то другое. А из-за того, что своп находится в одном и том же месте на HDD, время на поиск нужной информации минимально и не сравнится с процессом поиска, обработки и загрузки этой информации по-новой из директории программы.
С тем, что такое своп и зачем он нужен вроде бы разобрались. =) Надеюсь я не слишком вас утомил, ибо я старался объяснить подробнее и более простым языком, получилось у меня или нет уже вы мне скажете.
Теперь давайте перейдем к настройке самого своп-файла.
Настройки фйла подкачки в OC Windows (Диск E — это отдельный физический HDD)
В операционных системах на базе ядра Linux swap — представляет из себя специальное место на жестком диске, которое создается еще на стадии разметки диска при установке операционной системы. В Windows же дела обстоят иначе, тут swap представляется из себя файл pagefile.sys, который является скрытым системным файлом. Он располагается в файловой системе на одном или на нескольких логических дисках. И тут кроется с одной стороны преимущество, но с другой стороны и недостаток.
Преимущество такого решения в том, что можно мгновенно изменять размер свопа, но значительный недостаток кроется в том, что файл подкачки может фрагментироваться, т.е. разбиться на части, из-за других файлов, находящихся на логическом разделе. Подробнее о фргаментации вы можете прочитать в этой статье.
Поэтому для Windows есть определенный ряд правил и рекомендаций, которые нужно выполнять, если вы хотите что бы ваш компьютер нормально работал и не терял производительность из-за фрагментации своп-файла.
Практические советы по настройке своп-файла (файла подкачки) в ОС Wnidows
1 — Файл подкачки нужно располагать как можно ближе к начальным секторам жесткого диска (HDD), потому что именно в этом месте у большинства HDD самые высокие показатели скорости чтения и записи.
В идеале заняться настройкой файла подкачки нужно как только вы установили систему, пока ваш жесткий диск не забит файлами.
2 — Если у вас несколько логических разделов на жестком диске (HDD), то файл подкачки нужно располагать на первом по счету из них, т.е. как можно ближе к начальным секторам.
3 — Если у вас в компьютере несколько жестких дисков (HDD), то своп-файл нужно располагать на самом быстром из них.
4 — Перед тем, как задавать новый размер файла подкачки обязательно на время удалите файл подкачки (на всех дисках задать — «Без файла подкачки») и проведите дефрагментацию выбранного вами под swap-файл раздела каким-нибудь дефрагментатором (например Defraggler).
5 — Не разбивайте файл подкачки на несколько логических или физических дисков — это только замедлит работу системы.
6 — Не стоит помещать файл подкачки на отдельный раздел, равный ему по размеру и отформатированный в журнальной файловой системе.
Например, в файловой системе NTFS из-за MFT логический раздел делится ровно на две части. Таким образом ваш файл подкачки на таком логическом разделе гарантированно будет разбит на 2 части, а то и более, так же не всегда есть возможность разместить подобный раздел в начале диска. И в конечном итоге вы таким образом ограничите себя в выборе максимального размера файла подкачки.
Какого размера должен быть файл подкачки?
Размер файла подкачки обязательно должен быть фиксированным, т.е. «Исходный размер» и «Максимальный размер» должны быть идентичными. Таким образом мы исключим возможную фрагментацию файла подкачки при разрастании от «Исходного» до «Максимального» размера.
Объем RAM Размер swap-файла
256МБ 1024МБ
512МБ 2048МБ
1024МБ-2048МБ 4096МБ
3072МБ-4096МБ 6144МБ-8192МБ
8192МБ и более можно указать минимальный размер (по-сути он не нужен, но
многие программы требуют его наличия)
В защиту swap’а [в Linux]: распространенные заблуждения
Прим. перев.: Эта увлекательная статья, в подробностях раскрывающая предназначение swap в Linux и отвечающая на распространённое заблуждение на этот счёт, написана Chris Down — SRE из Facebook, который, в частности, занимается разработкой новых метрик в ядре, помогающих анализировать нагрузку на оперативную память. И начинает он своё повествование с лаконичного TL;DR…
Предисловие
Работая над улучшением и использованием cgroup v2, я успел поговорить со многими инженерами об их отношении к управлению памяти, особенно о поведении приложения под нагрузкой и об эвристическом алгоритме операционной системы, используемым «под капотом» для управления памятью.
Повторяющейся темой этих обсуждений стал swap. Тема swap активно оспаривается и плохо понимается даже теми, кто проработал с Linux долгие годы. Многие воспринимают его как нечто бесполезное или очень вредное — мол, это пережиток прошлого, когда памяти было мало и диски являлись необходимым злом, предоставляющим столь нужное пространство для подкачки. И до сих пор, все последние годы, я достаточно часто наблюдаю споры вокруг этого утверждения: немало дискуссий провёл и я сам с коллегами, друзьями, собратьями по индустрии, помогая им понять, почему swap — это по-прежнему полезная концепция на современных компьютерах, имеющих гораздо больше физической памяти, чем в былые времена.
Широкое недопонимание существует и насчёт предназначения swap’а: многие люди видят в нём лишь «медленную дополнительную память» для использования в критических ситуациях, но не понимают его вклад в адекватное функционирование операционной системы в целом при нормальной нагрузке.
Многие из нас слышали такие распространённые фразы о памяти: «Linux использует слишком много памяти», «swap должен быть вдвое больше размера физической памяти» и т.п. Эти заблуждения легко развеять и их обсуждения стали более точными в последние годы, однако миф о «бесполезном» swap гораздо больше завязан на эвристику и таинство, которые не поддаются объяснению с простой аналогией, — для его обсуждения требуется более глубокое понимание управления памятью.
Введение
Сложно говорить, почему наличие swap’а и перемещение в него страниц памяти — хорошо при нормальной работе, не разделяя понимание некоторых базовых нижележащих механизмов в управлении памятью в Linux, поэтому давайте убедимся, что говорим на одном языке.
Типы памяти
В Linux существует множество различных типов памяти, и у каждого из этих типов есть свои свойства. Понимание их особенностей — ключ к пониманию, почему swap важен.
Например, есть страницы («блоки» памяти, обычно по 4k), ответственные за хранение кода для каждого процесса, запущенного на компьютере. Есть также страницы, ответственные за кэширование данных и метаданных, относящихся к файлам, к которым обращаются эти программы для ускорения своих обращений в будущем. Они являются частью страничного кэша [page cache], и далее я буду на них ссылаться как на файловую [file] память.
Есть и другие типы памяти: разделяемая память, slab-память, память стека ядра, буферы и иные, — но анонимная память и файловая память известны лучше других и просты для понимания, поэтому именно они будут использоваться в примерах, которые, впрочем, равносильно применимы и к другим типам.
Память с высвобождением и без
В размышлениях о конкретном типе памяти одним из главных вопросов становится возможность её высвобождения. «Высвобождение» [reclaim] означает, что система может, без потери данных, удалить страницы этого типа из физической памяти.
Для некоторых типов страниц это сделать весьма просто. Например, в случае чистой [clean], т.е. немодифицированной, памяти страничного кэша мы просто кэшируем для лучшей производительности то, что уже есть на диске, поэтому можем сбросить страницу без необходимости в каких-либо специальных операциях.
Для некоторых типов страниц это возможно, но непросто. Например, в случае грязной [dirty], т.е. модифицированной, памяти страничного кэша мы не можем просто сбросить страницу, потому что на диске ещё нет произведённых модификаций. Поэтому необходимо или отказаться от высвобождения [reclamation], или перенести наши изменения обратно на диск перед тем, как сбрасывать эту память.
Для некоторых типов страниц это невозможно. Например, упомянутые раньше анонимные страницы могут существовать только в памяти и никаком ином резервном хранилище, поэтому их необходимо хранить здесь (т.е. в самой памяти).
О природе swap’а
Если поискать объяснения, зачем нужен swap в Linux, неизбежно находятся многочисленные обсуждения его предназначения просто как расширения физической RAM для критических случаев. Вот, например, случайный пост, который я вытащил из первых результатов в Google по запросу «what is swap»:
«По своей сути swap — это экстренная память; запасное пространство для случаев, когда система на какое-то время нуждается в большем количестве физической памяти, чем доступно в RAM. Она считается «плохой» в том смысле, что медленная и неэффективная, и если системе постоянно требуется использовать swap, очевидно, ей не хватает памяти. [..] Если у вас достаточно RAM для удовлетворения всех потребностей и вы не ожидаете её превышения, вы можете прекрасно работать и без swap-пространства».
Поясню, что я вовсе не обвиняю автора этого комментария за содержимое его поста — это «общеизвестный факт», признаваемый многими системными администраторами Linux и являющийся, пожалуй, одним из наиболее вероятных ответов на вопрос о swap’е. К сожалению, это вдобавок и неправильное представление о предназначении и использовании swap’а, особенно на современных системах.
Как я уже писал выше, высвобождение анонимных страниц «невозможно», поскольку анонимные страницы по своей природе не имеют резервного хранилища, к которому можно обратиться при удалении данных из памяти, — таким образом, их высвобождение приведёт к полной утере данных из соответствующих страниц. Однако… что будет, если мы смогли бы создать такое хранилище для этих страниц?
Вот именно для этого и существует swap. Swap — область хранения для этих, кажущихся «невысвобождаемыми» [unreclaimable], страниц, позволяющая отправлять их на устройство хранения по запросу. Это означает, что их можно начинать считать такими же доступными для высвобождения, как и их более простые в этом смысле друзья (вроде чистых файловых страниц), что позволяет эффективнее использовать свободную физическую память.
Swap — это преимущественно механизм для равного высвобождения, а не для срочной «дополнительной памяти». Не swap замедляет работу вашего приложения — замедление происходит из-за начала совокупной конкуренции за память.
Итак, в каких же ситуациях это «равное высвобождение» будет оправданно выбирать высвобождение анонимных страниц? Вот абстрактные примеры некоторых не самых редких сценариев:
Что происходит с использованием swap и без него
Давайте посмотрим на типовые ситуации и к чему они приводят при наличии и отсутствии swap. О метриках «конкуренции за память» я рассказываю в докладе про cgroup v2.
Без конкуренции или с малой конкуренцией за память
С умеренной или высокой конкуренцией за память
При временных всплесках в потреблении памяти
Окей, я хочу системный swap, но как его настроить для конкретных приложений?
Вы же не думали, что в этой статье не будет упоминаний использования cgroup v2?
И в этом вопросе нельзя просто положиться на OOM killer. Потому что OOM killer вызывается только в самых критичных ситуациях, когда система уже оказалась в значительно нездоровом состоянии и, возможно, находилась в нём некоторое время. Необходимо самостоятельно и оппортунистически разрешить ситуацию ещё до того, как задумываться об OOM killer’е.
Тем не менее, выявить давление на память достаточно трудно с помощью традиционных счётчиков памяти в Linux. Нам доступно нечто, что каким-то образом относится к проблеме, однако скорее по касательной: потребление памяти, количество операций сканирования страниц и т.п. — и по одним этим метрикам очень трудно отличить эффективную конфигурацию памяти от той, что приводит к конкуренции за память. У нас есть группа в Facebook, возглавляемая Johannes’ом и работающая над новыми метриками, упрощающими демонстрацию давления на память, — это должно помочь нам в будущем. Больше информации об этом можно получить из моего доклада про cgroup v2, где я начинаю подробнее рассказывать об одной из метрик.
Тюнинг
Сколько же swap’а мне тогда нужно?
В общем случае минимальное количество swap-пространства, требуемого для оптимального управления памятью, зависит от количества анонимных страниц, которые привязаны к пространству памяти и к которым редко обращается приложение, а также от стоимости высвобождения этих анонимных страниц. Последнее — это в большей степени вопрос о том, какие страницы больше не должны удаляться, чтобы уступить место тем анонимным страницам, к которым редко обращаются.
Если у вас достаточно дискового пространства и свежее (4.0+) ядро, большее количество swap’а почти всегда лучше, чем меньшее. В более старых ядрах kswapd — один из процессов ядра, что отвечает за управление swap’ом, — исторически слишком усердствовал в перемещении памяти в swap, делая это тем активнее, чем больше swap’а было доступно. В последнее время поведение swapping’а при наличии большого swap-пространства значительно улучшили. Так что, если вы работаете с ядром 4.0+, большой swap не приведёт к чрезмерному swapping’у. В общем, на современных ядрах нормально иметь swap размером в несколько гигабайт, если такое пространство у вас есть.
Если же дисковое пространство ограничено, ответ в действительности зависит от компромисса, на который вы готовы пойти, и особенностей окружения. В идеале у вас должно быть достаточно swap’а, чтобы система оптимально функционировала при нормальной и пиковой (по памяти) нагрузке. Рекомендую настроить несколько тестовых систем с 2-3 Гб swap’а или более и понаблюдать, что происходит на протяжении недели или около того в разных условиях нагрузки (на память). Если на протяжении этой недели не случалось ситуаций резкой нехватки памяти, что означает недостаточную пользу такого теста, всё закончится занятостью swap’а небольшим количеством мегабайт. В таком случае, пожалуй, разумно будет иметь swap хотя бы такого размера с добавлением небольшого буфера для меняющихся нагрузок. Также atop в режиме логирования в столбце SWAPSZ может показать, страницы каких приложений попадают в swap. Если вы ещё не используете эту утилиту на своих серверах для логирования истории состояний сервера — возможно, в эксперимент стоит добавить её настройку на тестовых машинах (в режиме логирования). Заодно вы узнаете, когда приложение начало перемещать страницы в swap, что можно привязать к событиям из логов или другим важным показателям.
Ещё стоит задуматься о типе носителя для swap’а. Чтение из swap имеет тенденцию быть очень случайным, поскольку нельзя уверенно предсказать, у каких страниц будет отказ и когда. Для SSD это не имеет особого значения, а вот для вращающихся дисков случайный ввод/вывод может оказаться очень дорогим, поскольку требует физических движений. С другой стороны, отказы у файловых страниц обычно менее случайны, поскольку файлы, относящиеся к работе одного запущенного приложения, обычно менее фрагментированы. Это может означать, что для вращающегося диска вы можете захотеть сместиться в сторону высвобождения файловых страниц вместо swapping’а анонимных страниц, но, опять же, необходимо протестировать и оценить, как будет соблюдаться баланс для вашей рабочей нагрузки.
Для пользователей ноутбуков/десктопов, желающих использовать swap для перехода в спящий режим [hibernate], этот факт также необходимо учитывать, поскольку swap-файл тогда должен как минимум соответствовать размеру физической оперативной памяти.
Какой должна быть настройка swappiness?
Это означает, что vm.swappiness — это по существу просто соотношение дорогой анонимной памяти, которую можно высвобождать и приводить к отказам, в сравнении с файловой памятью для вашего железа и рабочей нагрузки. Чем ниже значение, тем активнее вы сообщаете ядру, что редкие обращения к анонимным страницам дороги для перемещения в swap и обратно на вашем оборудовании. Чем выше это значение, тем вы больше говорите ядру, что стоимость swapping’а анонимных и файловых страниц одинакова на вашем оборудовании. Подсистема управления памятью будет по-прежнему пытаться решить, помещать в swap файловые или анонимные страницы, руководствуясь тем, насколько «горяча» память, однако swappiness склоняет подсчёт стоимости в пользу большего swapping’а или большего пропуска кэшей файловой системы, когда доступны оба способа. На SSD-дисках эти подходы практически равны по стоимости, поэтому установка vm.swappiness = 100 (т.е. полное равенство) может работать хорошо. На вращающихся дисках swapping может быть значительно дороже, т.к. в целом он требует случайного чтения, поэтому вы скорее всего захотите сместиться в сторону меньшего значения.
Реальность же в том, что большинство людей не имеют представления о том, чего требует их железо, поэтому настроить это значение, основываясь лишь на инстинкте, затруднительно — это вопрос, требующий личного тестирования с разными значениями. Можно также заняться анализом состава памяти вашей системы, основных приложений и их поведения в условиях небольшого высвобождения памяти.