Как полностью отключить своп?


30

Я использую sid Debian, жесткий диск, отформатированный в ext4, работающий на Linux 3.1

Я помню, в предыдущих версиях Linux (может быть, до 3.0), если у меня не хватает памяти, а подкачка не включена, программы обычно вылетают. Это идеально подходит для моей среды: простой просмотр веб-страниц без критических операций. То есть, если я случайно наткнулся на плохой веб-сайт, который использует слишком много памяти, он просто падает, не делая мой терминал непригодным для использования.

Но в моей текущей настройке компьютер зависает с высокой пропускной способностью ввода / вывода в фоновом режиме. iotop показывает, что kswapd0 является виновником, что означает, что это происходит из-за обмена. После использования, swapon -sчтобы определить любые свопы, которые были включены, я использовал, swapoff -aчтобы отключить все свопы и swapon -sснова, чтобы подтвердить, что все свопы были отключены.

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

Я делаю что-то не так, пытаясь swapoff -a? Почему поведение отличается от того, что было раньше (вероятно, до 3,0 раз)?


Это на самом деле не имеет смысла. Делать swapoff -a себя , если есть материал в свопе, будет генерировать много I / O (и может привести к процессам быть убитым , если не хватает реального RAM Availabe). Вы уверены, что это не то, swapoff -aчто вызвало "шторм" ввода / вывода?
Мат

1
Полагаю, достаточно прокомментировать fstabстроку о свопе. Попробуйте, если поведение такое же.
энзотиб

@Mat swapoff -aдолжен отключить swap навсегда, что означает, что он должен оставаться отключенным после следующей перезагрузки. Я подтвердил это. Тем не менее, "шторм" ввода / вывода все еще происходит во время сеанса после следующей перезагрузки. Для записи, "шторм" ввода / вывода не произошел в тот момент, когда я это сделал, swapoff -aпотому что своп был 0 в то время.
syockit

9
@syockit: неswapoff -a является постоянным.
Мат

1
загрузка базы данных достигла 15% за 14 часов. Отключил своп, и при следующей попытке он достиг 40% за 4 часа. по общему признанию, сервер недостаточно загружен и загружен на оперативную память, но без включенной подкачки OpenSuSE работает намного быстрее для этого одного процесса. Мнение ОС о «лучшем» и моем резко отличается во время простой загрузки базы данных mysql. закомментировал диск подкачки в / etc / fstab и перезагрузил.
TheSatinKnight

Ответы:


15

Отключение свопа не будет делать то, что вы хотите. Вы все равно получите высокую пропускную способность ввода / вывода, но это будут чистые страницы, а не грязные.

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

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

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


1
Это верно только в том случае, если вы выделяете немного памяти. Процесс запуска обычно будет пытаться выделить гораздо больше, и поэтому он будет убит на ранней стадии, освобождая эту память, в отличие от продолжения замены системы на смерть, пытаясь разместить больше выделений, следовательно, отключение подкачки может быть полезно, когда Вы только максимизируете свое использование оперативной памяти из безудержного процесса.
psusi 15.11.11

1
Недостаток памяти будет всегда выделяться. Linux специально настроен таким образом. Сделайте cat /proc/meminfoна любом типичном Linux-компьютере после нескольких часов загрузки.
Дэвид Шварц

2
@syockit Если вы отключите пейджинг, вы не сможете запускать какие-либо программы. Пейджинг - это механизм чтения файлов при отображении в память.
Дэвид Шварц

2
@psusi: чистые страницы не будут уменьшены до минимума, если у вас есть своп. Вместо этого он будет заменять грязные анонимные страницы, которые недавно не использовались. Конечно, в любом случае вы в конечном итоге получите сильные удары, если рабочий набор превысит физическую память. Дело в том, что со свопом или без него вы получите много сильных ударов, прежде чем у вас действительно кончится память. Разница в том, что при обмене насильственный переворот будет меняться (грязные страницы, писать и читать). Без свопинга насильственное избиение будет являться ошибками кода (чистые страницы, только для чтения).
Дэвид Шварц

2
@psusi: Вы правы, если проблема заключается в безудержном процессе, который быстро увеличивает потребление памяти. Но это не то, о чем говорит OP, это процесс, который потребляет чрезмерную, но не неограниченную или чрезмерно избыточную память. По мере того, как он растет через большое «сладкое пятно» (там, где кеш сжат), он будет расти все медленнее по мере того, как система будет работать.
Дэвид Шварц

13

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

(ulimit -d 400000; firefox) &

Число после -d в килобайтах. Вы должны поэкспериментировать с этим в своей системе, чтобы выбрать лучшее значение для ваших привычек просмотра. Скобки приводят к созданию подоболочки; команда ulimit влияет только на эту оболочку и ее дочерние элементы, изолируя ее эффекты от родительской оболочки.


Будет ли это работать для хрома, скажем, где у нас есть куча chromiumпроцессов, использующих небольшие куски памяти?
jberryman

@jberryman Нет, ограничения памяти для каждого процесса, а не для пользователя.
Кайл Джонс

Есть ли способ отправить ему указанный сигнал (например, SIGHUP), когда он достигнет предела памяти?
Джеремия

1
@ Geremia Нет. Системные вызовы brk и sbrk перестают работать, из-за чего большинство вещей сворачивается и умирает.
Кайл Джонс

Если вы хотите выполнить ручную настройку, я бы предложил использовать cgroup памяти вместо ulimit, поскольку с cgroup памяти вы можете установить ограничение для всей группы процессов и настроить остановку процесса выделения памяти, а процесс политики режима пользователя может решить, что делать. сделать (например, отправить несколько сигналов, выбрать процесс, который нужно убить, увеличить лимит памяти на лету). Подробности смотрите в kernel.org/doc/Documentation/cgroup-v1/memory.txt и kernel.org/doc/Documentation/cgroup-v2.txt .
Микко Ранталайнен

4

Чтобы убедиться, что подкачка не используется, лучше не допускать добавления подкачки при загрузке. Это может быть сделано, в зависимости от системы, отключив swapслужбу загрузки или просто закомментировать запись в своп /etc/fstab.

Что касается вашего зависания, stop()функция in /etc/init.d/swapможет дать подсказку:

stop()
{
       ebegin "Deactivating swap devices"

       # Try to unmount all tmpfs filesystems not in use, else a deadlock may
       # occure. As $RC_SVCDIR may also be tmpfs we cd to it to lock it
       cd "$RC_SVCDIR"
       umount -a -t tmpfs 2>/dev/null

       case "$RC_UNAME" in
               NetBSD|OpenBSD) swapctl -U -t noblk >/dev/null;;
               *)              swapoff -a >/dev/null;;
       esac
       eend 0
}

Обратите внимание на часть о тупике . Вы можете попробовать сделать umount -a -t tmpfsсебя, прежде чем выключить своп.


Редактировать:

Возможно, вы также можете достичь своей цели, изменив sysctlнастройки (см. Этот вопрос ).


Я не имею swapв init.d, ни у меня его fstab, но у меня есть , /etc/init.d/mountoverflowtmpчто крепления tmpfsдля записи аварийного журнала. Демон свопа tmpfsтоже использует ?
syockit

Вы могли бы включить его в другом месте - сделайте, grep -RF swap /etc/если хотите найти его. Но чтобы отключить службу, вы должны использовать такую ​​команду service(IIRC; я не использую Debian сам).
rozcietrzewiacz

1
Сам своп не использует tmpfs , потому что tmpfsэто файловая система в оперативной памяти (RAM). Но другие службы / программы, которые используют, tmpfsмогут полагаться на своп в особом порядке. Я действительно не знаю, но это может быть связано с кэшированием или особым способом, которым tmpfsдрайвер запрашивает доступ к пространству подкачки.
rozcietrzewiacz

Есть кое-что о том, как Linux обрабатывает виртуальную память, я не понимаю. Я отключил своп в большинстве возможных способов: через swapoffи через vm.swappiness=0. Пока kswapd0еще бежит! Интересно, регрессия ли это за 2,4 дня…
syockit 15.11.11

5
@syockit Это ожидаемое поведение. Система по-прежнему обменивается чистыми страницами (страницами, которые содержат копии файловых данных). Для обмена чистыми страницами не требуется пространства подкачки, поскольку их можно прочитать из источников, отличных от swap.
Дэвид Шварц

2

Лучше закомментировать запись раздела подкачки, /etc/fstabчем запускать swapoff -aпосле каждой загрузки.

У меня та же проблема с kswapd0 на моем оборудовании.

Настройка vm.swappinessпараметров системы мне не помогает.

sysctl -w vm.swappiness=0

Я погуглил и прочитал много постов, списков рассылки, и теперь я думаю, что это ошибка ядра.

Когда нет активного раздела подкачки и свободная память становится меньше некоторого порога (в моем случае около 300 МБ), система перестает отвечать из-за безумия kswapd0.

Вероятно, это воспроизводится с особой конфигурацией и условиями.

Для кого-то это решается переустановкой системы с переразметкой для других путем создания собственного ядра с kswapd0отключенным.


2
Если kswapd0сходит с ума и у вас не активирован своп, значит, вам не хватает оперативной памяти. Вы можете выбрать OOM Killer или kswapd0. Linux идет kswapd0дальше, потому что ядро ​​предполагает, что более важно закончить медленно, чем прервать процесс. Для случайных людей порог, в котором ядро ​​думает, что достаточное продвижение вперед все же происходит, уже ледниково медленный, и почти любой предпочел бы выбрать OOM Killer.
Микко Ранталайнен

1

В моей системе (Debian SID 2016-11-15) я сделал это:

  1. отключите своп сейчас:

    swapoff -a
    
  2. закомментируйте строку с разделом подкачки в / etc / fstab

    #### #UUID=c6ddbc95-3bb5-49e1-ab25-b1c505e5360c none            swap    sw              0       0
    
  3. отключить монтирование swap в systemd:

    systemctl --type swap
    systemctl stop dev-sda6.swap
    systemctl mask dev-sda6.swap
    

Было бы достаточно. В /etc/initramfs-tools/conf.d/resumeфайле есть ссылка на своп . Я не знаю, какова цель этого. Может быть, этот файл будет проблемой при следующей перезагрузке (пока я не пытаюсь перезагрузиться, мое время работы драгоценно;)).


1

компьютер зависает с высокой пропускной способностью ввода / вывода в фоновом режиме. iotop показывает, что kswapd0 является виновником

Я нашел один способ (пока), чтобы избежать этого. Если вы хотите протестировать его и посмотреть, как он работает в вашей системе, посмотрите исправление ядра внутри этого вопроса . По сути, он не высвобождает Active(file)страницы (по крайней мере), когда находится под давлением памяти, таким образом, перебрасывание диска (постоянное чтение) сводится практически к нулю, и OOM-killer разрешается запускаться в течение 1 секунды, вместо того, чтобы заморозить ОС для того, что кажется как навсегда (или хотя бы на много минут). Я надеюсь, что настоящие программисты (из которых я не являюсь) улучшат патч и превратят его в реальное решение, теперь, когда они видят, что он работает для этих ситуаций.


этот патч ядра уже включен?
человечествоANDpeace

@humanityANDpeace, вероятно, нет, потому что это не так хорошо (так как я не программист), однако у меня возникли некоторые проблемы с ним, такие как: иногда, в зависимости от рабочей нагрузки, с этим патчем вы можете исчерпать память в случаях в котором без этого патча у вас не было бы и, следовательно, OOM-killer убил бы Xorg и xfwm4, ЕСЛИ Я запускаю, echo 1 | sudo tee /proc/sys/vm/drop_cachesкогда Active(file):(of / proc / meminfo) превышает 2 ГБ (в 16-ГБ ОЗУ) - это может доходить до 4 ГБ
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.