Зачем использовать swap, когда в ОЗУ имеется достаточно свободного места?

Использование пространства swap вместо RAM может резко замедлить ПК.

Итак, почему, когда у меня более чем достаточно RAM, моя система Linux (Arch) использует своп?

Оформить мой выходной код ниже:

conky output

Кроме того, может ли это быть причиной проблем с быстрой и системной реакцией, которые у меня возникают?

Вывод free -m:

$ free -m
             total       used       free     shared    buffers     cached
Mem:          1257       1004        252          0         51        778
-/+ buffers/cache:        174       1082
Swap:          502        144        357
116 голосов | спросил Stefan 3 +04002010-10-03T12:10:11+04:00312010bEurope/MoscowSun, 03 Oct 2010 12:10:11 +0400 2010, 12:10:11

8 ответов


83

Для Linux-систем нормально использовать some swap, даже если RAM все еще свободен. Ядро Linux переместится на страницы памяти, которые очень редко используются (например, экземпляры getty, когда вы используете только X11 и какой-то другой неактивный демон).

Использование пространства подкачки становится проблемой только в том случае, когда доступно недостаточно ОЗУ, , и ядро ​​вынуждено постоянно перемещать страницы памяти для свопинга и возврата в ОЗУ, чтобы поддерживать работу приложений. В этом случае приложения системного монитора будут показывать много операций ввода-вывода диска.

Для сравнения, моя система Ubuntu 10.04 с двумя пользователями, вошедшими в систему с сеансами X11, работающими на рабочем столе GNOME, использует ~ 600 Мбайт свопа и ~ 1 ГБ ОЗУ (не считая буферов и fs-кеш), поэтому я бы сказал, что ваш цифры для использования подкачки выглядят нормально.

ответил Riccardo Murri 3 +04002010-10-03T14:17:35+04:00312010bEurope/MoscowSun, 03 Oct 2010 14:17:35 +0400 2010, 14:17:35
88

Такое поведение можно настроить, установив значение:

/proc/sys/vm/swappiness

Значение по умолчанию - 60. Установка значения 0 означает никогда не использовать swap, когда осталось оставшееся RAM, а 100 - как можно скорее заменяет память.

Временное изменение значения (потерянное при перезагрузке):

sudo sysctl vm.swappiness=10

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

/etc/sysctl.conf

как root (например, sudo nano /etc/sysctl.conf) и изменить или добавить (если нет) строку:

vm.swappiness

до требуемого значения. Если этот файл не существует (например, в Arch Linux), попробуйте /etc/sysctl.d/99-sysctl.conf.

Были некоторые споры о том, хорошо ли или нет замена с доступной свободной памятью, но Справка Ubuntu действительно рекомендует значение 10 для настольных систем . См. Также этот учебник по Digital Ocean для CentOS .

ответил Marcel Stimberg 3 +04002010-10-03T14:17:59+04:00312010bEurope/MoscowSun, 03 Oct 2010 14:17:59 +0400 2010, 14:17:59
42

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

  • Производительность увеличивается, потому что иногда RAM лучше использовать для кеша диска, чем для хранения программной памяти. Поэтому лучше поменять программу, которая некоторое время неактивна, и вместо этого хранить часто используемые файлы в кеше.

  • Отзывчивость улучшается путем замены страниц, когда система находится в режиме ожидания, а не когда память заполнена и какая-то программа запущена и запрашивает больше ОЗУ для выполнения задачи.

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

ответил Gilles 4 +04002010-10-04T03:03:30+04:00312010bEurope/MoscowMon, 04 Oct 2010 03:03:30 +0400 2010, 03:03:30
8

Это старый пост, однако я все равно позволю себе высказать свои мысли здесь.

Начиная с ниже, Linux сначала разделит память на страницы (обычно 4K на страницу в системе x86_64). После этого создается виртуальная память, отображение которой осуществляется с использованием физической памяти с использованием MMU (модуля управления памятью).

Процессы выделяют память из области виртуальной памяти, поэтому, пожалуйста, обратите внимание: если вы увидите /proc /meminfo, вы увидите VMalloc * в качестве сведений о виртуальной памяти.

Предположим, у вас есть процесс, который запрашивает память (скажем, 300 МБ - веб-браузер). Процессу будет выделено 300 МБ из виртуальной памяти, однако при этом не обязательно отображать карту памяти (которая отображается в физической памяти). Существует концепция «Copy on Write» для управления памятью, в соответствии с которой, если ваши процессы фактически используют память, выделенную из виртуальной памяти (то есть, она записывает в память), только тогда она отображается в физическую память. Это помогает ядру эффективно работать в многопроцессорной среде.

Что такое кеш?

Много памяти, используемой процессами, совместно используется. Допустим, библиотека glibc используется почти всеми процессами. В чем смысл сохраняя несколько копий glibc в памяти, когда каждый процесс может получить доступ к тому же месту в памяти и выполнять работу. Такие часто используемые ресурсы хранятся в кеше, поэтому, когда процессы требуют, на них можно ссылаться на одинаковое расположение памяти. Это помогает ускорить процессы, как чтение glibc (и т. д.) снова & снова с диска потребуется много времени.

Вышеупомянутое было для разделяемых библиотек за сканирование, аналогично также верно и для чтения файлов. Если вы читаете большой файл (скажем, 100-200 МБ) в первый раз, это займет много времени. Однако, когда вы попытаетесь сделать то же самое, что и снова, это будет быстрее. Данные были кэшированы в памяти, и повторное чтение не было выполнено для всех блоков.

Что такое буфер?

Что касается буфера, когда процессы выполняют операции ввода-вывода, он использует буфер ядра для записи данных на диск. Процессы, запросы ядро, чтобы выполнить эту работу. Таким образом, от имени процесса ядро ​​записывает данные в свой «буфер» и сообщает процессу, что запись выполнена. В асинхронном режиме ядро ​​будет синхронизировать эти данные в буфере на диск. Таким образом, процессы полагаются на ядро ​​для выбора правильное время для синхронизации данных с диском, и процессы могут продолжать работать в будущем. Помните, что это общий ввод-вывод, который делают обычные процессы. Однако специализированные процессы, которые должны подтвердить, что ввод-вывод на самом деле выполняется на диске, могут использовать другой механизм для ввода-вывода на диске. Некоторые из утилит openource - libaio. Кроме того, есть способы вызвать явную синхронизацию с FD, открытыми в вашем контексте процессов, чтобы вы принудительно ядро, чтобы синхронизировать данные на диске для записи, которую вы могли бы сделать.

Что такое ошибки страниц?

Рассмотрим пример, когда вы запускаете процесс (скажем, веб-браузер), чей двоичный файл составляет около 300 МБ. Тем не менее, полный 300 МБ бинарного веб-браузера не запускается немедленно. Процесс переходит от функций к функциям в коде. Как было сказано ранее, виртуальная память будет потребляться в 300 МБ однако не все карты памяти привязаны к физической памяти (RSS-резидентная память будет меньше, см. верхний вывод). Когда выполнение кода достигает точки, для которой память фактически не отображается физически, страница ошибка будет проблемой. Ядро будет отображать эту память на физическую, связывать страницу памяти с вашим процессом. Такая ошибка страницы называется «Незначительная страница» Дефекты». Точно так же, когда процесс выполняет файловые операции ввода /вывода, возникают большие страницы.

Когда и почему происходит свопинг?

Ситуация 1:

В соответствии с приведенными выше подробностями давайте рассмотрим сценарий, когда хороший объем памяти будет отображаться в памяти. И теперь процессы запускается, что требует памяти. Как обсуждалосьвыше, ядро ​​будет иметь некоторое отображение памяти. Однако не хватает физической ОЗУ доступный для отображения памяти. Теперь ядро ​​сначала рассмотрит кеш, у него будут старые страницы памяти, которые не используются. Он очистит эти страницы от отдельного раздела (называемого SWAP), освободит некоторые страницы и отобразит свободные страницы в новый запрос. Поскольку запись на диск намного медленнее, чем твердотельная ОЗУ, этот процесс занимает много времени, и, следовательно, наблюдается замедление.

Ситуация 2:

Допустим, вы видите, что в системе доступно много свободной памяти. Даже тогда вы видите, что происходит много изменений. Возможна проблема фрагментации памяти. Рассмотрим процессы, требующие 50 Мб непрерывной памяти из ядра. (иметь в виду смежные). Очевидно, ядро ​​выделило бы страницы случайным образом к разным процессам и освободили некоторые из них. Однако, когда мы требуем непрерывной памяти, ей придется искать кусок который удовлетворяет требованиям процессов. Если он не сможет получить такую ​​память, ему придется выполнить замену некоторых старых страниц памяти, а затем выделить смежные. Даже в таких случаях произойдет СВАП. Начиная ядро ​​версии 2.6 и выше, такие проблемы фрагментации значительно сократились. Однако, если система работает в течение длительного времени, такие проблемы все равно могут возникать.

См. этот пример ( вывод vmstat )

2016-10-29 03:55:32 procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
2016-10-29 03:55:32  r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
2016-10-30 03:56:04 19 23 2914752 4692144 3344908 12162628 1660    1  8803 12701 4336 37487 14  7 40 38  0
2016-10-30 03:56:34  3 20 2889296 4977580 3345316 12026752 2109    2  8445 14665 4656 36294 12  7 46 34  0
2016-10-30 03:57:04  1 11 3418868 4939716 3347804 11536356  586 4744  2547  9535 3086 24450  6  3 59 33  0  <<<-----
2016-10-30 03:57:34  3 19 3456252 5449884 3348400 11489728 3291 13371  6407 17957 2997 22556  6  4 66 24  0
2016-10-30 03:58:04  7  6 4194500 5663580 3349552 10857424 2407 12240  3824 14560 2295 18237  4  2 65 29  0
2016-10-30 03:58:34  2 16 4203036 5986864 3348908 10838492 4601 16639  7219 18808 2575 21563  6  4 60 31  0
2016-10-30 03:59:04  3 14 4205652 6059196 3348760 10821448 6624 1597  9431  4357 1750 20471  6  2 60 31  0
2016-10-30 03:59:34  2 24 4206968 6053160 3348876 10777216 5221 2067 10106  7377 1731 19161  3  3 62 32  0
2016-10-30 04:00:04  0 13 4205172 6005084 3348932 10785896 6236 1609 10330  6264 1739 20348  4  2 67 26  0
2016-10-30 04:00:34  4 11 4206420 5996396 3348976 10770220 6554 1253 10382  4896 1964 42981 10  5 58 27  0
2016-10-30 04:01:04  6  4 4177176 5878852 3348988 10825840 8682  765 10126  2716 1731 32949  8  4 69 19  0

@ 2016-10-30 03:57:04, мы видим, что все еще имеется достаточное количество свободной оперативной памяти. Однако даже после этого произошла ошибка. Мы проверили дерево процессов в этот момент, и мы не увидели никакого процесса, который требовал бы такого большого объема памяти (больше, чем свободной памяти). Очевидным подозрением была ситуация 2, описанная выше. Мы проверили журналы buddyinfo и zoneinfo выше (используйте echo m> /proc /sysrq-trigger, чтобы проверить их, вывод идет в syslogs).

Для нормальной нашей системы сравнение информации о зоне идет именно так. Графики для cache /free /low mem также упоминаются ниже

 информация о зоне

 swap free low free

Глядя на информацию, ясно, что фрагментация памяти в узле 0 & node 1 normal (Node это машина на основе NUMA, следовательно, несколько узлов (см. numactl для проверки информации для вашей системы)).

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

ответил Anugraha Sinha 7 WedEurope/Moscow2016-12-07T07:54:44+03:00Europe/Moscow12bEurope/MoscowWed, 07 Dec 2016 07:54:44 +0300 2016, 07:54:44
5

Наличие более доступной памяти

Как и все, да, swap поможет вам избавиться от неиспользуемой памяти, поэтому он может помочь вам иметь больше доступной памяти.

Hibernating

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

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

упущений

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

Использование зашифрованного подкачки с гибернацией не работает из коробки со всеми дистрибутивами. Вам нужно использовать постоянный ключ шифрования (некоторые настройки произвольно генерируют ключ шифрования пространства подкачки при каждой загрузке) и initrd /initramfs для активации зашифрованного тома перед возобновлением.

ответил Huygens 10 32010vEurope/Moscow11bEurope/MoscowWed, 10 Nov 2010 23:09:57 +0300 2010, 23:09:57
4

Из Ubuntu Swap F.A.Q. , что Марсель связан с

  

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

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

ответил Jader Dias 3 +04002010-10-03T18:58:10+04:00312010bEurope/MoscowSun, 03 Oct 2010 18:58:10 +0400 2010, 18:58:10
3

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

Я говорю от мучительного личного опыта здесь.

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

Но есть недостаток: Firefox большой. Действительно большой. Это был проект типа 1.x, поэтому они не обошли такие вещи, как удаление поддержки графического интерфейса. [*] Мой сайт никому не нужен, но поскольку технология VPS, используемая моим хостинг-провайдером, t разрешить пространство подкачки, этот GUI-код и все остальные части Firefox, которые я не использовал, потребляли реальную оперативную память. В итоге мне потребовалось 512 МБ ОЗУ минимум , чтобы запустить сайт без его сбоя из-за исчерпания памяти. Если бы у моего VPS было какое-то пространство подкачки, я, вероятно, мог бы пройти с планом в 256 МБ.

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

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

ответил Warren Young 5 +04002010-10-05T20:52:09+04:00312010bEurope/MoscowTue, 05 Oct 2010 20:52:09 +0400 2010, 20:52:09
2

Я думаю, что «Жиль» уже упомянул о том, что, хотя у вас может быть более чем достаточно ОЗУ, своп может быть полезен во время определенных «недостатков», а также постоянно сохранять некоторые данные даже после выключения - или я ошибаюсь в предположении что? (так как после перезагрузки RAM сбрасывается) У меня в моей системе имеется 12 ГБ оперативной памяти, и я тоже об этом задумался. В какой-то момент, когда я отключил все свопы и полагался только на свою оперативную память, у меня были тяжело трудные переживания, пытаясь отладить системную ошибку или сбой и т. Д. После выключения системы. С тех пор я снова включил раздел подкачки.

ответил ILMostro_7 4 Jam1000000amFri, 04 Jan 2013 03:50:25 +040013 2013, 03:50:25

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132